基于AT89C52单片机的交通灯主要具有如下功能。
基本要求如下:
1. 按键1为交通灯“深夜模式”开/关,按下后进入深夜模式,4个方向LED(黄)闪烁;再次按下后则退出深夜模式,交通灯正常运行。
2. 按键2为“时间调整”开/关,上电后,交通灯正常运行,按下此按键后,进入调时模式,此时按键3和4均有效。
3. 按键3为通行“时间加”,按键4为通行“时间减”。
4. 设定好通行时间后,按键2再次按下,退出调时模式。
5. 交通灯设置好正常运行时,按键3和按键4均无效。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- typedef unsigned char uint8;
- typedef unsigned int uint16;
- sbit renrh=P3^0; //人行道右红
- sbit renrl=P3^1;// 人行道右绿
- sbit rensh=P2^0; //人上下红灯
- sbit rensl=P2^1; //人上下绿灯
- sbit cherh=P2^5; //车左右红灯
- sbit chery=P2^6; //车左右黄灯
- sbit cherl=P2^7; //车左右绿灯
- sbit chesh=P2^2; //车上下红灯
- sbit chesy=P2^3;//车上下黄灯
- sbit chesl=P2^4;//车上下绿灯
- uint8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
- 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
- uint8 smgwei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uint8 sec,sum;
- uint8 smgshu[8];
- void delay(uint8 i)
- {
- uint8 j,k;
- for(;i>0;i--)
- for(j=10;j>0;j--)
- for(k=130;k>0;k--);
- }
- void init0()
- {
- TMOD=0x01;
- TH1=0x3c;
- TL1=0xb0; //定时50ms
- TR0=1;
- ET0=1;
- EA=1;
- }
- void smgsaomiao()
- {
- uint8 i;
- for(i=0;i<8;i++)
- {
- P0=smgshu[i];
- delay(1);
- P1=smgwei[i];
- //delay(1);
- }
- }
- void main()
- {
- init0();
- sec=1;
- while(1)
- {
- if(sec==70)
- {
- sec=1;
- }
- if(sec<31)
- {
- P2=0xff;
- P3=0xff;
- renrh=0;
- chesl=0;
- cherh=0;
- rensl=0;
- smgshu[0]=0x00;
- smgshu[1]=0x00;
- smgshu[2]=smgduan[(30-sec)/10];
- smgshu[3]=smgduan[(30-sec)%10];
- smgshu[4]=0x00;
- smgshu[5]=0x00;
- smgshu[6]=smgduan[(30-sec)/10];
- smgshu[7]=smgduan[(30-sec)%10];
- smgsaomiao();
- }
- if(sec>30&&sec<36)
- {
- P3=0xff;
- P2=0xff;
- renrh=0;
- chesy=0;
- chery=0;
- rensh=0;
- smgshu[0]=0x00;
- smgshu[1]=0x00;
- smgshu[2]=smgduan[(36-sec)/10];
- smgshu[3]=smgduan[(36-sec)%10];
- smgshu[4]=0x00;
- smgshu[5]=0x00;
- smgshu[6]=smgduan[(36-sec)/10];
- smgshu[7]=smgduan[(36-sec)%10];
- smgsaomiao();
- }
- if(sec>35&&sec<66)
- {
- P3=0xff;
- P2=0xff;
- renrl=0;
- chesh=0;
- cherl=0;
- rensh=0;
- smgshu[0]=0x00;
- smgshu[1]=0x00;
- smgshu[2]=smgduan[(65-sec)/10];
- smgshu[3]=smgduan[(65-sec)%10];
- smgshu[4]=0x00;
- smgshu[5]=0x00;
- smgshu[6]=smgduan[(65-sec)/10];
- smgshu[7]=smgduan[(65-sec)%10];
- smgsaomiao();
- }
- if(sec>65&&sec<71)
- {
- P3=0xff;
- P2=0xff;
- renrh=0;
- chesy=0;
- chery=0;
- rensh=0;
- smgshu[0]=0x00;
- smgshu[1]=0x00;
- smgshu[2]=smgduan[(70-sec)/10];
- smgshu[3]=smgduan[(70-sec)%10];
- smgshu[4]=0x00;
- smgshu[5]=0x00;
- smgshu[6]=smgduan[(70-sec)/10];
- smgshu[7]=smgduan[(70-sec)%10];
- smgsaomiao();
- }
- }
- }
- void time0() interrupt 1
- {
- TH1=0x3c;
- TL1=0xb0;
- sum++;
- if(sum==20)
- {
- sum=0;
- sec++;
- }
- }
复制代码
仿真程序:
交通灯仿真实验.zip
(78.25 KB, 下载次数: 30)
|