|
本系统采用STC89C52单片机以及单片机最小系统和三极管驱动电路以及外围的按键和数码管显示等部件,设计一个基于单片机的交通灯设计。设计通过两位一体共阴极数码管显示,并能通过按键对定时进行设置。
本系统实用性强、操作简单,外围的按键和数码管显示等部件,数码管倒计时显示时间。
原理图
主要代码:
- /*显示子函数*/
- void display(char dat)
- {
- led_A=led_B=0; //先位灭显
- P2=0XFF; //再段灭显
- P2=tab_disp[dat/10]; //赋显示的数
- if(dat/10)led_A=1;
- delay(1000); //延时
-
- P2=0XFF;led_A=led_B=0; //段灭显 位灭显
- P2=tab_disp[dat%10]; //赋显示的数
- led_B=1;
- delay(1000); //延时
- }
- //这个是循环显示60遍显示的函数
- void deal(char m)
- {
- int t=60;
- while(t--)display(m); //循环显示60遍显示的函数
- }
- void KEY() //按键函数
- {
- unsigned char save; //定义保存灯状态的变量
- if(key_stop==0) //按键是否按下
- {
- delay(20); //延时去抖
- if(key_stop==0) //再次判断按键是否按下
- {
- flag=1; //紧急状态标志位置1,进入紧急通行状态
- save=P0; //保存灯的状态
- P0=0x84; //全部亮红灯
- while(key_stop==0); //按键释放,当按键一直按下的时候,程序就会一直执行这里,直到按键按下
- while(flag==1) //如果是紧急状态就一直执行下面的程序
- {
- if(key_stop==0) //在紧急状态时判断按键是否按下
- {
- delay(50); //延时去抖
- if(key_stop==0) //再次判断按键是否按下
- {
- flag=0; //紧急状态标志位清零,退出紧急状态
- P0=save; //LED灯恢复到之前状态
- while(key_stop==0); //按键释放
- }
- }
- }
- }
- }
- }
- /*主函数*/
- void main(void)
- {
- char i;
- EA=1; //全局中断开关
- IT1=1; //外部中断下降沿有效
- EX1=1;
- while(1)
- {
- N=25; //初始时间是25
- dx_R=1;dx_Y=0;dx_G=0; //指示灯0是亮,1是灭
- nb_R=0;nb_Y=0;nb_G=1; //指示灯0是亮,1是灭
- for(i=N;i>0;i--) //一秒一秒的减
- {
- deal(i);
- KEY();
- }
-
- dx_R=1;dx_Y=0;dx_G=0; //指示灯0是亮,1是灭
- nb_R=0;nb_Y=1;nb_G=0; //指示灯0是亮,1是灭
- N=5; //时间变成5
- for(i=N;i>0;i--) //一秒一秒的减
- {
- deal(i);
- KEY();
- }
-
- dx_R=0;dx_Y=0;dx_G=1; //指示灯0是亮,1是灭
- nb_R=1;nb_Y=0;nb_G=0; //指示灯0是亮,1是灭
- N=25; //时间变成25
- for(i=N;i>0;i--) //一秒一秒的减
- {
- deal(i);
- KEY();
- }
- dx_R=0;dx_Y=1;dx_G=0; //指示灯0是亮,1是灭
- nb_R=1;nb_Y=0;nb_G=0; //指示灯0是亮,1是灭
- N=5; //时间变成5
- for(i=N;i>0;i--) //一秒一秒的减
- {
- deal(i);
- KEY();
- }
- }
- }
复制代码
|
-
-
1-程序.zip
32.62 KB, 下载次数: 14, 下载积分: 黑币 -5
源代码
|