单片机倒计时项目用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为零,这样不会出现比如为200,又继续从200计时的现象
- 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)//配置定时器参数
- {
- 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)//动态显示LED数码管,
- {
- 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};//保存按键状态
- void KeyScan()
- {
- static unsigned char key[] = {0xFF,0xFF,0xFF,0xFF};//
- unsigned char 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 //如果已经按下了正反计时键,则忽略
- 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];//保存按键当前状态
- }
- }
- }
复制代码
单片机倒计时代码,原理图和proteus仿真等资料下载:http://www.51hei.com/bbs/dpj-49363-1.html
|