【课程设计】信号交通灯

tech2022-10-28  107

一、设计内容 设计一个交通信号灯,具体要求为: (1)初始状态为两个方向的红灯全亮,时间6秒; (2)主干道绿灯亮,支干道红灯亮,主干道通车,时间为20秒; (3)主干道黄灯闪烁,支干道红灯亮,时间为6秒; (4)主干道红灯亮,支干道绿灯亮,支干道通车,时间为15秒; (5)主干道红灯亮,支干道黄灯闪烁,时间为6秒; (6)循环显示。 二、设计原理 让12个led灯按照每三个排列在四个方向,分别表示主干道和支干道,然后用单片机的P0口的2,3,4,5,6,7引脚控制LED灯,输入高电平即可点亮led灯,用P0口的0,1引脚控制共阳极数码管的段选,采用的是两个7段数码管一起的,一共有10个引脚,剩余的8个引脚用单片机的P2口进行控制,设置初始状态为六个红灯同时亮,时间为6秒,进入到设置的循环中去;其中有复位电路和紧急中断电路,当复位电路的按键被按下的时候,数码管和led灯结束当前的状态,回到设置的初始状态,然后继续进行循环。当紧急中断电路的按键被按下的时候,六个红灯同时亮起,数码管不显示,并保存中断前的状态,当中断按键再次被按下的时候,数码管和led灯回到保存的状态,继续进行下去。

#include<reg51.h> //我们对51单片机编程,要引用头函数 sbit led_A=P0^0; //数码管位 sbit led_B=P0^1; //数码管位 //***************led指示灯引脚定义*****************// sbit dx_R=P0^2; sbit dx_Y=P0^3; sbit dx_G=P0^4; sbit nb_R=P0^7; sbit nb_Y=P0^6; sbit nb_G=P0^5; bit flag=0; sbit key_stop=P3^3; char N=20; //初始时间是20 char tab_disp[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极码表 /*延时子函数*/ void delay(int t ){while(t--);} /*显示子函数*/ 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 = 6;//初始时间是6 dx_R = 1; dx_Y = 0; dx_G = 0; nb_R = 1; nb_Y = 0; nb_G = 0; for(i=N;i>0;i--) //一秒一秒的减 { deal(i); KEY(); } N=20; //时间变20 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=6; //时间变成6 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=15; //时间变成15 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=6; //时间变成6 for(i=N;i>0;i--) //一秒一秒的减 { deal(i); KEY(); } }
最新回复(0)