|
給你改寫了一下程序,程序構(gòu)架與你原程序變化較大,現(xiàn)仿真正常,做實物還需要再完善,主要是數(shù)碼管位驅(qū)動要加晶體管放大。
999s倒計時+仿真.zip
(114.4 KB, 下載次數(shù): 6)
2019-10-8 11:30 上傳
點擊文件名下載附件
- //頭文件
- #include <reg51.h>
- #include <intrins.h>
- //宏定義
- #define uchar unsigned char
- #define uint unsigned int
- #define key_S 20 //宏定義短按(20ms)
- #define key_L 500 //宏定義長按(0.5s)
- #define key_M 300 //宏定義連按間隔(0.2s)
- //共陽極數(shù)碼管段碼
- uchar code SEG7[]={/*0,1,2,3,4,5,6,7,8,9,*/
- 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};
- //數(shù)碼管顯示緩沖
- uchar num[]={1,2,3,4};
- //數(shù)碼管位碼端口
- /*
- sbit q1=P2^0;
- sbit q2=P2^1;
- sbit q3=P2^2;
- sbit q4=P2^3;
- */
- //復(fù)位開始停止加1減1按鍵
- sbit k1=P1^0;
- sbit k2=P1^1;
- sbit k3=P1^2;
- sbit k4=P1^3;
- sbit OUT=P3^7;
- sbit buzz=P3^5;
- uint Cnt1s=35,sec=0,count=0;
- char Cnt100ms=0;
- uchar Choice,Cnt1ms=0,Cnt250us=0;
- bit sign=0,buzzer=0;
- bit flag1=0,flag2;
- void Timer0Init()//250微秒@12.000MHz
- {
- TMOD |= 0x02; //設(shè)置定時器模式
- TL0 = 0x06; //設(shè)置定時初值
- TH0 = 0x06; //設(shè)置定時重載值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時器0開始計時
- }
- //顯示控制
- void dispaly()
- {
- if(flag1==0)
- {
- num[0]=SEG7[sec/100%10];//顯示十位
- num[1]=SEG7[sec/10%10]; //顯示小數(shù)位
- num[2]=SEG7[sec%10]&0x7f;//顯示個位加點
- num[3]=SEG7[Cnt100ms%10];//顯示十分位
- }
- else
- {
- num[0]=SEG7[Cnt1s/100%10];//顯示十位
- num[1]=SEG7[Cnt1s/10%10]; //顯示小數(shù)位
- num[2]=SEG7[Cnt1s%10]&0x7f;//顯示個位加點
- num[3]=0xbf;//顯示-
- }
- }
- //數(shù)碼管顯示
- void dis()
- {
- static i=0;
- P0=0xff;
- switch(i)
- {
- case 0: P2=0xf1; break;
- case 1: P2=0xf2; break;
- case 2: P2=0xf4; break;
- case 3: P2=0xf8; break;
- }
- P0=num[i];
- i++;
- i%=4;
- }
- //按鍵掃描
- void key_scan()
- {
- static bit key1_sign,key4_sign; //按鍵自鎖標(biāo)志變量
- static uint count1,count2,count3=0,count4=0;//消抖計數(shù)變量
- if(k1==0 && Choice==0) //檢測按鍵1按下與K4互鎖
- {
- count1++; //消抖計數(shù)1自+1
- if((count1>=key_S)&&(key1_sign==0))//檢測消抖計數(shù)與按鍵1自鎖標(biāo)志
- {
- key1_sign=1; //按鍵1自鎖標(biāo)志置1
- flag1=~flag1;
- if(flag1==0)
- sec=Cnt1s;
- }
- }
- else
- {
- key1_sign=0; //按鍵1自鎖標(biāo)志清0
- count1=0; //消抖計數(shù)count1清0
- }
- if(flag1) //調(diào)整時間
- {
- if(!k2) //檢測按鍵2按下
- {
- count2++;
- if(count2>=key_L) //長按快調(diào)
- {
- if(Cnt1s<999)
- Cnt1s++;
- count2=key_M;
- }
- }
- else //按鍵抬起
- {
- if(count2>key_S && count2<key_L)//短按
- {
- if(Cnt1s<999)
- Cnt1s++;
- }
- count2=0; //count2清0
- }
- if(!k3) //檢測按鍵3按下
- {
- count3++;
- if(count3>=key_L) //長按快調(diào)
- {
- if(Cnt1s>0)
- Cnt1s--;
- count3=key_M;
- }
- }
- else //按鍵抬起
- {
- if(count3>key_S && count3<key_L)//短按
- {
- if(Cnt1s>0)
- Cnt1s--;
- }
- count3=0; //count3清0
- }
- }
- if(k4==0 && flag1==0) //檢測按鍵4按下與k1互鎖
- {
- count4++; //消抖計數(shù)4自+1
- if((count4>=key_S)&&(key4_sign==0))//檢測消抖計數(shù)與按鍵4自鎖標(biāo)志
- {
- key4_sign=1; //按鍵4自鎖標(biāo)志置1
- Choice++;
- if(Choice==1) //開始
- {
- OUT=0;
- Cnt1ms=0;
- Cnt100ms=0;
- }
- if(Choice==2) //停止
- OUT=1;
- if(Choice>=3) //復(fù)位
- {
- Choice=0;
- Cnt1ms=0;
- Cnt100ms=0;
- sec=Cnt1s;
- }
- }
- }
- else
- {
- key4_sign=0; //按鍵4自鎖標(biāo)志清0
- count4=0; //消抖計數(shù)count4清0
- }
- }
- //報警程序
- void Alarm()
- {
- if(sign==1 && Cnt100ms==0 && sec==0)
- {
- sign=0;
- OUT=1;
- Choice=0;
- buzzer=1;
- }
- if(buzzer)
- {
- buzz=~buzz;
- count++;
- if(count>=1000)
- {
- count=0;
- buzzer=0;
- buzz=1;
- sec=Cnt1s;
- }
- }
- }
- //-----------------------
- void main()
- {
- Timer0Init();
- sec=Cnt1s;
- OUT=1;
- buzz=1;
- while(1)
- {
- if(TF0==1)
- {
- TF0=0;
- Alarm();
- Cnt250us++;
- if(Cnt250us>=4)//1ms
- {
- Cnt250us=0;
- key_scan(); //按鍵掃描
- dis(); //顯示刷新
- if(Choice==1)//啟動倒計時
- {
- Cnt1ms++;
- if(Cnt1ms>=100)
- {
- Cnt1ms=0;
- Cnt100ms--;
- if(Cnt100ms<0)
- {
- Cnt100ms=9;
- sec--;
- if(sec==0)
- sign=1;
- }
- }
- }
- }
- }
- dispaly();//顯示控制
- }
- }
復(fù)制代碼
|
|