1、基于单片机的交通灯设计基于at89c51的交通灯设计该设计的功能有交通灯倒计时,红绿黄显示,手动控制,日历显示(初始值为11月20日7时01分)。要做实验设计的拿去用吧,设计思路什么的就自己写。原创 东北大学秦皇岛分校交通灯程序:#include#define uchar unsigned char/宏定义uchar#define uint unsigned int/宏定义uintsbit RED_DONGXI = P10;/南北方向红灯亮sbit YELLOW_DONGXI = P11;/南北方向黄灯亮sbit RED_NANBEI = P13;/东西方向红灯亮sbit GREEN_DONG
2、XI = P12;/南北方向绿灯亮sbit YELLOW_NANBEI = P14;/东西方向黄灯亮sbit GREEN_NANBEI = P15;/东西方向绿灯亮sbit DXweixuan1 = P16;/南北方向数码管位选1sbit DXweixuan2 = P17;/南北方向数码管位选2sbit NBweixuan1 = P30;/东西方向数码管位选1sbit NBweixuan2 = P31;/东西方向数码管位选2sbit L1=P35; sbit L2=P36;sbit L3=P37; /数码管显示位月、日、时、分选控制端uint aa, bai,shi,ge,bb; uint s
3、hi1,ge1,shi2,ge2,minute=00,hour=07,day=20,month=11;/月日时分初始值设定uint month1,month2,day1,day2,hour1,hour2,minute1,minute2;/定义变量/*数码管显示0-9*/uint code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uint code table1=0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6;/*子函数声明*/void delay(uint z);void
4、 delay0(uint z);void init(uint a);void display(uint shi1,uint ge1,uint shi2,uint ge2);void xtimer0();void init1();void init2();void init3();void init4();void init5();void init6();void display1();/* 主函数*/void main() P0=0xFF; P1=0xFF; P2=0x00; P3=0xFF; EA=1; /打开外部中断 EX0=1; /允许外部中断0中断 IT0=0; EX1=1; /允许
5、外部中断1中断 IT1=0; display1(); /INT0为沿触发方式 init1(); /第1个位状态 while(1) init6(); /第6个状态 init2(); /第2个状态 init3(); /第3个状态 init4(); /第4个状态 init5(); /第5个状态 void init1()/预备状态东、西、南、北方向均亮红灯3S uint temp; temp=3; /变量赋初值 TMOD=0x01; /定时器0工作于方式1 TH0=(65535-50000)/256; TL0=(65535-50000)%256; /定时器赋初值 EA=1; /开外部中断 ET0=1;
6、 /开定时中断 TR0=1; /开定时器0 while(1) RED_DONGXI=0; RED_NANBEI=0; GREEN_DONGXI=1; GREEN_NANBEI=1; YELLOW_DONGXI=1; YELLOW_NANBEI=1; if(aa=20) /定时20*50MS=1S aa=0; /定时完成一次后清0 temp-; /变量自减 shi1=shi2=temp/10; /显示十位 ge1=ge2=temp%10; /显示个位 if(temp=0) temp=5; /变量赋值为5 break; display(ge1,shi1,ge2,shi2); /显示红绿灯显示剩余时
7、间 display1() ; /显示年、月、日 void init2() /第二个状态:东西亮红灯30S5S、南北亮绿灯250S; uint temp; temp=26; /变量赋初值 TMOD=0x01; /定时器0工作于方式1 TH0=(65535-50000)/256; TL0=(65535-50000)%256; /定时器赋初值 EA=1; /开外部中断 ET0=1; /开定时中断 TR0=1; /开定时器0 while(1) RED_DONGXI=1; RED_NANBEI=0; GREEN_DONGXI=0; GREEN_NANBEI=1; YELLOW_DONGXI=1; YEL
8、LOW_NANBEI=1; if(aa=20) /定时20*50MS=1S aa=0; /定时完成一次后清0 temp-; /变量自增 shi1=(temp+5)/10; /显示十位 ge1=(temp+5)%10; /显示个位 shi2=temp/10; ge2=temp%10; if(temp=0) /定时25S temp=26; /变量清0 break; display(ge1,shi1,ge2,shi2); display1(); void init3() /第三个状态:南北绿灯变为黄灯闪5s、东西方向亮红灯5S uint temp; temp=6; /变量赋初值 TMOD=0x01;
9、 /定时器0工作于方式1 TH0=(65535-50000)/256; TL0=(65535-50000)%256; /定时器赋初值 EA=1; /开外部中断 ET0=1; /开定时中断 TR0=1; /开定时器0 while(1) RED_NANBEI=0; GREEN_DONGXI=1; if(aa=20) /定时20*50MS=1S aa=0; /定时完成一次后清0 temp-; /变量自增 YELLOW_DONGXI=YELLOW_DONGXI; shi1=temp/10; shi2=shi1; /显示十位 ge1=temp%10; ge2=ge1; /显示个位 if(temp=0)
10、/定时5S temp=6; /变量赋值 break; display(ge1,shi1,ge2,shi2); display1(); void init4()/第四个状态:东西亮绿灯250S,南北方向亮红灯305S; uint temp; temp=26; /变量赋初值 TMOD=0x01; /定时器0工作于方式1 TH0=(65535-50000)/256; TL0=(65535-50000)%256; /定时器赋初值 EA=1; /开外部中断 ET0=1; /开定时中断 TR0=1; /开定时器0 while(1) RED_DONGXI=0; RED_NANBEI=1; YELLOW_DO
11、NGXI=1; GREEN_NANBEI=0; if(aa=20) /定时20*50MS=1S aa=0; /定时完成一次后清0 temp-; /变量自增 shi1=temp/10; shi2=(temp+5)/10; /显示十位 ge1=temp%10; ge2=(temp+5)%10; /显示个位 if(temp=0) /定时25S temp=26; /变量清0 break; display(ge1,shi1,ge2,shi2); display1(); void init5()/第五个状态:东西闪黄灯50s、南北红灯5S uint temp; temp=6; /变量赋初值 TMOD=0x
12、01; /定时器0工作于方式1 TH0=(65535-50000)/256; TL0=(65535-50000)%256; /定时器赋初值 EA=1; /开外部中断 ET0=1; /开定时中断 TR0=1; /开定时器0 while(1) RED_NANBEI=1; RED_DONGXI=0; GREEN_DONGXI=1; GREEN_NANBEI=1; if(aa=20) /定时20*50MS=1S aa=0; /定时完成一次后清0 temp-; /变量自增 YELLOW_NANBEI=YELLOW_NANBEI; shi1=temp/10; shi2=shi2; /显示十位 ge1=te
13、mp%10; ge2=ge1; /显示个位 if(temp=0) /定时100S temp=6; /变量清0 break; display(ge1,shi1,ge2,shi2); display1(); void init6() /显示年、月、日 minute+; month1=month/10; month2=month%10; day1=day/10; day2=day%10; hour1=hour/10; hour2=hour%10; minute1=minute/10; minute2=minute%10; if(minute=60) hour+; if(hour=24) day+;
14、if(day=30) month+; /*显示子函数*/void display1() L1=0,L2=0,L3=0; P2=table1month1;delay0(2); L1=1,L2=0,L3=0; P2=table1month2;delay0(2); L1=0,L2=1,L3=0; P2=table1day1;delay0(2); L1=1,L2=1,L3=0; P2=table1day2;delay0(2); L1=0,L2=0,L3=1; P2=table1hour1;delay0(2); L1=1,L2=0,L3=1; P2=table1hour2;delay0(2); L1=0
15、,L2=1,L3=1; P2=table1minute1;delay0(2); L1=1,L2=1,L3=1; P2=table1minute2;delay0(2); void display(uint shi1,uint ge1,uint shi2,uint ge2) DXweixuan1=0; DXweixuan2=1; NBweixuan1=1; NBweixuan2=1; P0=tablege1; /显示十位 delay0(5); DXweixuan1=1; DXweixuan2=0; NBweixuan1=1; NBweixuan2=1; P0=tableshi1; /显示个位 de
16、lay0(5); DXweixuan1=1; DXweixuan2=1; NBweixuan1=0; NBweixuan2=1; P0=tablege2; /显十位 delay0(5); DXweixuan1=1; DXweixuan2=1; NBweixuan1=1; NBweixuan2=0; P0=tableshi2; /显示个位 delay0(5);void xint0() interrupt 0 /外部中断0 RED_NANBEI=0; RED_DONGXI=0; GREEN_NANBEI=1; GREEN_DONGXI=1; YELLOW_NANBEI=1; YELLOW_DONG
17、XI=1; P0=0x00; NBweixuan1=0; NBweixuan2=0; DXweixuan1=0; DXweixuan2=0; display1(); return ;void xint1() interrupt 2 /外部中断1 RED_NANBEI=1; RED_DONGXI=1; GREEN_NANBEI=0; GREEN_DONGXI=0; YELLOW_NANBEI=1; YELLOW_DONGXI=1; P0=0x00; NBweixuan1=0; NBweixuan2=0; DXweixuan1=0; DXweixuan2=0; display1(); return ;/*定时中断子函数*/void xtimer0() interrupt 1 TH0=(65535-50000)/256; TL0=(65535-50000)%256; aa+;/*延时子函数*/void delay0(uint z)uint i,j; for(i=0;iz;i+) for(j=0;j0;j-) for(i=1250;i0;i-) for(k=180;k0;k-);
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2