交通灯仿真原理图如下,带按键控制(proteus仿真工程文件可到本帖附件中下载)
单片机源程序:
-
- #include<reg51.H> // ???????????
- #define uint unsigned int
- #define uchar unsigned char
- uchar code a[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//????,???
- uchar code b[4]={0x01,0x02,0x04,0x08}; //????
- uchar code c[4]={0xcc,0xd4,0x78,0xb8};/*P1 ???????????*/
-
- //12MHz
- //*****************************************************************************
- uchar NB=25,DX=30,NBG=25,DXG=15,H=5; /*????????*/
- uchar i,k=0,cnt=0,j=0;
- sbit K0=P3^4; /*?????*/
- sbit K1=P3^5; /*?????*/
- sbit K4=P3^6; /*??*/
- sbit K3=P3^2; /*????*/
- sbit K2=P3^3; /*????*/
- void delay(uchar t); /*??????*/
- void key(); /*??????*/
- void display(); /*??????*/
- void settime(); /*??????????*/
- //************************????*********************************************
- void init(void)
- {
- TMOD=0x01; /*?????0???*/
- TH0=0x3c; /*(65536-5000)/256*/
- TL0=0xb0; /*(65536-5000)%256*/
- IT0=1; //???
- ET0=1;
- TR0=1;
- EA=1;
- EX0=1;
- EX1=1;
- P1=c[k]; //?????
- }
- //*************************??0????***************************************
- void int0(void) interrupt 0 // ??????
- {
- EA=0;
- P1=0xd8; /*????*/
-
- for(;;)
- {
- settime();
- if(K1==0) /*P3^6=0?????????*/
- {
- delay(40);
- if(K1==0)
- {
- while(!K1)
- {settime();}
- DXG++; /*????????1*/
- if(DXG==100)
- DXG=0;
- }
- }
-
- if(K0==0) /*P3^5=0?????????*/
- {
- delay(40);
- if(K0==0)
- {
- while(!K0)
- {settime();}
- NBG++; /*????????1*/
- if(NBG==100)
- NBG=0;
- }
- }
-
- if(K4==0) /*P3^7=0??*/
- {
- delay(40);
- if(K4==0)
- {
- while(!K4)
- {
- }
- k=0;P1=c[k];
- NB=NBG,DX=NBG+H;
- display();
- EA=1;
-
- break;
- }
- }
- }
- }
-
- //***********************************??1????********************
- void int1(void) interrupt 2 //????
- {
- /*???????*/
- EA=0;
- TR0=!TR0; /*????*/
- for(;;) /*????????0*/
- {
- P1=0xd8,
- P0=a[0];
- P2=b[0];
- delay(20);
-
- P2=b[1];
- delay(20);
- P2=b[2];
- delay(20);
- P2=b[3];
- delay(20);
-
- if(K4==0) /*??*/
- {
- delay(20);
- EA=1;
-
- P1=c[k]; /*???????????*/
- TR0=!TR0; /*????*/
- break;
- }
- }
- }
- void time1(void) interrupt 1 /*???????*/
- {
- TH0=0x3c; /*??50ms*/
- TL0=0xb0;
- cnt++;
-
- if(cnt>=20) /*?20*50ms=1s???*/
- {
- NB--;
- DX--;
- cnt=0;
- if(NB==0||DX==0)
- {
- k++;
- if(k>3) /*k?0,1,2,3*/
- k=0;
- switch(k)
- {
- case 0:NB=NBG,DX=NBG+H;j=0;P1=c[k];break; /*?????????*/
- case 1:NB=H;j=1;P1=c[k];break; /*???????*/
- case 2:NB=DXG+H,DX=DXG;j=0;P1=c[k];break; /*?????????*/
- case 3:DX=H;j=2;P1=c[k];break; /*???????*/
- }
- }
- }
- }
- void delay(uchar t) //??????0.1*nms
- {
- uchar i;
- do
- {
- for(i=0;i<20;i++)
- ;;;
- } while(t--);
- }
- void settime()
- {
- P2=b[0],P0=a[(NBG+H)%10]; /*????????? */
- delay(20);
-
- P2=b[1],P0=a[(NBG+H)/10];
- delay(20);
-
- P2=b[2],P0=a[(DXG+H)%10]; /*?????????*/
- delay(20);
-
- P2=b[3],P0=a[(DXG+H)/10];
- delay(20);
- }
- void key() //?????KO K1??????????
- {
- if(K1==0) /*??????????*/
- {
- delay(40);
- if(K1==0)
- {
- while(!K1)
- {
- display();
- }
- k=0,P1=c[k];cnt=0;
- NB=NBG, DX=NBG+H;
- display();
- }
- }
- if(K0==0) /*??????????*/
- {
- delay(40);
- if(K0==0)
- {
- while(!K0)
- {
- display();
- }
- k=2,P1=c[k];cnt=0;
- NB=DXG+H,DX=DXG;
- display();
- }
- }
- }
- void display() //????
- {
- P2=b[0],P0=a[NB%10]; /*?k????????????*/
- delay(20);
-
- P2=b[1],P0=a[NB/10];
- delay(20);
-
- P2=b[2],P0=a[DX%10];
- delay(20);
-
- P2=b[3],P0=a[DX/10];
- delay(20);
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件………
|
|
|