proteus交通信号灯仿真原理图
吉首大学单片机交通灯设计 原理图 局部放大
单片机源程序如下: - <font color="rgb(0, 0, 0)">#include<reg51.H>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code table[]={ //共阴极数码管码表
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,
- 0xC9,0xFF,0x40};//设置码,测试码,不计时码
- void delay(uint x);//延时函数
- void display(uchar,uchar,uchar,uchar); //数码管显示函数
- void mkeys(); //键盘函数
- void traffic(); //交通灯函数
- uchar num,num1,num2, //1南北 2东西
- shi1,ge1,shi2,ge2,
- value1,value2,//南北 绿灯时间 黄灯时间
- value3,value4,//东西 绿灯时间 黄灯时间
- count1,count2,flag1,flag2; //南北标记 东西标记
- void main()
- {
-
- TMOD=0x01;
- TH0=(65536-45872)/256;
- TL0=(65536-45872)%256;
- EA=1;
- ET0=1;
- TR0=1;
- /*初状态*/
- value1=15; //南北 黄绿灯默认值
- value2=5;
- value3=10; //东西 黄绿灯默认值
- value4=5;
- num1=value1; //南北数码管先绿灯时间
- num2=value2+value1;//东西红灯时间
- shi1=num1/10;
- ge1=num1%10;
- shi2=num2/10;
- ge2=num2%10;
- P1=0x41;//初始状态:东西红灯 南北绿灯 20 15
- while(1){
- if(num==20) //定时器1s
- {
- num=0;
- num1--;
- num2--;
- traffic();
-
- shi1=num1/10;
- ge1=num1%10;
- shi2=num2/10;
- ge2=num2%10;
- }
- mkeys();
- display(shi1,ge1,shi2,ge2);
-
- }
- }
- void traffic() //红绿灯主控制程序
- {
- if(num1==0){
- count1++;
- if(count1==1){
- P1=0x42;//东西红灯 南北黄灯 5 5
- num1=value2;
- }
- if(count1==2){
- num1=value3+value4;//东西绿灯 南北红灯 10 15
- P1=0x14;
- }
- if(count1==3){
- P1=0x41;// 东西黄灯 南北红灯 5 5
- num1=value4;
- count1=0;
- }
- }
- if(num2==0){
- count2++;
- if(count2==1){
- //P1=0x14;//东西绿灯 南北红灯
- num2=value3;
- }
- if(count2==2){
- P1=0x24;//东西黄灯 南北红灯
- num2=value4;
- }
- if(count2==3){
- num2=value1+value2; //东西红灯 南北绿灯
- num1=value1;
- count2=0;
- }
-
- }
- }
- void display(uchar shi1,uchar ge1,uchar shi2,uchar ge2) //数码管显示子函数
- {
- uchar temp;
- temp=P2;
- P2=0xfe;
- P0=table[shi1];
- delay(5);
-
- P2=0xfd;
- P0=table[ge1];
- delay(5);
-
- P2=0xfb;
- P0=table[shi2];
- delay(5);
-
- P2=0xf7;
- P0=table[ge2];
- delay(5);
- }
- void delay(uint x)//延时子函数
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- void mkeys() //4*4矩阵键盘功能子函数
- {
- uchar temp,key;
- P3=0xfe;//第一行线
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0){
- temp=P3;
- switch(temp)
- {
- case 0xee:
- key=0;
- break;
- case 0xde:
- key=1;
- break;
- case 0xbe:
- key=2;
- break;
- case 0x7e:
- key=3;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- if(key==0) {//按键1:暂停
- TR0=~TR0; //定时器取反
- flag1=~flag1;//南北能够设置标志 0有效
- flag2=~flag2;//东西能够设置标志
- }
- if(key==1&&flag1==0){ //按键2:设置时间按钮
- TR0=0;
- P1=0x44;//禁止东南西北车辆 全为红灯 可以设置
- shi1=ge1=shi2=ge2=16;
- }
- if(key==2&&flag2==0){//按键3:设置完成 重启
- TR0=1;
- num=0; //定时器 初始化
- P1=0x41; //重新开始初状态
- num1=value1; //南北数码管先绿灯时间
- num2=value2+value1;//东西红灯时间
- shi1=num1/10;
- ge1=num1%10;
- shi2=num2/10;
- ge2=num2%10;
- }
- if(key==3&&P1==0x44){ //按键4:测试交通灯各个设备的好坏
- P1=0xff;
- delay(1000);
- P1=~P1;
- shi1=ge1=shi2=ge2=17;
- P1=0x44;
- }
- }
- }
- P3=0xfd;//第二行线
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0){
- temp=P3;
- switch(temp)
- {
- case 0xed:
- key=0;
- break;
- case 0xdd:
- key=1;
- break;
- case 0xbd:
- key=2;
- break;
- case 0x7d:
- key=3;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
-
- if(key==0&&P1==0x44){ //按键5:设置南北绿灯时间+
- num1=value1;
- if(num2!=159){ //@@@@保证交通合理,红灯最大值计时159s,绿灯不再增加
- num1++;
- value1=num1;
- }
- shi1=num1/10;
- ge1=num1%10;
- num2=value1+value2;//显示东西红灯时间
- shi2=num2/10;
- ge2=num2%10;
- }
- if(key==1&&P1==0x44){ //按键6:设置南北黄灯时间+
- num1=value2;
- if(num2!=159){
- num1++;
- value2=num1;
- }
- shi1=num1/10;
- ge1=num1%10;
- num2=value1+value2;//显示东西红灯时间
- shi2=num2/10;
- ge2=num2%10;
- }
- if(key==2&&P1==0x44&&value1>3){ //按键7:设置南北绿灯时间- @@@@保证交通合理,绿灯最小值计时3s,绿灯不再减少
- num1=value1;
- num1--;
- value1=num1;
- shi1=num1/10;
- ge1=num1%10;
- num2=value1+value2;//显示东西红灯时间
- shi2=num2/10;
- ge2=num2%10;
- }
- if(key==3&&P1==0x44&&value2>3){ //按键8:设置南北黄灯时间-
- num1=value2;
- num1--;
- value2=num1;
- shi1=num1/10;
- ge1=num1%10;
- num2=value1+value2;//显示东西红灯时间
- shi2=num2/10;
- ge2=num2%10;
- }
- }
-
- }
- ////||||||||||||||||||
- P3=0xfb;//第三行线
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0){
- temp=P3;
- switch(temp)
- {
- case 0xeb:
- key=0;
- break;
- case 0xdb:
- key=1;
- break;
- case 0xbb:
- key=2;
- break;
- case 0x7b:
- key=3;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- if(key==0&&P1==0x44){ //按键9:设置东西绿灯时间+
-
- num2=value3;
- if(num1!=159){
- num2++;
- value3=num2;
- }
- shi2=num2/10;
- ge2=num2%10;
- num1=value3+value4;//显示南北红灯时间
- shi1=num1/10;
- ge1=num1%10;
- }
- if(key==1&&P1==0x44){ //按键10:设置东西黄灯时间+
- num2=value4;
- if(num1!=159){
- num2++;
- value4=num2;
- }
- shi2=num2/10;
- ge2=num2%10;
- num1=value3+value4;//显示南北红灯时间
- shi1=num1/10;
- ge1=num1%10;
- }
- if(key==2&&P1==0x44&&value3>3){ //按键11:设置东西绿灯时间-
- num2=value3;
- num2--;
- value3=num2;
- shi2=num2/10;
- ge2=num2%10;
- num1=value3+value4;//显示南北红灯时间
- shi1=num1/10;
- ge1=num1%10;
- }
- if(key==3&&P1==0x44&&value4>3){ //按键12:设置东西黄灯时间-
- num2=value4;
- num2--;
- value4=num2;
- shi2=num2/10;
- ge2=num2%10;
- num1=value3+value4;//显示南北红灯时间
- shi1=num1/10;
- ge1=num1%10;
- }
- }
-
- }
- P3=0xf7;//第四行线 2未用
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0){
- temp=P3;
- switch(temp)
- {
- case 0xe7:
- key=0;
- break;
- case 0xd7:
- key=1;
- break;
- case 0xb7:
- key=2;
- break;
- case 0x77:
- key=3;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- if(key==0&&P1==0x44){ //按键13:南北紧急情况:南北绿灯常亮 东西红灯常亮
- P1=0x41;
- shi1=ge1=shi2=ge2=18;
- }
- if(key==1&&P1==0x44){ //按键14:东西紧急情况:东西绿灯常亮 南北红灯常亮
- P1=0x14;
- shi1=ge1=shi2=ge2=18;
- }
- if(key==2&&P1==0x44){//按键15:
-
- }
- if(key==3&&P1==0x44){//按键16:
-
- }
- }
-
- }
- }
- void T0_time() interrupt 1 //定时器T0 中断子程序
- {
- TH0=(65536-45872)/256;
- TL0=(65536-45872)%256;
- num++;
- }
- </font>
复制代码
|