|
智能交通灯的proteus仿真图分享给大伙
1.倒计时到10秒后,黄灯警告,准备交换亮红灯。
2..数码管32和28秒倒计时功能.
3.增加键盘手动调节功能
A:设置键:按一次后,数码管停止倒计数。按三次设置键恢复正常。
B:向上键:每按一次实现加一秒,没有限制秒。
C:向下键:每接一次向下键,实现数码管减一,减到0时恢复到32秒。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit key1=P3^2;
- sbit key2=P3^3;
- sbit key3=P3^4;
- sbit key4=P3^5;
- uchar h,count,num,dat,flag,dat1,num1,key1num,temp;
- uint r=0;
- uint s;
- uchar code dis[]={
-
- 0Xc0,/*0*/
- 0Xf9,/*1*/
- 0Xa4,/*2*/
- 0Xb0,/*3*/
- 0X99,/*4*/
- 0X92,/*5*/
- 0X82,/*6*/
- 0Xf8,/*7*/
- 0X80,/*8*/
- 0X90,/*9*/
- 0Xff,/*NULL*/
- };
- void delay(uint c)
- {
- uint i,j;
- for(i=0;i<c;i++)
- for(j=0;j<100;j++);
-
- }
- void init()
- {
- TMOD=0x11;//设置定时器0为工作方式1
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- TH1=(65536-20000)/256;
- TL1=(65536-20000)%256;
- EA=1;//开总中断
- ET0=1;//开定时器0中断
- ET1=1;
- TR0=1;//启动定时器0
- TR1=1;
- num=66;
- // P0=0xeb;
- }
- void display(dat) //送显示
- {
-
- if(dat<=33)
- {
- if(dat>3&&dat<33)
- {
- P0=0xdd;//红灯
- P1=0x00;
- P2=0xff;
- P1=0x01;
- P2=dis[dat/10];
- delay(1);
- P1=0x00;
- P2=0xff;
- P1=0x02;
- P2=dis[dat%10];
- delay(1);
- P1=0x00;
- P2=0xff;
- P1=0x04;
- P2=dis[(dat-3)/10];
- delay(1);
- P1=0x00;
- P2=0xff;
- P1=0x08;
- P2=dis[(dat-3)%10];
- delay(1);
- }
- if(dat<=3)
- {
- P0=0xd4;//黄灯
- P1=0x00;
- P2=0xff;
- P1=0x02;
- P2=dis[dat%10];
- delay(1);
- P1=0x00;
- P2=0xff;
- P1=0x08;
- P2=dis[(dat-3)%10];
- delay(1);
-
-
- }
- // break;
- }
- if(dat>=33&&dat<=66)
- {
- if(dat>36&&dat<=66)
- {
- P0=0xeb;
- P1=0x00;
- P2=0xff;
- P1=0x01;
- P2=dis[(dat-33)/10];
- delay(1);
- P1=0x00;
- P2=0xff;
- P1=0x02;
- P2=dis[(dat-33)%10];
- delay(1);
- P1=0x00;
- P2=0xff;
- P1=0x04;
- P2=dis[(dat-36)/10];
- delay(1);
- P1=0x00;
- P2=0xff;
- P1=0x08;
- P2=dis[(dat-36)%10];
- delay(1);
- }
- if(dat>=33&&dat<=36)
- {
- P0=0xe2;//黄灯
- P1=0x00;
- P2=0xff;
- P1=0x02;
- P2=dis[(dat-33)%10];
- delay(1);
- P1=0x00;
- P2=0xff;
- P1=0x08;
- P2=dis[(dat-33)%10];
- delay(1);
- }
- // break;
- }
-
- }
- void keyscan() //键盘检测
- {
- if(key1==0)
- {
- delay(5);
- if(key1==0)
- {
- key1num++;
- while(!key1)
- {
- display(num);
- }
- if(key1num==1)
- {
- TR0=0;
- TR1=0;
- }
- if(key1num==2)
- {
- TR0=1;
- TR1=1;
- P1=temp;
- key1num=0;
- }
- }
-
- }
- if(key1num!=0)
- {
- if(key2==0)
- {
- delay(5);
- if(key2==0)
- {
- while(!key2)
- {
- display(num);
- }
- if(key1num==1)
- {
- num++;
- display(num);
-
- }
- if(key1num==2)
- {
- num++;
- display(num);
- }
- }
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- while(!key3)
- {
- display(num);
- }
-
- if(key1num==1)
- {
- if(num==0)
- num=32;
- num--;
- }
- if(key1num==2)
- {
- if(num1==0)
- num1=56;
- num1--;
- }
-
- }
- }
- }
- }
- void main() //主函数
- {
- init();
- while(1)
- {
- keyscan();
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
c40b0a76b361af601ed40d66db712331.rar
(144.53 KB, 下载次数: 38)
|
评分
-
查看全部评分
|