单片机课程设计-自动交通管理系统
(调节滑动变阻器使得电压大于3V时模拟撞红灯,LED亮)
7.硬件总接线图 见附录
- 16 -
单片机课程设计-自动交通管理系统
三、 软件设计
3.1 程序流程图
系统初始化 水平方向绿灯25秒 垂直方向红灯25秒 是 LED警报 垂直方向撞红灯? 否 水平方向黄灯5秒 垂直方向红灯5秒 是 LED警报 否 否 水平方向红灯25秒 垂直方向绿灯25秒 是 垂直方向撞红灯? LED警报 水平方向撞红灯? 否 水平方向红灯5秒 垂直方向黄灯灯5秒 LED警报 是 水平方向撞红灯?
- 17 -
单片机课程设计-自动交通管理系统
3.2初值计算
本程序中,初值定为25ms,12M,故T0的初值为:
TH0=0x9e TL0=0x58
计数器计算公式:
T=(M-TC)T计数 或TC=M-T/T计数
T计数是单片机时钟周期TCLK的12倍;TC为定时初值 如单片机的主脉冲频率为TCLK12MHZ ,经过12分频 方式0 TMAX=213 *1微秒=8.192毫秒 方式1 TMAX=216 *1微秒=65.536毫秒
显然1秒钟已经超过了计数器的最大定时间,所以我们只有采用定时器和软件相结合的办法才能解决这个问题.
3.2.1相应程序代码
(1)主程序 /*主函数*/ void main(void) { char i; init();//初始化 while(1) { dx_R=1;dx_Y=0;dx_G=0; nb_R=0;nb_Y=0;nb_G=1; for(i=N;i>0;i--) { deal(i); } dx_R=1;dx_Y=0;dx_G=0; nb_R=0;nb_Y=1;nb_G=0; N=5; for(i=N;i>0;i--)
- 18 -
单片机课程设计-自动交通管理系统
{ deal(i); } dx_R=0;dx_Y=0;dx_G=1; nb_R=1;nb_Y=0;nb_G=0; N=25; for(i=N;i>0;i--) { deal(i); } dx_R=0;dx_Y=1;dx_G=0; nb_R=1;nb_Y=0;nb_G=0; N=5; for(i=N;i>0;i--) { deal(i); } // if(ADC_0832()>153)beep=0;else beep=1;//如果采集到的模拟量数值大于3V也就是153/255x5=3 } }
(2)中断服务子程序
void timer0() interrupt 1 using 0 //T0定时 定时25ms { TH0=0x9e; TL0=0x58; time++; if(time==20) { if(ADC_0832()>153)beep=0;else beep=1;//0.5s扫描一次是不是大于3 time=0; } if(!button)_red();//每25ms扫描一次是不是有按键按下 }
(3)紧急按钮程序
void _red(void)//当手按下后 红灯亮10s;
- 19 -
单片机课程设计-自动交通管理系统
{ char i,t; N=10; dx_R=1;dx_Y=0;dx_G=0; nb_R=1;nb_Y=0;nb_G=0; for(i=N;i>0;i--)//消振; { t=60; while(t--)display(i); } }
(4)显示模块
void display(char dat) { led_A=led_B=0; P2=0XFF;//初始点亮两块LED P2=~tab_disp[dat/10];//求LEDA上显示计时的十位数 if(dat/10)led_A=1; delay(1000); P2=0XFF;led_A=led_B=0; P2=~tab_disp[dat];//LEDB上显示计时的个位数 led_B=1; delay(1000);
四、 运行调试
仿真成功。功能实现。
- 20 -