單片機倒計時項目用ad畫的原理圖

- #include "Key.h"
- #define OSC 12000000
- /*************************************************************
- 單片機:STC89C52
- 晶振頻率:12M
- 淘寶店鋪:http://ygmcu.taobao.com/??????
- 作者:lboy987654
- 時間:2016年4月
- **************************************************************/
- unsigned char code LedChar[] = {
- 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
- 0x80, 0x90
- };
- unsigned char ledBuff[] = {0xC0,0xC0};
- bit ckW = 0;//如果為0,正計時,否則為倒計時
- bit ckSt = 1;//0為運行
- bit ckP = 1;//0,不暫停,否則為暫停
- bit ckSp = 0;//1為清0,并停止
- bit flag1s = 0;//1秒標志
- bit cls = 0;//讓定時中斷cnt為零,這樣不會出現(xiàn)比如為200,又繼續(xù)從200計時的現(xiàn)象
- unsigned char THR0,TLR0;//保存TH0,TL0
- unsigned char sec99 = 0;//保存時間
- sbit ADD0 = P2^7;
- sbit ADD1 = P2^6;
- sbit BUZZ = P2^0;
- bit BUZZEN = 0;
- bit OVER = 0;
- void ConfigTimer0(unsigned int ms)//配置定時器參數(shù)
- {
- unsigned long tmp = ms;
-
- tmp = (tmp*OSC) / 12 /1000;
- tmp = 65536 - tmp;
- THR0 = (unsigned char)(tmp >> 8);
- TLR0 = (unsigned char)tmp + 32;
- TH0 = THR0;
- TL0 = TLR0;
- TMOD &= 0xF0;
- TMOD |= 0x01;//使用模式1
- TR0 = 1;//開啟定時器0
- ET0 = 1;//開啟定時中斷0
- }
- void main()
- {
- ConfigTimer0(1);
- EA = 1;//開啟總中斷
-
- while(1)
- {
- KeyDrive();
- if(ckSp)//如果按下清零按鍵所有歸初始化
- {
- ckSt = 1;
- ckP = 1;
- ckSp = 0;
- if(!ckW)//如果是正計時,為0,倒計時使sec99為99;
- sec99 = 0;
- else
- sec99 = 99;
- }
- ledBuff[0] = LedChar[sec99/10];
- ledBuff[1] = LedChar[sec99%10];
- if(!BUZZEN)
- {
- BUZZ = 1;//關閉蜂鳴器
- }
- if(flag1s)
- {
- flag1s = 0;
- if(!ckW)//是正計時還是倒計時
- {
- sec99++;
- if(sec99 > 90)
- BUZZEN = 1;
- if(sec99 == 100)
- {
- ckSp = 1;
- OVER = 1;
- BUZZEN = 1;
- }
- }
- else
- {
- sec99--;
- if(sec99 < 10)
- BUZZEN = 1;
- if(sec99 == 255)
- {
- ckSp = 1;
- OVER = 1;
- BUZZEN = 1;
- }
- }
- }
- }
- }
- void ScanLed()
- {
- static unsigned char led = 0;
-
- P0 = 0xFF;
- switch(led)//動態(tài)顯示LED數(shù)碼管,
- {
- case 0:ADD0 = 1;ADD1 = 0;P0 = ledBuff[1];break;
- case 1:ADD1 = 1;ADD0 = 0;P0 = ledBuff[0];break;
- default:break;
- }
- led++;
- led &= 0x01;
- }
- void InterruptTimer0() interrupt 1//進入定時器0中斷
- {
- static unsigned int cnt = 0;
- static unsigned int buzzcnt = 0;
- TH0 = THR0;
- TL0 = TLR0;
- ScanLed();
- KeyScan();//掃描按鍵
- if(cls)
- {
- cls = 0;
- cnt = 0;
- }
- if(!ckSt)
- if(ckP)
- cnt++;
- if(cnt >= 999)
- {
- cnt = 0;
- flag1s = 1;
- }
- if(BUZZEN)
- {
- buzzcnt++;
- BUZZ = !BUZZ;
- if(!OVER)
- {
- if(buzzcnt > 100)
- {
- buzzcnt = 0;
- BUZZEN = 0;
- BUZZ = 1;
- }
- }
- else if(OVER)
- {
- if(buzzcnt > 900)
- {
- buzzcnt = 0;
- BUZZEN = 0;
- OVER = 0;
- BUZZ = 1;
- }
- }
- }
- }
復制代碼- #include "Key.h"
- extern bit ckW ;//如果為0,正計時,否則為倒計時0
- extern bit ckSt ;//0為運行
- extern bit ckP;//0;暫停,否則為暫停1
- extern bit ckSp;//1秒標志0
- extern bit cls;
- extern unsigned char sec99;
- bit stop = 1;
- unsigned char keyBuff[] = {1,1,1,1};//保存按鍵狀態(tài)
- void KeyScan()
- {
- static unsigned char key[] = {0xFF,0xFF,0xFF,0xFF};//
- unsigned char i;
- //讀取按鍵狀態(tài)
- key[0] = (key[0] << 1)|Key0;
- key[1] = (key[1] << 1)|Key1;
- key[2] = (key[2] << 1)|Key2;
- key[3] = (key[3] << 1)|Key3;
- for(i = 0;i < 4;i++)
- {
- if((key[i]&0x0F) == 0x0F)//說明沒有按鍵按下
- keyBuff[i] = 1;
- else if((key[i]&0x0F) == 0x00)//有按鍵按下
- keyBuff[i] = 0;
- }
- }
- void KeyDrive()
- {
- static unsigned char backKey[4] = {1,1,1,1};
- unsigned char i;
-
- for(i = 0;i < 4;i++)
- {
- if(keyBuff[i] != backKey[i])//判斷按鍵是否按下
- {
- if(keyBuff[i] == 0)//如果為0就說明按下
- {
- if(i == 0)
- {
- if(ckSt)//如果沒有按下正反計時鍵
- ckW = !ckW;
- else //如果已經(jīng)按下了正反計時鍵,則忽略
- break;
- if(!ckW)
- sec99 = 0;
- else
- sec99 = 99;
- cls = 1;
- }
- else if(i == 1)
- {
- ckSt = 0;
- stop = 0;
- cls = 1;
- }
- else if(i == 2)
- {
- {
- if(!stop)
- ckP = !ckP;
- }
- }
- else if(i == 3)
- {
- ckSp = 1;
- stop = 1;
- cls = 1;
- }
- }
- backKey[i] = keyBuff[i];//保存按鍵當前狀態(tài)
- }
- }
- }
復制代碼
單片機倒計時代碼,原理圖和proteus仿真等資料下載:http://www.torrancerestoration.com/bbs/dpj-49363-1.html
|