甲乙主從通道實現,另外實現調節時間和暫停運行
單片機源程序如下:
- /***********************************************************
- 名稱:基于AT89S52數碼管系統交通燈程序
- 要求:紅祿燈燈電路,數碼管電路,獨立式鍵盤電路,蜂鳴器電路,統一交通燈設計
- 作者:黃*
- 時間:2019年9月1日
- 電路描述:S1到S5一鍵一功能;S1開始,S2暫停,S3調整時間加,S4調整時間減,S5進入緊急狀態;
- ************************************************************/
- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit S1=P1^0; //開始運行按鍵
- sbit S2=P1^1; //暫停運行按鍵
- sbit S3=P1^2; //調整時間加按鍵
- sbit S4=P1^3; //調整時間減按鍵
- sbit S5=P1^4; //進入緊急狀態按鍵
- sbit red1=P3^2; //甲通道紅燈
- sbit green1=P3^3; //甲通道祿燈
- sbit yellow1=P3^4; //甲通道黃燈
- sbit red2=P3^5; //乙通道紅燈
- sbit green2=P3^6; //乙通道祿燈
- sbit yellow2=P3^7; //乙通道黃燈
- sbit beep=P3^1; //蜂鳴器報警控制端
- uchar code discode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //送段碼0-9
- uchar code discode1[]={0x92,0x92,0x88,0x8C,0x8C,0xC0,0x87,0x92}; //送段碼STOP PASS
- uchar disbitcode[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //送位碼
- uchar disbuf[2]={0,0}; //顯示緩沖區
- uchar cent,second1=60,second=60,second2=30,a;
- /*函數申明*/
- void display(void);
- void ini(void);
- void t0(void);
- void stop(void);
- /*************延時程序**************/
- void delay(uint m)
- {
- while(--m);
- }
- /*************初始化程序**************/
- void ini(void)
- {
- TMOD=0x01;
- TH0=(65536-46082)/256;
- TL0=(65536-46082)%256;
- ET0=1;
- EA=1;
- }
- /*************顯示緊急通道程序**************/
- void stop(void)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- P0=discode1[i];
- P2=disbitcode[i];
- delay(100);
- P2=0X00;
- }
- }
- /*************顯示程序**************/
- void display(void)
- {
- uchar i;
- for(i=0;i<2;i++)
- {
- P0=discode[disbuf[i]];
- P2=disbitcode[i];
- delay(100);
- P2=0X00;
- }
- }
- /*************中斷程序**************/
- void t0(void) interrupt 1 using 0 //用第0組寄存器
- {
- cent++;
- if(cent==20)
- {
- cent=0;
- second--;
- if(second==0&&a==0)
- {
- second=3;
- a=1;
- }
- if(second==0&&a==1)
- {
- second=second2;
- a=2;
- }
- if(second==0&&a==2)
- {
- second=3;
- a=3;
- }
- if(second==0&&a==3)
- {
- second=second1;
- a=0;
- }
- }
- disbuf[0]=second%10; //更新顯示緩沖區
- disbuf[1]=second/10;
- TH0=(65536-46082)/256;
- TL0=(65536-46082)%256;
- }
- /*************鍵掃描程序**************/
- uchar keyscan()
- {
- uchar tmp; //列號,行號
- P1=0xff; //發全行0掃描碼
- if((P1&0xff)!=0xff) //若有鍵按下
- {
- delay(1000); // 延時去抖
- if((P1&0xff)!=0xff) //有鍵按下
- {
- tmp=(P1&0xff);
- do{}while((P1&0xff)!=0xff);
- tmp=~tmp;
- return (tmp); //還回鍵值
- }
- }
- return (0); //無鍵按下,還回0
- }
- /*************主程序**************/
- void main(void)
- {
- uchar v,b=0;
- ini();
- v=keyscan();
- while(v==0)
- {
- P0=0X0C;
- P2=0X01;
- P3=0XFF;
- v=keyscan();
- }
- if(v==1||v==16)
- {
- while(1)
- {
- switch(v)
- {
- case 1:
- TR0=1;
- while(v==1||v==0)
- {
- if(a==0)
- {
- loop1: yellow2=1;
- red1=1;
- green1=0;
- red2=0;
- }
- if(a==1)
- {
- yellow1=0;
- green1=1;
- delay(100);
- yellow1=1;
- }
- if(a==2)
- {
- loop2: red1=0;
- red2=1;
- green2=0;
- yellow1=1;
- }
- if(a==3)
- {
- green2=1;
- yellow2=0;
- delay(100);
- yellow2=1;
- }
- display();
- v=keyscan(); //調鍵掃描程序
- }
- break;
- case 2:
- while(v==2||v==0)
- {
- TR0=0;
- display();
- v=keyscan();
- }
- break;
- case 4:
- b++;
- v=keyscan();
- break;
- case 8:
- if(b%2==0)
- {
- second1++;
- if(second1==100)
- second1=0;
- disbuf[0]=second1%10; //更新顯示緩沖區
- disbuf[1]=second1/10;
- }
- else
- {
- second2++;
- if(second2==100)
- second2=0;
- disbuf[0]=second2%10; //更新顯示緩沖區
- disbuf[1]=second2/10;
- }
- display();
- v=keyscan();
- break;
-
- case 16:
- if(b%2==0)
- {
- second1--;
- if(second1==0)
- second1=99;
- disbuf[0]=second1%10; //更新顯示緩沖區
- disbuf[1]=second1/10;
- }
- else
- {
- second2--;
- if(second2==0)
- second2=99;
- disbuf[0]=second2%10; //更新顯示緩沖區
- disbuf[1]=second2/10;
- }
- display();
- v=keyscan();
- break;
- case 32:
- while(v==32||v==0) /*顯示八個8*/
- {
- P3=0XFF;
- red1=0;
- red2=0;
- beep=0;
- stop();
- delay(10000);
- beep=1;
- v=keyscan(); //調鍵掃描程序
- }
- break;
- case 64:
- second=60;
- P3=0XFF;
- a=0;
- goto loop1;
- break;
- case 128:
- second=30;
- P3=0XFF;
- a=2;
- goto loop2;
- break;
- }
- display();
- v=keyscan();
- }
- }
- }
復制代碼
所有資料51hei提供下載:
交通燈.zip
(29.72 KB, 下載次數: 8)
2019-10-3 10:53 上傳
點擊文件名下載附件
|