交通灯单片机Word格式文档下载.docx
- 文档编号:22191322
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:17
- 大小:136.73KB
交通灯单片机Word格式文档下载.docx
《交通灯单片机Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《交通灯单片机Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
指导教师评语:
设计题目:
基于单片机的交通灯控制器设计
一、要求
交通灯控制器可通过利用D板的元器件,stc12c5608ad单片机,CH452,共阴极数码管,按键,LED灯显示电路(外扩)可完成。
二、分析
中华人民共和国道路交通安全法实施条例第三十八条,机动车信号灯和非机动车信号灯表示:
绿灯亮时,准许车辆通行,但转弯的车辆不得妨碍被放行的直行车辆、行人通行;
黄灯亮时,已越过停止线的车辆可以继续通行;
红灯亮时,禁止车辆通行。
本设计通过红黄绿灯显示。
初始状态时,主次干道都显示红灯,按按键1后开始按照下表所示执行
序号
灯的颜色时间(s)
说明:
依次循环
1
红31
绿26
2
黄5
3
4
按下键1,中断实现。
功能:
出现紧急情况时,需要让交通道路紧急停止。
按下键1时,数码管显示停止,并且主次干道分别显示红红,交通情况处于停滞状态。
再按一下键1,则交通灯从原始状态开始执行。
按按键2时,显示SOS,求助信号,再按一下保持刚才状态继续执行。
三、设计
1、硬件设计(包括设计方案及说明、完整的硬件连接图等)
交通灯控制系统可用单片机直接控制信号灯的状态变化,又接入数码管就可以显示倒计时以提醒驾驶者,更具人性化。
增加按键中断,可以对紧急事件进行控制。
单片机电路主要完成的任务是控制红绿灯的规律转换,数码管显示和中断延时控制。
整个系统由单片机电路、数码管倒计时显示电路、LED红绿灯、中断按键、电源和串口通讯等部分构成。
系统硬件框图如图所示。
图1系统硬件框图
由于本系统的设计是在D版基础上进行的扩展,所以只需扩展电阻,发光二极管即可。
图2D版的原理图
图3外扩电路
2、软件编程
一、紧急电路设计
N
Y
Y
图4紧急电路设计
二、第二扩展程序
三、交通灯总程序
#include<
reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitDOUT=P2^1;
sbitLOAD=P2^0;
sbitDIN=P2^2;
sbitDCLK=P2^3;
sbitAA=P2^6;
//蜂鸣器变量
sbita1=P1^0;
//g绿
sbita2=P1^1;
//y黄
sbita3=P1^2;
//r红
sbitb1=P1^3;
sbitb2=P1^4;
sbitb3=P1^5;
//r红灯低电平有效
#defineTim0_H(65536-18432)/256//定时器0初值,高8位(10ms)
#defineTim0_L(65536-18432)%256//定时器0初值,低8位(10ms)
unsignedcharTim0_Counter=0;
unsignedcharT_Second=0;
volatileunsignedcharT_Zhu=31;
//易变的变量主干道
volatileunsignedcharT_Ci=26;
//次干道
unsignedintcodedisplay[8]={0x0800,0x0900,0x0a00,0x0b00,0x0c00,0x0d00,0x0f00,0x0e00};
//定义了8位数组
unsignedcharcodeBCD[16]={0xbe,0x24,0xea,0xe6,0x74,0xd6,0xde,0xa4,0xfe,0xf6,0x40,0xD6,0x00,0xf0,0x9a,0xd8};
//显示的符号
//0123456789//-s黑oCF
unsignedcharkey=0;
bitFlash_Flag=1;
//刷新显示标志
unsignedintnum;
//按键值
bitchoice=1;
voidCH451_Write(uintdat)//CH452显示子程序
{
uinti;
LOAD=1;
for(i=12;
i>
0;
i--)
{
DCLK=0;
if((dat&
0x01)==0x01)
DIN=1;
elseDIN=0;
DCLK=1;
dat=dat>
>
1;
}
LOAD=0;
}
//*******初始化***************************************//
voidCH451_Init(void)//初始化
DIN=0;
CH451_Write(0x201);
CH451_Write(0x403);
CH451_Write(0x50f);
/*-----------------定时器初始化函数----------------------*/
voidTimer_Init(void)
TMOD=0x01;
//定时器工作方式1:
16位只要TRX为1,即可计数
TH0=Tim0_H;
//定时器装入初值
TL0=Tim0_L;
ET0=1;
ET1=1;
EA=1;
/*----------------键值获得子程序-------------------------*/
voidgetkey(void)//获得键值
{
uchari;
ucharcommand,keycode;
command=0x07;
for(i=0;
i<
4;
i++)
{
DIN=command&
command>
=1;
keycode=0;
7;
keycode<
<
keycode|=DOUT;
key=keycode;
/*****************按键功能**********************/
voidKey1_Program(void)
{
TR0=~TR0;
//关中断
if(TR0==0)
a3=0;
b3=0;
a2=1;
a1=1;
b2=1;
b1=1;
//主次是红红
if(TR0==1)//重新开始运行
a1=1;
b3=1;
//主干道红亮
b1=0;
//次干道绿亮
Tim0_Counter=0;
T_Second=0;
T_Zhu=31;
T_Ci=26;
Flash_Flag=1;
}
voidKey2_Program(void)//按键2功能
TR0=~TR0;
AA=~AA;
CH451_Write(display[0]+BCD[11]);
CH451_Write(display[1]+BCD[0]);
CH451_Write(display[2]+BCD[11]);
CH451_Write(display[3]+BCD[12]);
CH451_Write(display[4]+BCD[12]);
CH451_Write(display[5]+BCD[12]);
voidKey3_Program(void)//按键3功能
{;
voidKey4_Program(void)//按键4功能
voidNone(void)
{;
codevoid(*Key_Answer[])(void)=
None,
Key1_Program,
Key2_Program,
Key3_Program,
Key4_Program
};
/****************************************/
unsignedcharGet_KeyNum(void)
switch(key)
case0x40:
num=1;
break;
//按下第1个键
case0x41:
num=2;
//按下第2个键
case0x42:
num=3;
//按下第3个键
case0x43:
num=4;
//按下第4个键
default:
num=0;
}
returnnum;
voiddispose_Reveal(unsignedcharTZhu,unsignedcharTCi)
unsignedcharone,ten,hundred,thousand;
thousand=TZhu/10;
hundred=TZhu%10;
ten=TCi/10;
one=TCi%10;
CH451_Write(display[0]+BCD[one]);
//显示次干道的个位
CH451_Write(display[1]+BCD[ten]);
//显示次干道的十位
CH451_Write(display[4]+BCD[hundred]);
//显示主干道的个位
CH451_Write(display[5]+BCD[thousand]);
//显示主干道的十位
CH451_Write(display[2]+BCD[10]);
//-
CH451_Write(display[3]+BCD[10]);
/*-----------------定时器中断服务程序----------------------*/
voidTimer0(void)interrupt1
Tim0_Counter++;
if(Tim0_Counter==100)//计数计到100
T_Second++;
T_Zhu--;
//从31开始减
T_Ci--;
//从26开始//执行循环第一步红绿
if(T_Second==26)
{
T_Ci=5;
//执行循环第二步红黄
b1=1;
b2=0;
}
elseif(T_Second==31)
T_Zhu=26;
//执行循环第三步绿红
T_Ci=31;
a3=1;
b2=1;
a1=0;
b3=0;
elseif(T_Second==57)//执行循环第四步黄红
T_Zhu=5;
a1=1;
a2=0;
elseif(T_Second==62)//跳回初始值
T_Zhu=31;
T_Ci=26;
T_Second=0;
a2=1;
b3=1;
a3=0;
b1=0;
/*-----------------主函数----------------------*/
//**********themainfunction******************
voidmain(void)
CH451_Init();
//初始化
Timer_Init();
AA=1;
a3=0;
b3=0;
//次干道红亮
while
(1)//单片机死循环
if(!
DOUT)//DOUT=P2^2=0
getkey();
(*Key_Answer[Get_KeyNum()])();
if(Flash_Flag)
Flash_Flag=0;
dispose_Reveal(T_Zhu,T_Ci);
3、调试说明
下载完程序后,给电后显现红红警示状态;
按按键1,开始运行,遵循循环原则;
再按按键1,出现红绿特殊情况,保障主干道畅通;
再按按键1,回到31、26的原始状态运行。
按按键2,显示屏出现SOS,蜂鸣器开始鸣笛;
再按按键2,回到按键前工作。
4、设计结果及错误分析
程序调试中出现的问题:
1、数码管显示乱码在显示SOS的时候有乱码
2、显示管时间跳动太慢(下载选择错误)
3、实现功能时不能完全实现
解决方法:
1、参考CH452学习资料,重新设定值
2、在下载时选“外部晶振或时钟”
3、耐心花时间改程序
经过调试,系统能够实现预期功能
四、总结
此次课程设计完成了具有中断紧急通车,数码管倒计时显示,车辆通行功能、SOS的交通智能控制系统。
而且在理论基础之上,又进行了软件汇编程序设计和实物焊接制作。
实物与计算机连接,USB接口提供直流电,利用软件将程序在线下载到单片机中。
通过观察实物的运行状态,修改软件程序,不断调试,从而完善了实物的交通灯系统设计。
从总体来说,基本上完成了课题的要求。
本设计中实物所呈现的交通灯状态清晰明了,倒计时显示醒目易懂,紧急通车模式对现实中的重大事故处理有一定的保护意义。
SOS模式适合于偏僻地区,SOS比较醒目,从而提醒驾驶车辆。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 交通灯 单片机