
交通灯小设计123354.docx
8页交通灯设计这是原理图我录制了视频,完成的作品效果还可以,想看的话请链接 uint unsigned int#define uchar unsigned charsbit led11=P3^3;//南北红sbit led12=P3^6;//南北黄sbit led13=P3^0;//南北绿sbit led21=P3^5;//东西红sbit led22=P3^7;//东西黄sbit led23=P3^1;//东西绿sbit suo1=P2^0;//两个锁存器的锁存端定义sbit suo2=P2^1;sbit beep=P2^7;sbit key1=P2^6;sbit key2=P2^5;sbit key3=P2^4;sbit key4=P2^3;uchar aa,flag,shi,ge,shi1,ge1,num0;char temp,temp1,temp2,num1,num2;uchar count=0;uchar code table[]={0xed,0x88,0xd5,0xd9,0xb8,0x79,0x7d,0xc8,0xfd,0xf9};//自己编制的数码管显示对应16进制代码void display(void);void delay(uint z);void init();void keyscan();void zhongduan(){ EX0=1;//开外部中断0 //IT0=1; //TCON=0x01;}void main(){ init();//初始化子程序 zhongduan(); temp=30; temp1=27; led21=0; while(1) { if(count==20)//计数器的函数式用于自减并且控制数码管的数字显示。
{ count=0; if(flag==0) { led11=1;//南北红灯亮 led23=1;//东西绿灯亮 temp--; temp1--; if(temp==3) { temp1=3; temp=3; flag=1; led22=0;//东西黄灯灭 led23=0;//东西绿灯灭 } } else if(flag==1) { temp--; temp1--; led11=1;//南北红灯亮 led22=1;//东西黄灯闪 //delay(310); //led22=0; //delay(310); if(temp==0) { temp=num1-3; temp1=num1; flag=2; led11=0;//南北红灯灭 led22=0; led21=1;//东西红灯亮 } } else if(flag==2) { led13=1;//南北绿灯亮 led21=1;//东西红灯亮 temp--; temp1--; if(temp1==3) { temp1=3; temp=3; flag=3; led13=0;//南北绿灯灭 } } else if(flag==3)//黄灯亮 { temp--; temp1--; led21=1;//东西红灯亮 led12=1;//南北黄灯闪 //delay(310); //led12=0; //delay(310); if(temp==0) { temp=num1; temp1=num1-3; flag=0; led12=0; led21=0;//东西红灯灭 } } } }}void delay(uint z){ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}void display(void)//三位的显示方法{ shi=(uchar)temp/10; ge=(uchar)temp%10; shi1=(uchar)temp1/10; ge1=(uchar)temp1%10; suo2=1;//开锁存器2送东西方向的数码管代码 P1=table[shi1]; P0=0xf7; delay(2); P1=table[ge1]; P0=0xfb; delay(2); suo2=0; suo1=1;//开锁存器1送南北方向的数码管代码 P1=table[shi]; P0=0xfd;//先送十位 delay(2); P1=table[ge]; P0=0xfe; //再送个位 delay(2); suo1=0; }void init(){ led11=1;//对交通灯的初始化红灯全亮 led12=0; led13=0; led21=1; led22=0; led23=0; suo1=0; suo2=0; beep=1; flag=0; num1=30; TMOD=0x11; TH0=(65536-10000)/256; TL0=(65536-10000)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET0=1; ET1=1; TR0=1; TR1=1; }void timer0() interrupt 1{ TH0=(65536-10000)/256; TL0=(65536-10000)%256; aa++; display(); if(aa==5) { aa=0; keyscan(); } }void time1() interrupt 3{ TH1=(65536-50000)/256; TL1=(65536-50000)%256; count++; }void exter0() interrupt 0{ led11=1;//中断时,所有的红灯亮,蜂鸣器响;之后进行复位。
led12=0; led13=0; led21=1; led22=0; led23=0; beep=0; P0=0xff;}void keyscan(){ if(key1==0)//按键1按下数码管定时关闭,等待时间设定 { delay(5); if(key1==0) { while(!key1) { temp=num1; temp1=num1-3; display(); } TR1=0; } } if(key2==0)//按键2按下数码管定时重新打开,时间设定完毕 { delay(5); if(key2==0) { while(!key1) { display(); } TR1=1; } } if(key3==0)//按键3按下数码管显示数字减1,进行时间调整 { delay(5); if(key3==0) { while(!key3); { temp=num1; temp1=num1-3; display(); num1=num1-1; } if(num1==-1) num1=60; } } if(key4==0)//按键4按下数码管显示数字加1,进行时间调整 { delay(5); if(key4==0) { while(!key4); { temp=num1; temp1=num1-3; display(); num1=num1+1; } if(num1==61) num1=0; } } display();}。












