找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4168|回復: 0
收起左側(cè)

單片機倒計時源代碼,AD原理圖 proteus仿真等資料下載

[復制鏈接]
ID:128643 發(fā)表于 2016-7-7 00:51 | 顯示全部樓層 |閱讀模式
單片機倒計時項目用ad畫的原理圖
0.png 0.png

  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為零,這樣不會出現(xiàn)比如為200,又繼續(xù)從200計時的現(xiàn)象
  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)//配置定時器參數(shù)
  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)//動態(tài)顯示LED數(shù)碼管,
  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};//保存按鍵狀態(tài)

  10. void KeyScan()
  11. {
  12.         static unsigned char key[] = {0xFF,0xFF,0xFF,0xFF};//
  13.         unsigned char i;
  14.         //讀取按鍵狀態(tài)
  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 //如果已經(jīng)按下了正反計時鍵,則忽略
  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];//保存按鍵當前狀態(tài)
  71.                 }
  72.         }
  73. }
復制代碼

0.png

單片機倒計時代碼,原理圖和proteus仿真等資料下載:http://www.torrancerestoration.com/bbs/dpj-49363-1.html

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表