找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4185|回复: 0
打印 上一主题 下一主题
收起左侧

单片机倒计时源代码,AD原理图 proteus仿真等资料下载

[复制链接]
跳转到指定楼层
楼主
单片机倒计时项目用ad画的原理图


  1. #include "Key.h"
  2. #define OSC 12000000
  3. /*************************************************************
  4. 单片机:STC89C52
  5. 晶振频率:12M
  6. 淘宝店铺:http://ygmcu.taobao.com/??????
  7. 作者:lboy987654
  8. 时间:2016年4月
  9. **************************************************************/
  10. unsigned char code LedChar[] = {
  11.     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  12.     0x80, 0x90
  13. };
  14. unsigned char ledBuff[] = {0xC0,0xC0};
  15. bit ckW = 0;//如果为0,正计时,否则为倒计时
  16. bit ckSt = 1;//0为运行
  17. bit ckP = 1;//0,不暂停,否则为暂停
  18. bit ckSp = 0;//1为清0,并停止
  19. bit flag1s = 0;//1秒标志
  20. bit cls = 0;//让定时中断cnt为零,这样不会出现比如为200,又继续从200计时的现象
  21. unsigned char THR0,TLR0;//保存TH0,TL0
  22. unsigned char sec99 = 0;//保存时间
  23. sbit ADD0 = P2^7;
  24. sbit ADD1 = P2^6;
  25. sbit BUZZ = P2^0;
  26. bit BUZZEN = 0;
  27. bit OVER = 0;

  28. void  ConfigTimer0(unsigned int ms)//配置定时器参数
  29. {
  30.         unsigned long tmp = ms;
  31.         
  32.         tmp = (tmp*OSC) / 12 /1000;
  33.         tmp = 65536 - tmp;
  34.         THR0 = (unsigned char)(tmp >> 8);
  35.         TLR0 = (unsigned char)tmp + 32;
  36.         TH0 = THR0;
  37.         TL0 = TLR0;
  38.         TMOD &= 0xF0;
  39.         TMOD |= 0x01;//使用模式1
  40.         TR0 = 1;//开启定时器0
  41.         ET0 = 1;//开启定时中断0
  42. }
  43. void main()
  44. {
  45.         ConfigTimer0(1);
  46.         EA = 1;//开启总中断
  47.         
  48.         while(1)
  49.         {
  50.                 KeyDrive();
  51.                 if(ckSp)//如果按下清零按键所有归初始化
  52.                 {
  53.                         ckSt = 1;
  54.                         ckP = 1;
  55.                         ckSp = 0;
  56.                         if(!ckW)//如果是正计时,为0,倒计时使sec99为99;
  57.                                         sec99 = 0;
  58.                         else
  59.                                         sec99 = 99;
  60.                 }
  61.                 ledBuff[0] = LedChar[sec99/10];
  62.                 ledBuff[1] = LedChar[sec99%10];
  63.                 if(!BUZZEN)
  64.                 {
  65.                         BUZZ = 1;//关闭蜂鸣器
  66.                 }
  67.                 if(flag1s)
  68.                 {
  69.                         flag1s = 0;
  70.                         if(!ckW)//是正计时还是倒计时
  71.                         {        
  72.                                 sec99++;
  73.                                 if(sec99 > 90)
  74.                                         BUZZEN = 1;
  75.                                 if(sec99 == 100)
  76.                                 {
  77.                                         ckSp = 1;
  78.                                         OVER = 1;
  79.                                         BUZZEN = 1;
  80.                                 }
  81.                         }
  82.                         else
  83.                         {
  84.                                 sec99--;
  85.                                 if(sec99 < 10)
  86.                                         BUZZEN = 1;
  87.                                 if(sec99 == 255)
  88.                                 {
  89.                                         ckSp = 1;
  90.                                         OVER = 1;
  91.                                         BUZZEN = 1;
  92.                                 }
  93.                         }
  94.                 }
  95.         }
  96. }
  97. void ScanLed()
  98. {
  99.         static unsigned char led = 0;
  100.         
  101.         P0 = 0xFF;
  102.         switch(led)//动态显示LED数码管,
  103.         {
  104.                 case 0:ADD0 = 1;ADD1 = 0;P0 = ledBuff[1];break;
  105.                 case 1:ADD1 = 1;ADD0 = 0;P0 = ledBuff[0];break;
  106.                 default:break;
  107.         }
  108.         led++;
  109.         led &= 0x01;
  110. }
  111. void InterruptTimer0() interrupt 1//进入定时器0中断
  112. {
  113.         static unsigned int cnt = 0;
  114.         static unsigned int buzzcnt = 0;

  115.         TH0 = THR0;
  116.         TL0 = TLR0;
  117.         ScanLed();
  118.         KeyScan();//扫描按键
  119.         if(cls)
  120.         {
  121.                 cls = 0;
  122.                 cnt = 0;
  123.         }
  124.         if(!ckSt)
  125.                 if(ckP)
  126.                         cnt++;
  127.         if(cnt >= 999)
  128.         {
  129.                 cnt = 0;
  130.                 flag1s = 1;
  131.         }
  132.         if(BUZZEN)
  133.         {
  134.                 buzzcnt++;
  135.                 BUZZ = !BUZZ;
  136.                 if(!OVER)
  137.                 {
  138.                         if(buzzcnt > 100)
  139.                         {
  140.                                 buzzcnt = 0;
  141.                                 BUZZEN = 0;
  142.                                 BUZZ = 1;
  143.                         }
  144.                 }
  145.                 else if(OVER)
  146.                 {
  147.                         if(buzzcnt > 900)
  148.                         {
  149.                                 buzzcnt = 0;
  150.                                 BUZZEN = 0;
  151.                                 OVER = 0;
  152.                                 BUZZ = 1;
  153.                         }
  154.                 }
  155.         }
  156. }
复制代码
  1. #include "Key.h"

  2. extern bit ckW ;//如果为0,正计时,否则为倒计时0
  3. extern bit ckSt ;//0为运行
  4. extern bit ckP;//0;暂停,否则为暂停1
  5. extern bit ckSp;//1秒标志0
  6. extern bit cls;
  7. extern unsigned char sec99;
  8. bit stop = 1;
  9. unsigned char keyBuff[] = {1,1,1,1};//保存按键状态

  10. void KeyScan()
  11. {
  12.         static unsigned char key[] = {0xFF,0xFF,0xFF,0xFF};//
  13.         unsigned char i;
  14.         //读取按键状态
  15.         key[0] = (key[0] << 1)|Key0;
  16.         key[1] = (key[1] << 1)|Key1;
  17.         key[2] = (key[2] << 1)|Key2;
  18.         key[3] = (key[3] << 1)|Key3;
  19.         for(i = 0;i < 4;i++)
  20.         {
  21.                 if((key[i]&0x0F) == 0x0F)//说明没有按键按下
  22.                         keyBuff[i] = 1;
  23.                 else if((key[i]&0x0F) == 0x00)//有按键按下
  24.                         keyBuff[i] = 0;
  25.         }
  26. }
  27. void KeyDrive()
  28. {
  29.         static unsigned char backKey[4] = {1,1,1,1};
  30.         unsigned char i;
  31.         
  32.         for(i = 0;i < 4;i++)
  33.         {
  34.                 if(keyBuff[i] != backKey[i])//判断按键是否按下
  35.                 {
  36.                         if(keyBuff[i] == 0)//如果为0就说明按下
  37.                         {
  38.                                 if(i == 0)
  39.                                 {
  40.                                         if(ckSt)//如果没有按下正反计时键
  41.                                                 ckW = !ckW;
  42.                                         else //如果已经按下了正反计时键,则忽略
  43.                                                 break;
  44.                                         if(!ckW)
  45.                                                 sec99 = 0;
  46.                                         else
  47.                                                 sec99 = 99;
  48.                                         cls = 1;
  49.                                 }
  50.                                 else if(i == 1)
  51.                                 {
  52.                                         ckSt = 0;
  53.                                         stop = 0;
  54.                                         cls = 1;
  55.                                 }
  56.                                 else if(i == 2)
  57.                                 {
  58.                                         {
  59.                                                 if(!stop)
  60.                                                         ckP = !ckP;
  61.                                         }
  62.                                 }
  63.                                 else if(i == 3)
  64.                                 {
  65.                                         ckSp = 1;
  66.                                         stop = 1;
  67.                                         cls = 1;
  68.                                 }
  69.                         }
  70.                         backKey[i] = keyBuff[i];//保存按键当前状态
  71.                 }
  72.         }
  73. }
复制代码



单片机倒计时代码,原理图和proteus仿真等资料下载:http://www.51hei.com/bbs/dpj-49363-1.html

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表