標(biāo)題: 純手工打造,51單片機(jī)智能熱水器控制系統(tǒng) [打印本頁]

作者: xiao_yp2014    時(shí)間: 2014-12-3 09:28
標(biāo)題: 純手工打造,51單片機(jī)智能熱水器控制系統(tǒng)
本帖最后由 xiao_yp2014 于 2016-3-11 10:11 編輯

大家好!我叫肖亞平,從小熱愛上了電子技術(shù),讀書時(shí)陰差陽錯(cuò)的選擇了電子這方面的專業(yè),學(xué)習(xí)電子技術(shù)。對(duì)于我的理解來說,學(xué)校里面學(xué)到的技術(shù)不是全部實(shí)用,但是必須有用,所以一直奮斗在前線。我對(duì)學(xué)習(xí)總結(jié)出一句話“壓力不是有人努力,而是比你牛X N倍的人依然在努力

歡迎加入“單片機(jī)程序開發(fā)”交流群:425089475


/********************************************************************************************

名    稱:智能熱水器控制系統(tǒng)
功    能:
                 1、數(shù)碼管顯示當(dāng)前北京時(shí)間?蓪(duì)時(shí)間進(jìn)行修改。
                  2、設(shè)定時(shí)間,到達(dá)設(shè)定的時(shí)間開始加熱。
                  3、設(shè)定溫度,到達(dá)設(shè)定的溫度值,停止加熱。
                  4、加熱完畢后,蜂鳴器報(bào)警提示,溫度控制在設(shè)定溫度+-5度變化。(+-5度還是溫度采樣的精度,只是為了不讓繼電器平凡跳動(dòng))
                  5、DS1302備用電池電量用完時(shí),蜂鳴器報(bào)警。并在數(shù)碼管上顯示E002代碼
                  6、發(fā)熱體好壞判別,如果壞了,蜂鳴器報(bào)警,并在數(shù)碼管上顯示E001代碼。
                  7、沒有水的情況下,不加熱,并且蜂鳴器發(fā)出報(bào)警。
                  8、數(shù)碼管顯示6個(gè)窗口。
                       窗口1:顯示當(dāng)前的北京時(shí)間
                       窗口2:顯示設(shè)定的時(shí)間
                       窗口3:顯示設(shè)定的溫度
                       窗口4:顯示設(shè)定的水溫
                       窗口5:顯示錯(cuò)誤代碼
                       窗口6:顯示開機(jī)畫面
                  9、按鍵采用了:單擊,長按,短按。最多一個(gè)按鍵實(shí)現(xiàn)三個(gè)功能。
作    者:肖亞平
創(chuàng)建時(shí)間:2014年11月11日
修改時(shí)間:2014年13月3日   
備    注:程序如有問題,請(qǐng)聯(lián)系    QQ交流群:425089475        電話:15882089269             由于水平能力有限,紕漏之外,還望各位高人指出。。。。。
**************************************************************************************************/





正面



背面

熱水器程序——測(cè)試.zip (123.57 KB, 下載次數(shù): 382)    -------->源程序







智能熱水器.zip (120.23 KB, 下載次數(shù): 402)











主要器件說明:
1、STC89C52單片機(jī)作為主控芯片
2、ADC0832
  · 8位分辨率
. 逐次逼近式A/D轉(zhuǎn)換器
· 雙通道A/D轉(zhuǎn)換;
· 輸入輸出電平與TTL/CMOS相兼容;
· 5V電源供電時(shí)輸入電壓在0~5V之間;
· 工作頻率為250KHZ,轉(zhuǎn)換時(shí)間為32μS;
· 一般功耗僅為15mW;
芯片接口說明:
· CS_片選使能,低電平芯片使能。
· CH0 模擬輸入通道0,或作為IN+/-使用。
· CH1 模擬輸入通道1,或作為IN+/-使用。
· GND 芯片參考0 電位(地)。
· DI 數(shù)據(jù)信號(hào)輸入,選擇通道控制。
· DO 數(shù)據(jù)信號(hào)輸出,轉(zhuǎn)換數(shù)據(jù)輸出。
· CLK 芯片時(shí)鐘輸入。
· Vcc/REF 電源輸入及參考電壓輸入(復(fù)用)。
ADC0832 為8位分辨率A/D轉(zhuǎn)換芯片,其最高分辨可達(dá)256級(jí),可以適應(yīng)一般的模擬量轉(zhuǎn)換要求。其內(nèi)部電源輸入與參考電壓的復(fù)用,使得芯片的模擬電壓輸入在0~5V之間。芯片轉(zhuǎn)換時(shí)間僅為32μS,據(jù)有雙數(shù)據(jù)輸出可作為數(shù)據(jù)校驗(yàn),以減少數(shù)據(jù)誤差,轉(zhuǎn)換速度快且穩(wěn)定性能強(qiáng)。獨(dú)立的芯片使能輸入,使多器件掛接和處理器控制變的更加方便。通過DI 數(shù)據(jù)輸入端,可以輕易的實(shí)現(xiàn)通道功能的選擇。
單片機(jī)對(duì)ADC0832 的控制原理
正常情況下ADC0832 與單片機(jī)的接口應(yīng)為4條數(shù)據(jù)線,分別是CS、CLK、DO、DI。但由于DO端與DI端在通信時(shí)并未同時(shí)有效并與單片機(jī)的接口是雙向的,所以電路設(shè)計(jì)時(shí)可以將DO和DI 并聯(lián)在一根數(shù)據(jù)線上使用。當(dāng)ADC0832未工作時(shí)其CS輸入端應(yīng)為高電平,此時(shí)芯片禁用,CLK 和DO/DI 的電平可任意。當(dāng)要進(jìn)行A/D轉(zhuǎn)換時(shí),須先將CS使能端置于低電平并且保持低電平直到轉(zhuǎn)換完全結(jié)束。此時(shí)芯片開始轉(zhuǎn)換工作,同時(shí)由處理器向芯片時(shí)鐘輸入端CLK 輸入時(shí)鐘脈沖,DO/DI端則使用DI端輸入通道功能選擇的數(shù)據(jù)信號(hào)。在第1 個(gè)時(shí)鐘脈沖的下沉之前DI端必須是高電平,表示啟始信號(hào)。在第2、3個(gè)脈沖下沉之前DI端應(yīng)輸入2 位數(shù)據(jù)用于選擇通道功能,其功能詳見官方資料。
3、DS1302實(shí)時(shí)時(shí)鐘芯片(用于用準(zhǔn)確的時(shí)間


DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘電路,它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。DS1302內(nèi)部有一個(gè)31×8的用于臨時(shí)性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級(jí)產(chǎn)品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,同時(shí)提供了對(duì)后備電源進(jìn)行涓細(xì)電流充電的能力。
結(jié)構(gòu)DS1302的引腳排列,其中Vcc2為主電源,VCC1為后備電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時(shí),Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時(shí),DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復(fù)位/片選線,通過把RST輸入驅(qū)動(dòng)置高電平來啟動(dòng)所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)傳送的方法。當(dāng)RST為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)行操作。如果在傳送過程中RST置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時(shí),才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細(xì)說明。SCLK為時(shí)鐘輸入端。 下圖為DS1302的引腳功能圖





     4、溫度采用NTC10K熱敏電阻

          10K溫度阻值對(duì)應(yīng)表.zip (4.14 KB, 下載次數(shù): 136)


    5、繼電器
         由于是熱水器,發(fā)熱體的功率比較大,所以就選用:12V、40A
         注:原理圖和中的繼電器驅(qū)動(dòng)用的是低電平,程序中用的是高電平。
     
     6、數(shù)碼管

          共陽極數(shù)碼管,PNP三極管做驅(qū)動(dòng)。中間兩點(diǎn)是時(shí)間的秒,要單獨(dú)用一個(gè)I/O控制。


          為什么要單獨(dú)用一個(gè)I/O口控制?
          因?yàn)椋褐虚g兩點(diǎn)閃亮一下就是1S,不可以放在P0數(shù)據(jù)端口,這樣數(shù)碼管要500MS才掃描一次,數(shù)碼管會(huì)閃爍,所以要單獨(dú)用一個(gè)I/O來控制。


         


程序如下:
  1. /********************************************************************************************
  2. 名    稱:智能熱水器控制系統(tǒng)
  3. 功    能:
  4.           1、數(shù)碼管顯示當(dāng)前北京時(shí)間?蓪(duì)時(shí)間進(jìn)行修改。
  5.                   2、設(shè)定時(shí)間,到達(dá)設(shè)定的時(shí)間開始加熱。
  6.                   3、設(shè)定溫度,到達(dá)設(shè)定的溫度值,停止加熱。
  7.                   4、加熱完畢后,蜂鳴器報(bào)警提示,溫度控制在設(shè)定溫度+-5度變化。
  8.                   5、DS1302備用電池電量用完時(shí),蜂鳴器報(bào)警。并在數(shù)碼管上顯示E002代碼
  9.                   6、發(fā)熱體好壞判別,如果壞了,蜂鳴器報(bào)警,并在數(shù)碼管上顯示E001代碼。
  10.                   7、沒有水的情況下,不加熱,并且蜂鳴器發(fā)出報(bào)警。

  11. 作    者:肖亞平
  12. 創(chuàng)建時(shí)間:2014年11月11日
  13. 修改時(shí)間:
  14. 備    注:
  15. **************************************************************************************************/
  16. #include<reg52.h>                                //頭文件

  17. #define const_dpy_time_half  200  //數(shù)碼管閃爍時(shí)間的半值
  18. #define const_dpy_time_all   400  //數(shù)碼管閃爍時(shí)間的全值 一定要比const_dpy_time_half 大
  19. #define const_voice_short  40   //蜂鳴器短叫的持續(xù)時(shí)間
  20. #define const_voice_long  120 //蜂鳴器長鳴叫的時(shí)間
  21. #define const_DigTime_level 240        //小數(shù)點(diǎn)計(jì)時(shí)上限值
  22. #define const_KeyTime_level 30 //按鍵去抖動(dòng)延時(shí)的時(shí)間
  23. #define const_key_time_short3  30    //短按的按鍵去抖動(dòng)延時(shí)的時(shí)間
  24. #define const_key_time_long3   1024     //長按的按鍵去抖動(dòng)延時(shí)的時(shí)間
  25. #define const_time_0_25s  111   //0.25秒鐘的時(shí)間需要的定時(shí)中斷次數(shù)
  26. #define const_time_1s     444   //1秒鐘的時(shí)間需要的定時(shí)中斷次數(shù)
  27. #define const_ds1302_0_5s  200   //大概0.5秒的時(shí)間
  28. #define const_ds1302_sampling_time    300   //累計(jì)主循環(huán)次數(shù)的時(shí)間,每次刷新采樣時(shí)鐘芯片的時(shí)間

  29. #define WRITE_SECOND    0x80    //DS1302內(nèi)部的相關(guān)地址
  30. #define WRITE_MINUTE    0x82
  31. #define WRITE_HOUR      0x84
  32. #define WRITE_DATE      0x86
  33. #define WRITE_MONTH     0x88
  34. #define WRITE_YEAR      0x8C
  35. #define WRITE_CHECK     0xC2  //用來檢查芯片的備用電池是否用完了的地址
  36. #define READ_CHECK      0xC3  //用來檢查芯片的備用電池是否用完了的地址
  37. #define READ_SECOND     0x81
  38. #define READ_MINUTE     0x83
  39. #define READ_HOUR       0x85
  40. #define READ_DATE       0x87
  41. #define READ_MONTH      0x89
  42. #define READ_YEAR       0x8D
  43. #define WRITE_PROTECT   0x8E

  44. #define WRITE_SET_HOUR     0xC4  //用來檢查芯片的備用電池是否用完了的地址
  45. #define READ_SET_HOUR      0xC5  //用來檢查芯片的備用電池是否用完了的地址

  46. #define WRITE_SET_MINUTE     0xC6  //用來檢查芯片的備用電池是否用完了的地址
  47. #define READ_SET_MINUTE      0xC7  //用來檢查芯片的備用電池是否用完了的地址

  48. sbit SCLK_dr      =P1^0;  
  49. sbit DIO_dr_sr    =P1^1;  
  50. sbit DS1302_CE_dr =P1^2;  

  51. sbit dig1_dr =  P2^0;                        //第一位數(shù)碼管位選輸出
  52. sbit dig2_dr =  P2^1;                        //第二位數(shù)碼管位選輸出
  53. sbit dig3_dr =  P2^2;                        //第三位數(shù)碼管位選輸出
  54. sbit dig4_dr =  P2^3;                        //第四位數(shù)碼管位選輸出
  55. sbit digital_dp_dr = P2^4;                //小數(shù)點(diǎn)輸出

  56. sbit beep_dr = P2^5;           //蜂鳴器輸出
  57. sbit Key_sr1 = P3^7;                        //確認(rèn)/選擇鍵
  58. sbit Key_sr2 = P3^6;                           //上選擇鍵        Down
  59. sbit Key_sr3 = P3^5;                        //下選擇鍵        UP
  60. sbit relay_dr = P1^5;                        //繼電器輸出
  61. sbit Key_sr4 = P1^3;                        //開機(jī)按鍵

  62. sbit adc0832_CS_dr = P1^4;                        //adc0832的使能端口
  63. sbit adc0832_DI_sr_dr = P1^6;                        //adc0832的數(shù)據(jù)端口
  64. sbit adc0832_CLK_dr = P1^7;                //adc0832的時(shí)鐘端口

  65. unsigned char ucShortTouchFlag3 = 0; //短按的自鎖標(biāo)志、
  66. unsigned char ucShortTouchFlag4 = 0; //短按的自鎖標(biāo)志

  67. unsigned char ucDigStep = 1;        //步驟變量         
  68. unsigned int uiDigTimeCnt = 0;        //小數(shù)點(diǎn)延時(shí)計(jì)數(shù)器
  69. unsigned char ucDigTimeLock = 0;//原子鎖
  70. unsigned int uiVoiceCnt        = 0;         //蜂鳴器計(jì)數(shù)器

  71. unsigned int uiDigTemp1 = 0;        //第一位數(shù)碼管顯示內(nèi)容
  72. unsigned int uiDigTemp2 = 0;        //第二位數(shù)碼管顯示內(nèi)容
  73. unsigned int uiDigTemp3 = 0;        //第三位數(shù)碼管顯示內(nèi)容
  74. unsigned int uiDigTemp4 = 0;        //第四位數(shù)碼管顯示內(nèi)容

  75. unsigned int uiDigTemp = 0;     //計(jì)數(shù)的變量

  76. unsigned int uiKeyTimeCnt1 = 0;  //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器
  77. unsigned char ucKeyLock1 = 0;         //按鍵觸發(fā)后自鎖的變量標(biāo)志
  78. unsigned char ucKeySec = 0;                         //被觸發(fā)的按鍵編號(hào)

  79. unsigned int uiKeyTimeCnt2 = 0;  //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器
  80. unsigned char ucKeyLock2 = 0;         //按鍵觸發(fā)后自鎖的變量標(biāo)志

  81. unsigned int uiKeyTimeCnt3 = 0;  //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器
  82. unsigned char ucKeyLock3 = 0;         //按鍵觸發(fā)后自鎖的變量標(biāo)志

  83. unsigned int uiKeyTimeCnt4 = 0;  //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器
  84. unsigned char ucKeyLock4 = 0;         //按鍵觸發(fā)后自鎖的變量標(biāo)志

  85. unsigned char ucKeyStartFlag1=0; //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)
  86. unsigned char ucKeyStartFlag2=0; //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)
  87. unsigned char ucKeyStartFlag3=0; //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)
  88. unsigned char ucKeyStartFlag4=0; //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)

  89. unsigned int uiKeyCtntyCnt1 = 0; //連續(xù)觸發(fā)延時(shí)計(jì)數(shù)器累加
  90. unsigned int uiKeyCtntyCnt2 = 0;
  91. /*****************************************************************************************/

  92. unsigned char  ucVoiceLock=0;  //蜂鳴器鳴叫的原子鎖

  93. unsigned char ucDigShowTemp=0; //臨時(shí)中間變量
  94. unsigned char ucWd=6;  //本程序的核心變量,窗口顯示變量。類似于一級(jí)菜單的變量。代表顯示不同的窗口。
  95. unsigned char ucPart=0;//本程序的核心變量,局部顯示變量。類似于二級(jí)菜單的變量。代表顯示不同的局部。
  96. unsigned char ucWd1Update=0; //窗口1更新顯示標(biāo)志
  97. unsigned char ucWd2Update=1; //窗口2更新顯示標(biāo)志
  98. unsigned char ucWd3Update=1; //窗口3更新顯示標(biāo)志
  99. unsigned char ucWd4Update=1; //窗口4更新顯示標(biāo)志
  100. unsigned char ucWd5Update=1; //窗口5更新顯示標(biāo)志

  101. unsigned char ucWd1Part1Update=0;  //在窗口1中,局部1的更新顯示標(biāo)志
  102. unsigned char ucWd1Part2Update=0; //在窗口1中,局部2的更新顯示標(biāo)志

  103. unsigned char ucWd2Part1Update=0;  //在窗口2中,局部1的更新顯示標(biāo)志
  104. unsigned char ucWd2Part2Update=0; //在窗口2中,局部2的更新顯示標(biāo)志

  105. unsigned char ucWd3Part1Update=0; //在窗口3中,局部1的更新顯示標(biāo)志
  106. unsigned char ucWd3Part2Update=0; //在窗口3中,局部2的更新顯示標(biāo)志

  107. unsigned char ucWd4Part1Update = 0;        //在窗口4中,局部1的更新顯示標(biāo)志
  108. unsigned char ucWd4Part2Update = 0;        //在窗口4中,局部2的更新顯示標(biāo)志

  109. unsigned char ucWd5Part1Update = 0;        //在窗口5中,局部1的更新顯示標(biāo)志


  110. unsigned char ucDelayTimerLock=0; //原子鎖

  111. //unsigned int  uiDelayTimer=0;
  112. unsigned char ucCheckDs1302=0;  //檢查Ds1302芯片是否正常
  113. unsigned char ucDs1302Error=0; //Ds1302芯片的備用電池是否用完了的報(bào)警標(biāo)志
  114. unsigned char ucDs1302Lock=0;//原子鎖
  115. unsigned int  uiDs1302Cnt=0; //間歇性蜂鳴器報(bào)警的計(jì)時(shí)器
  116. unsigned char ucDpyTimeLock=0; //原子鎖
  117. unsigned int  uiDpyTimeCnt=0;  //數(shù)碼管的閃爍計(jì)時(shí)器,放在定時(shí)中斷里不斷累加
  118. unsigned char ucAutoDisplayDateLock1 = 0;  //原子鎖
  119. unsigned char ucAutoDisplayDateLock2 = 0;  //原子鎖

  120. unsigned char  ucHour=0;  
  121. unsigned char  ucMinute=0;  
  122. unsigned char  ucSecond=0;  

  123. unsigned char  ucHourBCD=0;  
  124. unsigned char  ucMinuteBCD=0;  
  125. unsigned char  ucSecondBCD=0;  

  126. unsigned char ucSetTimedataCnt1;
  127. unsigned char ucSetTimedataCnt2;
  128. unsigned char ucSetTimeCnt1BCD;
  129. unsigned char ucSetTimeCnt2BCD;

  130. unsigned char ucTemp1=0;  //中間過渡變量
  131. unsigned char ucTemp2=0;  //中間過渡變量
  132. unsigned char ucTemp3=0;  //中間過渡變量
  133. unsigned char ucTemp4=0;  //中間過渡變量

  134. unsigned char ucSetTimeCnt1 = 12; //設(shè)定時(shí)間變量
  135. unsigned char ucSetTimeCnt2 = 30;

  136. unsigned char ucSetTepCnt1 = 50;         //設(shè)置溫度計(jì)數(shù)器

  137. unsigned char ucDigShow4;  //第4位數(shù)碼管要顯示的內(nèi)容
  138. unsigned char ucDigShow3;  //第3位數(shù)碼管要顯示的內(nèi)容
  139. unsigned char ucDigShow2;  //第2位數(shù)碼管要顯示的內(nèi)容
  140. unsigned char ucDigShow1;  //第1位數(shù)碼管要顯示的內(nèi)容

  141. unsigned int uiSampingCnt=0;   //采集Ds1302的計(jì)時(shí)器,每秒鐘更新采集一次
  142. unsigned char ucStartheat = 0;  //啟動(dòng)加熱標(biāo)志位
  143. unsigned char ucAlarmPrompt = 0;//加熱完畢報(bào)警提示標(biāo)志位

  144. unsigned char ucAD_value_Tem = 0;//AD轉(zhuǎn)換過后的溫度數(shù)據(jù)
  145. unsigned char ucADC_value = 0;//AD數(shù)據(jù)
  146. unsigned char ucADC_sampling_number = 1; //開啟ADC采樣的標(biāo)志位
  147. unsigned char ucADC_samplingCnt = 0;         //ADC采樣次數(shù)變量
  148. unsigned char KeyChangeTimeFlag;
  149. unsigned char ucBootScreen = 0;  //開機(jī)標(biāo)志位

  150. /************************************************************************************************/

  151. void ds1302_alarm_service(void); //ds1302出錯(cuò)報(bào)警
  152. void ds1302_sampling(void); //ds1302采樣程序,內(nèi)部每秒鐘采集更新一次
  153. void Write1302 ( unsigned char addr, unsigned char dat );//修改時(shí)間的驅(qū)動(dòng)
  154. void display_service(void); //顯示的窗口菜單服務(wù)程序

  155. void delay_short(unsigned int uiDelayShort);
  156. void delay_long(unsigned int uiDelayLong);

  157. unsigned char Read1302 ( unsigned char addr );//讀取時(shí)間的驅(qū)動(dòng)
  158. unsigned char bcd_to_number(unsigned char ucBcdTemp);  //BCD轉(zhuǎn)原始數(shù)值
  159. unsigned char number_to_bcd(unsigned char ucNumberTemp); //原始數(shù)值轉(zhuǎn)BCD

  160. void initial_myself(void);  //第一區(qū) 初始化單片機(jī)
  161. void delay(unsigned int delay_ms);
  162. void display();
  163. void T0_time();
  164. void key_scan();
  165. void key_service();
  166. void T0_init();
  167. void TimeData_contrast();
  168. void ucAlarmPrompt_service();
  169. void ADC_sampling_service();
  170.                                                   
  171. unsigned char array[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc6,0x86,
  172.                        0xc6,0xf6,0xf6,0xf0};

  173. const unsigned int code wendu_tab[106]=
  174. {
  175.    3274,3111,2957,2812,2674,2545,2422,2306,2196,2092, //0~9
  176.    1993,1900,1811,1728,1648,1573,1501,1433,1369,1308, //10~19
  177.    1250,1194,1142,1092,1045,1000,957,916,877,840,          //20~29
  178.    805,771,739,709,679,652,625,600,576,553,                          //30~39
  179.    531,510,490,471,453,435,418,402,387,372,                          //40~49
  180.    358,345,332,320,308,297,286,276,266,256,                          //50~59
  181.    247,238,230,222,214,207,199,193,186,180,                          //60~69
  182.    174,168,162,157,152,147,142,137,133,128,                          //70~79
  183.    124,120,116,113,109,106,102,99,96,93,                          //80~89
  184.    90,88,85,82,80,78,75,73,71,69,                                          //90~99
  185.    67,65,63,61,59,58                                                                  //100~105
  186. };

  187. /********************************************************************************************
  188. 函數(shù)名稱:主程序
  189. 功    能:程序執(zhí)行的入口
  190. 返 回 值:無
  191. 時(shí)    間:2014-11-11        
  192. 備    注:
  193. **************************************************************************************************/
  194. void main()
  195. {
  196.     T0_init();
  197.         initial_myself();
  198.         while(1)
  199.         {

  200.                  ds1302_alarm_service(); //ds1302出錯(cuò)報(bào)警
  201.                  ucAlarmPrompt_service();
  202.                  display_service(); //顯示的窗口菜單服務(wù)程序
  203.                  ds1302_sampling(); //ds1302采樣程序,內(nèi)部每秒鐘采集更新一次
  204.                  key_service();                         //按鍵服務(wù)函數(shù)放在主程序里
  205.                  TimeData_contrast();

  206.                 if(ucADC_sampling_number == 1)
  207.                 {
  208.                         ucADC_samplingCnt++;

  209.                         if(ucADC_samplingCnt==10)
  210.                         {
  211.                             ucADC_sampling_number = 0;
  212.                                 ucADC_samplingCnt = 0;
  213.                                 ADC_sampling_service();
  214.                             ucADC_sampling_number = 1;
  215.                         }
  216.                 }

  217.                  if(ucDigTimeLock == 0 && ucPart == 0)          //開始計(jì)數(shù)器標(biāo)志
  218.                  {
  219.                     uiDigTimeCnt++;                  //計(jì)數(shù)器開始計(jì)數(shù)
  220.                  }
  221.                  else
  222.                  {
  223.                     digital_dp_dr = 1;  //關(guān)閉小數(shù)點(diǎn)顯示
  224.                  }
  225.                  
  226.                  if(uiDigTimeCnt >= const_DigTime_level)  //計(jì)數(shù)時(shí)間到
  227.                  {
  228.                          ucDigTimeLock = 1;                                          //計(jì)數(shù)器標(biāo)志位置1
  229.                          uiDigTimeCnt = 0;                                          //計(jì)數(shù)器清零
  230.                          digital_dp_dr = ~digital_dp_dr;          //小數(shù)點(diǎn)輸出
  231.                          ucDigTimeLock = 0;                                          //計(jì)數(shù)器標(biāo)志位清零,開始計(jì)數(shù)。
  232.                  }
  233.                  
  234. /********************************************************************************************
  235. 功    能:數(shù)碼管閃爍計(jì)數(shù)器在外部可以關(guān)閉,不開啟計(jì)時(shí)功能
  236. 時(shí)    間:2014-11-11        
  237. **************************************************************************************************/
  238.     if(ucDpyTimeLock==0) //原子鎖判斷
  239.         {
  240.                 uiDpyTimeCnt++;  //數(shù)碼管的閃爍計(jì)時(shí)器
  241.         }


  242.         }  
  243. }         


  244. /********************************************************************************************
  245. 函數(shù)名稱:按鍵掃描
  246. 功    能:
  247.          1、按下Key_sr1,加1,如果安下一直不松,就連續(xù)加。
  248.                  2、按下Key_sr2,加減1,如果安下一直不松,就連續(xù)減。
  249.                  3、按下Key_sr3,單擊單步觸發(fā),和長按觸發(fā)
  250. 返 回 值:無
  251. 時(shí)    間:2014-11-11        
  252. 備    注:按鍵運(yùn)用了,單擊,長按,連續(xù)觸發(fā)的方法。
  253. **************************************************************************************************/
  254. void key_scan()
  255. {
  256.         static unsigned char KeyChangeTimeFlag3;

  257.         if(Key_sr1 == 1)                 //1號(hào)鍵
  258.         {
  259.            ucKeyStartFlag1 = 0;         //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)清零
  260.            uiKeyTimeCnt1 = 0;         //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  261.            ucKeyLock1 = 0;                  //按鍵觸發(fā)后自鎖的變量標(biāo)志清零
  262.          
  263.         }
  264.         else if(ucKeyLock1 == 0)
  265.         {
  266.               ucKeyStartFlag1 = 1;                //開啟計(jì)數(shù)器開關(guān),開始計(jì)數(shù)

  267.                 if(uiKeyTimeCnt1>=const_KeyTime_level)
  268.                 {
  269.                     ucKeyStartFlag1 = 0;        //開啟計(jì)數(shù)器關(guān)閉,停止計(jì)數(shù)
  270.                         ucKeyLock1 = 1;                        //自鎖按鍵置位,避免一直觸發(fā)
  271.                         uiKeyTimeCnt1 = 0;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  272.                         ucKeySec = 1;                   //觸發(fā)1號(hào)鍵
  273.                 }
  274.         }

  275.         else if(uiKeyTimeCnt1<const_time_1s)
  276.         {
  277.                  uiKeyTimeCnt1++;
  278.         }
  279.         else
  280.         {
  281.                  uiKeyCtntyCnt1++; //連續(xù)觸發(fā)延時(shí)計(jì)數(shù)器累加

  282.                 if(uiKeyCtntyCnt1>const_time_0_25s)
  283.                 {
  284.                         uiKeyCtntyCnt1 = 0;
  285.                         ucKeySec = 1;                   //觸發(fā)1號(hào)鍵
  286.                 }
  287.         }


  288.         if(Key_sr2 == 1)                 //2號(hào)鍵
  289.         {
  290.            ucKeyStartFlag2 = 0;         //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)清零
  291.            uiKeyTimeCnt2 = 0;         //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  292.            ucKeyLock2 = 0;                  //按鍵觸發(fā)后自鎖的變量標(biāo)志清零
  293.         }
  294.         else if(ucKeyLock2 == 0)
  295.         {
  296.               ucKeyStartFlag2 = 1;                //開啟計(jì)數(shù)器開關(guān),開始計(jì)數(shù)

  297.                 if(uiKeyTimeCnt2>=const_KeyTime_level)
  298.                 {
  299.                     ucKeyStartFlag2 = 0;        //開啟計(jì)數(shù)器關(guān)閉,停止計(jì)數(shù)
  300.                         ucKeyLock2 = 1;                        //自鎖按鍵置位,避免一直觸發(fā)
  301.                         uiKeyTimeCnt2 = 0;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  302.                         ucKeySec = 2;                   //觸發(fā)2號(hào)鍵
  303.                 }
  304.         }
  305.         else if(uiKeyTimeCnt2<const_time_1s)
  306.         {
  307.                  uiKeyTimeCnt2++;
  308.         }
  309.         else
  310.         {
  311.                  uiKeyCtntyCnt2++; //連續(xù)觸發(fā)延時(shí)計(jì)數(shù)器累加

  312.                 if(uiKeyCtntyCnt2>const_time_0_25s)
  313.                 {
  314.                         uiKeyCtntyCnt2 = 0;
  315.                         ucKeySec = 2;                   //觸發(fā)1號(hào)鍵
  316.                 }
  317.         }
  318.             
  319.         if(Key_sr3 == 1)                 //3,4號(hào)鍵
  320.         {
  321.            ucKeyStartFlag3 = 0;         //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)清零
  322.            uiKeyTimeCnt3 = 0;         //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  323.            ucKeyLock3 = 0;                  //按鍵觸發(fā)后自鎖的變量標(biāo)志清零
  324.            ucShortTouchFlag3 = 0; //短按的自鎖標(biāo)志清零
  325.             KeyChangeTimeFlag3 = 0;
  326.         }
  327.         else if(ucKeyLock3 == 0)
  328.         {
  329.               ucKeyStartFlag3 = 1;                //開啟計(jì)數(shù)器開關(guān),開始計(jì)數(shù)

  330.                 if(ucShortTouchFlag3 == 0)
  331.                 {
  332.                         if(uiKeyTimeCnt3>=const_key_time_short3)  //短按中間間隔的時(shí)間
  333.                         {
  334.                             ucShortTouchFlag3 = 1;
  335.                                 ucKeySec = 3;                   //觸發(fā)3號(hào)鍵
  336.                         }
  337.                 }

  338.                 if(uiKeyTimeCnt3>=const_key_time_long3&&KeyChangeTimeFlag3 == 0)
  339.                 {
  340.             KeyChangeTimeFlag3 = 1;
  341.                         ucKeySec = 17;                   //觸發(fā)17號(hào)鍵
  342.                 }
  343.             if(uiKeyTimeCnt3>=const_key_time_long3+const_key_time_long3)
  344.                 {
  345.                     ucKeyStartFlag3 = 0;        //開啟計(jì)數(shù)器關(guān)閉,停止計(jì)數(shù)
  346.                         ucKeyLock3 = 1;                        //自鎖按鍵置位,避免一直觸發(fā)
  347.                         uiKeyTimeCnt3 = 0;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  348.                         ucKeySec = 18;                   //觸發(fā)17號(hào)鍵
  349.                 }

  350.         }

  351.         if(Key_sr4 == 1)                 //1號(hào)鍵
  352.         {
  353.            ucKeyStartFlag4 = 0;         //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)清零
  354.            uiKeyTimeCnt4 = 0;         //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  355.            ucKeyLock4 = 0;                  //按鍵觸發(fā)后自鎖的變量標(biāo)志清零
  356.            ucShortTouchFlag4 = 0; ///短按的自鎖標(biāo)志清零
  357.          
  358.         }
  359.         else if(ucKeyLock4 == 0)
  360.         {
  361.               ucKeyStartFlag4 = 1;                //開啟計(jì)數(shù)器開關(guān),開始計(jì)數(shù)

  362.                 if(ucShortTouchFlag4 == 0)
  363.                 {         
  364.                         if(uiKeyTimeCnt4>=const_KeyTime_level)
  365.                         {
  366.                                 ucShortTouchFlag4 = 1;
  367.                                 ucKeySec = 4;                   //觸發(fā)4號(hào)鍵
  368.                         }

  369.                
  370.                 }

  371.            if(uiKeyTimeCnt4>=const_key_time_long3)
  372.            {
  373.                         ucKeyStartFlag4 = 0;        //開啟計(jì)數(shù)器關(guān)閉,停止計(jì)數(shù)
  374.                         ucKeyLock4 = 1;                        //自鎖按鍵置位,避免一直觸發(fā)
  375.                         uiKeyTimeCnt4 = 0;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  376.                         ucKeySec = 5;                   //觸發(fā)5號(hào)鍵

  377.            }
  378.         }
  379. }

  380. /********************************************************************************************
  381. 函數(shù)名稱:顯示的窗口菜單服務(wù)程序
  382. 功    能:更新顯示內(nèi)容
  383. 返 回 值:無
  384. 時(shí)    間:2014-11-11        
  385. 備    注:
  386. **************************************************************************************************/

  387. void display_service(void) //顯示的窗口菜單服務(wù)程序
  388. {
  389.    switch(ucWd)  //本程序的核心變量,窗口顯示變量。類似于一級(jí)菜單的變量。代表顯示不同的窗口。
  390.    {
  391.            case 1:   //顯示時(shí)間窗口的數(shù)據(jù)  數(shù)據(jù)格式 SS FF MM 時(shí) 分 秒
  392.                 if(ucWd1Update==1)  //窗口1要全部更新顯示
  393.                 {
  394.                                 ucWd1Update=0;  //及時(shí)清零標(biāo)志,避免一直進(jìn)來掃描
  395.                                 ucWd1Part1Update=1;  //局部時(shí)更新顯示
  396.                                 ucWd1Part2Update=1;  //局部分更新顯示
  397.                 }
  398.         
  399.                         if(ucWd1Part1Update==1)//局部時(shí)更新顯示
  400.                         {
  401.                                 ucWd1Part1Update=0;
  402.                                 ucTemp1=ucHour/10;  //時(shí)
  403.                                 ucTemp2=ucHour%10;
  404.                                 ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  405.                                 ucDigShow2=ucTemp2;
  406.                         }
  407.         
  408.                         if(ucWd1Part2Update==1)//局部分更新顯示
  409.                         {
  410.                                 ucWd1Part2Update=0;
  411.                                 ucTemp3=ucMinute/10;  //分
  412.                                 ucTemp4=ucMinute%10;
  413.                                 ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  414.                                 ucDigShow4=ucTemp4;
  415.                         }
  416.         
  417.              //數(shù)碼管閃爍
  418.                 switch(ucPart)  //相當(dāng)于二級(jí)菜單,根據(jù)局部變量的值,使對(duì)應(yīng)的參數(shù)產(chǎn)生閃爍的動(dòng)態(tài)效果。
  419.                         {
  420.                             case 0:  //都不閃爍
  421.                                  break;
  422.                             case 1:  //時(shí)參數(shù)閃爍
  423.                                  if(uiDpyTimeCnt==const_dpy_time_half)
  424.                                  {
  425.                                        ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  426.                                        ucDigShow2=ucTemp2;
  427.                                   }
  428.                                  else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  429.                                  {
  430.                                                 ucDpyTimeLock=1; //原子鎖加鎖
  431.                                                 uiDpyTimeCnt=0;   //及時(shí)把閃爍記時(shí)器清零
  432.                                                 ucDpyTimeLock=0;  //原子鎖解鎖
  433.                                                 ucDigShow1=10;   //數(shù)碼管顯示空,什么都不顯示
  434.                                                 ucDigShow2=10;
  435.                                  }
  436.                                  break;
  437.                         
  438.                             case 2:   //分參數(shù)閃爍
  439.                                  if(uiDpyTimeCnt==const_dpy_time_half)
  440.                                  {
  441.                                                 ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容,顯示前兩位,
  442.                                     ucDigShow2=ucTemp2;         //目的是上面閃爍后,數(shù)碼管顯示內(nèi)容會(huì)清零

  443.                                                 ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  444.                                                 ucDigShow4=ucTemp4;
  445.                                  }
  446.                                  else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  447.                                  {
  448.                                                 ucDpyTimeLock=1; //原子鎖加鎖
  449.                                                 uiDpyTimeCnt=0;   //及時(shí)把閃爍記時(shí)器清零
  450.                                                 ucDpyTimeLock=0;  //原子鎖解鎖
  451.                                                 ucDigShow3=10;   //數(shù)碼管顯示空,什么都不顯示
  452.                                                 ucDigShow4=10;

  453.                                  }
  454.                                 break;
  455.                         }
  456.             break;

  457.                 case 2:
  458.                     if(ucWd2Update==1)  //窗口1要全部更新顯示
  459.                 {
  460.                                 ucWd2Update=0;  //及時(shí)清零標(biāo)志,避免一直進(jìn)來掃描
  461.                                 ucWd2Part1Update=1;  //局部時(shí)更新顯示
  462.                                 ucWd2Part2Update=1;  //局部分更新顯示
  463.                 }

  464.                         if(ucWd2Part1Update == 1)
  465.                         {
  466.                                    ucWd2Part1Update = 0;
  467.                                 ucTemp1=ucSetTimeCnt1/10;  //時(shí)
  468.                                 ucTemp2=ucSetTimeCnt1%10;
  469.                                 ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  470.                                 ucDigShow2=ucTemp2;
  471.                         }

  472.                         if(ucWd2Part2Update == 1)
  473.                         {
  474.                                    ucWd2Part2Update = 0;
  475.                                 ucTemp3=ucSetTimeCnt2/10;  //時(shí)
  476.                                 ucTemp4=ucSetTimeCnt2%10;
  477.                                 ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  478.                                 ucDigShow4=ucTemp4;
  479.                         }

  480.                     switch(ucPart)  //相當(dāng)于二級(jí)菜單,根據(jù)局部變量的值,使對(duì)應(yīng)的參數(shù)產(chǎn)生閃爍的動(dòng)態(tài)效果。
  481.                         {
  482.                             case 0:  //都不閃爍
  483.                                  break;
  484.                             case 1:  //時(shí)參數(shù)閃爍
  485.                                  if(uiDpyTimeCnt==const_dpy_time_half)
  486.                                  {
  487.                                        ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  488.                                        ucDigShow2=ucTemp2;
  489.                                   }
  490.                                  else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  491.                                  {
  492.                                                 ucDpyTimeLock=1; //原子鎖加鎖
  493.                                                 uiDpyTimeCnt=0;   //及時(shí)把閃爍記時(shí)器清零
  494.                                                 ucDpyTimeLock=0;  //原子鎖解鎖
  495.                                                 ucDigShow1=10;   //數(shù)碼管顯示空,什么都不顯示
  496.                                                 ucDigShow2=10;
  497.                                  }
  498.                                  break;
  499.                         
  500.                             case 2:   //分參數(shù)閃爍
  501.                                  if(uiDpyTimeCnt==const_dpy_time_half)
  502.                                  {
  503.                                                 ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容,這里是為了顯示前兩位
  504.                                     ucDigShow2=ucTemp2;         //目的是上面閃爍后,數(shù)碼管顯示內(nèi)容會(huì)清零

  505.                                                 ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  506.                                                 ucDigShow4=ucTemp4;
  507.                                  }
  508.                                  else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  509.                                  {
  510.                                                 ucDpyTimeLock=1; //原子鎖加鎖
  511.                                                 uiDpyTimeCnt=0;   //及時(shí)把閃爍記時(shí)器清零
  512.                                                 ucDpyTimeLock=0;  //原子鎖解鎖
  513.                                                 ucDigShow3=10;   //數(shù)碼管顯示空,什么都不顯示
  514.                                                 ucDigShow4=10;

  515.                                  }
  516.                                 break;
  517.                         }
  518.             break;

  519.                  case 3:
  520.                        if(ucWd3Update==1)  //窗口3要全部更新顯示
  521.                    {
  522.                                    ucWd3Update=0;  //及時(shí)清零標(biāo)志,避免一直進(jìn)來掃描
  523.                                    ucWd3Part1Update=1;  //局部時(shí)更新顯示
  524.                                    ucWd3Part2Update=1;  //局部分更新顯示
  525.                    }  
  526.                            
  527.                            if(ucWd3Part1Update == 1)
  528.                            {
  529.                                       ucWd3Part1Update = 0;

  530.                                    if(ucSetTepCnt1>=100)
  531.                                    {
  532.                                               ucTemp1 = ucSetTepCnt1/100;
  533.                                        ucTemp2 = ucSetTepCnt1/10%10;
  534.                                            ucTemp3 = ucSetTepCnt1%10;
  535.                                    }
  536.                                    else
  537.                                    {
  538.                                               ucTemp1 = ucSetTepCnt1/10;
  539.                                        ucTemp2 = ucSetTepCnt1%10;
  540.                                            ucTemp3 = 10;
  541.                                    }

  542.                                    ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  543.                                    ucDigShow2=ucTemp2; //數(shù)碼管顯示實(shí)際內(nèi)容
  544.                                    ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  545.                            }

  546.                            if(ucWd3Part2Update == 1)
  547.                            {
  548.                                        ucWd3Part2Update = 0;        
  549.                                         ucDigShow4 = 11;
  550.                            }

  551.                            switch(ucPart)
  552.                            {
  553.                                 case 0:  break;
  554.                                 case 1:
  555.                                          if(uiDpyTimeCnt==const_dpy_time_half)
  556.                                          {
  557.                                                         ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  558.                                                         ucDigShow2=ucTemp2;
  559.                                          }
  560.                                          else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  561.                                          {
  562.                                                         ucDpyTimeLock=1; //原子鎖加鎖
  563.                                                         uiDpyTimeCnt=0;   //及時(shí)把閃爍記時(shí)器清零
  564.                                                         ucDpyTimeLock=0;  //原子鎖解鎖
  565.                                                         ucDigShow1=10;   //數(shù)碼管顯示空,什么都不顯示
  566.                                                         ucDigShow2=10;
  567.         
  568.                                          }
  569.                                                  break;

  570.                            }
  571.                            break;

  572.                 case 4:        
  573.                        if(ucWd4Update==1)  //窗口4要全部更新顯示
  574.                    {
  575.                                    ucWd4Update=0;  //及時(shí)清零標(biāo)志,避免一直進(jìn)來掃描
  576.                                    ucWd4Part1Update=1;  //局部時(shí)更新顯示
  577.                                    ucWd4Part2Update=1;  //局部分更新顯示
  578.                    }  
  579.                            
  580.                            if(ucWd4Part1Update == 1)
  581.                            {
  582.                                       ucWd4Part1Update = 0;

  583.                                    if(ucAD_value_Tem>=100)
  584.                                    {
  585.                                               ucTemp1 = ucAD_value_Tem/100;
  586.                                        ucTemp2 = ucAD_value_Tem/10%10;
  587.                                            ucTemp3 = ucAD_value_Tem%10;
  588.                                    }
  589.                                    else
  590.                                    {
  591.                                               ucTemp1 = ucAD_value_Tem/10;
  592.                                        ucTemp2 = ucAD_value_Tem%10;
  593.                                            ucTemp3 = 10;
  594.                                    }

  595.                                    ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  596.                                    ucDigShow2=ucTemp2; //數(shù)碼管顯示實(shí)際內(nèi)容
  597.                                    ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  598.                            }

  599.                            if(ucWd4Part2Update == 1)
  600.                            {
  601.                                        ucWd4Part2Update = 0;        
  602.                                         ucDigShow4 = 11;
  603.                            }
  604.                 break;

  605.                 case 5:if(ucWd5Update==1)  //窗口5要全部更新顯示
  606.                    {
  607.                                    ucWd5Update=0;  //及時(shí)清零標(biāo)志,避免一直進(jìn)來掃描
  608.                                    ucWd5Part1Update=1;  //局部時(shí)更新顯示
  609.                    }  
  610.                            
  611.                            if(ucWd5Part1Update == 1)
  612.                            {
  613. //                                      ucWd5Part1Update = 0;
  614.                   
  615.                                    ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  616.                                    ucDigShow2=ucTemp2; //數(shù)碼管顯示實(shí)際內(nèi)容
  617.                                    ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  618.                                    ucDigShow4=ucTemp4; //數(shù)碼管顯示實(shí)際內(nèi)容

  619.                            }
  620.                            break;

  621.                  case 6:ucDigTimeLock = 1; //不顯示小數(shù)點(diǎn)
  622.                                 ucDigShow1=13; //數(shù)碼管顯示實(shí)際內(nèi)容
  623.                                 ucDigShow2=14; //數(shù)碼管顯示實(shí)際內(nèi)容
  624.                                 ucDigShow3=15; //數(shù)碼管顯示實(shí)際內(nèi)容
  625.                                 ucDigShow4=16; //數(shù)碼管顯示實(shí)際內(nèi)容

  626.                  break;
  627.       }
  628. }


  629. /********************************************************************************************
  630. 函數(shù)名稱:按鍵服務(wù)程序
  631. 功    能:按鍵處理的事務(wù)
  632. 返 回 值:無
  633. 時(shí)    間:2014-11-11        
  634. 備    注:
  635. **************************************************************************************************/
  636. void key_service(void) //按鍵服務(wù)的應(yīng)用程序
  637. {
  638.         switch(ucKeySec) //按鍵服務(wù)狀態(tài)切換
  639.         {
  640.                 case 1:// 加按鍵  
  641.                                 switch(ucWd)  //在不同的窗口下,設(shè)置不同的參數(shù)
  642.                                 {
  643.                                 
  644.                                 case 1:switch(ucPart) //在不同的局部變量下,相當(dāng)于二級(jí)菜單
  645.                                                 {
  646.                                                         case 1:  //時(shí)
  647.                                                                         ucHour++;
  648.                         
  649.                                                                         if(ucHour>23)
  650.                                                                         {
  651.                                                                                 ucHour=23;
  652.                                                                         }
  653.                                                                         ucWd1Part1Update=1;  //更新顯示                                               
  654.                                                                         break;
  655.         
  656.                                                         case 2: //分
  657.                                                                         ucMinute++;
  658.                                                                         if(ucMinute>59)
  659.                                                                         {
  660.                                                                                 ucMinute=59;
  661.                                                                         }
  662.                                                                         ucWd1Part2Update=1;  //更新顯示                                                      
  663.                                                                         break;
  664.                                                 }
  665.                                         break;

  666.                                  case 2:
  667.                                         switch(ucPart)
  668.                                                 {
  669.                                                         case 1:
  670.                                                               ucSetTimeCnt1++;
  671.                                                                   if(ucSetTimeCnt1>23)
  672.                                                                   {
  673.                                                                      ucSetTimeCnt1 = 23;
  674.                                                                   }

  675.                                                                   ucWd2Part1Update=1;  //更新顯示
  676.                                                                  break;

  677.                                                         case 2:
  678.                                                                    ucSetTimeCnt2++;
  679.                                                                   if(ucSetTimeCnt2>59)
  680.                                                                   {
  681.                                                                      ucSetTimeCnt2 = 59;
  682.                                                                   }
  683.                                                                   ucWd2Part2Update=1;  //更新顯示
  684.                                                               break;
  685.                                                 }
  686.                                  break;

  687.                                  case 3:
  688.                                        switch(ucPart)
  689.                                            {
  690.                                              
  691.                                                    case 1:
  692.                                                          ucSetTepCnt1++;
  693.                                                                  if(ucSetTepCnt1>125)
  694.                                                                  {
  695.                                                                      ucSetTepCnt1 = 125;
  696.                                                                  }
  697.                                                                  ucWd3Part1Update = 1;
  698.                                                    break;
  699.                                                    
  700.                                            }
  701.                                  break;

  702.                                 }
  703.         
  704.               ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  705.               uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
  706.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  707.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  708.               break;   
  709.         
  710.         
  711.                 case 2:// 減按鍵  
  712.                       switch(ucWd)  //在不同的窗口下,設(shè)置不同的參數(shù)
  713.                       {
  714.                                       case 1:
  715.                                 switch(ucPart) //在不同的局部變量下,相當(dāng)于二級(jí)菜單
  716.                                                 {
  717.                                                         case 1:  //時(shí)
  718.                                                                         ucHour--;
  719.                                                                         if(ucHour>23)
  720.                                                                         {
  721.                                                                                 ucHour=0;
  722.                                                                         }
  723.                                                                         ucWd1Part1Update=1;  //更新顯示                                               
  724.                                                                 break;
  725.         
  726.                                                         case 2: //分
  727.                                                                         ucMinute--;
  728.                                                                         if(ucMinute>59)
  729.                                                                         {
  730.                                                                                 ucMinute=0;
  731.                                                                         }
  732.                                                                         ucWd1Part2Update=1;  //更新顯示                                                      
  733.                                                                         break;
  734.                                                         }
  735.                                 break;
  736.                                    case 2:
  737.                                 switch(ucPart) //在不同的局部變量下,相當(dāng)于二級(jí)菜單
  738.                                                 {
  739.                                                         case 1:  //時(shí)
  740.                                                                         ucSetTimeCnt1--;
  741.                                                                         if(ucSetTimeCnt1>23)
  742.                                                                         {
  743.                                                                                 ucSetTimeCnt1=0;
  744.                                                                         }

  745.                                                                         ucWd2Part1Update=1;  //更新顯示                                               
  746.                                                                     break;
  747.         
  748.                                                         case 2: //分
  749.                                                                         ucSetTimeCnt2--;
  750.                                                                         if(ucSetTimeCnt2>59)
  751.                                                                         {
  752.                                                                                 ucSetTimeCnt2=0;
  753.                                                                         }
  754.                                                                         ucWd2Part2Update=1;  //更新顯示                                                      
  755.                                                                         break;
  756.                                                         }
  757.                                 break;
  758.                                        
  759.                                 case 3:        switch(ucPart)
  760.                                                 {
  761.                                                         
  762.                                                         case 1:
  763.                                                                 ucSetTepCnt1--;

  764.                                                                 if(ucSetTepCnt1>125)
  765.                                                                 {
  766.                                                                         ucSetTepCnt1 = 0;
  767.                                                                 }
  768.                                                                 ucWd3Part1Update = 1;
  769.                                                                 break;
  770.                                                         
  771.                                                         }
  772.                                                 break;


  773.                       }
  774.         
  775.               ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  776.               uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
  777.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  778.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  779.               break;
  780.                   
  781.                 case 3://短按設(shè)置按鍵
  782.                                 switch(ucWd)  //在不同的窗口下,設(shè)置不同的參數(shù)
  783.                                 {
  784.                                        
  785.                                         case 1:
  786.                                                 if(ucAlarmPrompt == 1)         //此時(shí)報(bào)警啟動(dòng)
  787.                                                         {
  788.                                                             ucAlarmPrompt = 0;          //報(bào)警關(guān)閉
  789.                                                         }

  790.                                                         if(ucPart>0) //在窗口2的時(shí)候,要第一次激活設(shè)置時(shí)間,必須是長按3秒才可以,這里短按激活不了第一次
  791.                                                         {
  792.                                                                 ucPart++;
  793.                                                                 if(ucPart>2)  //設(shè)置時(shí)間結(jié)束
  794.                                                                 {
  795.                                                                         ucPart=0;
  796.                                                                         /* 注釋五:
  797.                                                                         * 每個(gè)月份的天數(shù)最大值是不一樣的,在寫入ds1302時(shí)鐘芯片內(nèi)部數(shù)據(jù)前,應(yīng)該做一次調(diào)整。
  798.                                                                         * 有的月份最大28天,有的月份最大29天,有的月份最大30天,有的月份最大31天,
  799.                                                                         */                                                   
  800.                                                                         ucHourBCD=number_to_bcd(ucHour);  //原始數(shù)值轉(zhuǎn)BCD
  801.                                                                         ucMinuteBCD=number_to_bcd(ucMinute);  //原始數(shù)值轉(zhuǎn)BCD
  802.                                                                         ucSecondBCD=number_to_bcd(ucSecond);  //原始數(shù)值轉(zhuǎn)BCD

  803.                                                                         Write1302 (WRITE_PROTECT,0X00);          //禁止寫保護(hù)
  804.                                                                         Write1302 (WRITE_HOUR,ucHourBCD);        //小時(shí)修改
  805.                                                                         Write1302 (WRITE_MINUTE,ucMinuteBCD);    //分鐘修改
  806.                                                                         Write1302 (WRITE_SECOND,ucSecondBCD);    //秒位修改
  807.                                                                         Write1302 (WRITE_PROTECT,0x80);          //允許寫保護(hù)

  808.                                                                 }
  809.                                                                 ucWd1Update=1;  //窗口1更新顯示
  810.                                                         }
  811.                                                 break;

  812.                                            case 2:
  813.                                                         if(ucPart>0)
  814.                                                         {
  815.                                                                 ucPart++;
  816.                                                                 if(ucPart>2)
  817.                                                                 {
  818.                                                                ucPart = 1;
  819.                                                                    ucWd=3; //切換到第三個(gè)窗口,設(shè)置預(yù)定時(shí)
  820.                                                                    ucWd3Update=1;  //窗口3更新顯示
  821.                                                                 }
  822.                                                         }
  823.                                                         break;

  824.                                            case 3:
  825.                                                  if(ucPart>0)
  826.                                                          {
  827.                                                             ucPart++;
  828.                                                                 if(ucPart>1)
  829.                                                                 {
  830.                                                                     ucPart = 0;
  831.                                                                         ucWd = 4;  //切換到第四個(gè)窗口,
  832.                                                                         ucPart = 1;
  833.                                                                         ucDigTimeLock = 1;  //小數(shù)點(diǎn)不顯示
  834.                                                                 }
  835.                                                          }
  836.                                                         break;

  837.                                            case 4:
  838.                                                  if(ucPart>0)
  839.                                                          {
  840.                                                             ucPart++;
  841.                                                                 if(ucPart>1)
  842.                                                                 {
  843.                                                                     ucPart = 0;
  844.                                                                         ucWd = 1;
  845.                                                                         ucWd1Update = 1;
  846.                                                                         ucDigTimeLock = 0;  //顯示小數(shù)點(diǎn)
  847.                                                                         ucStartheat = 1;//啟動(dòng)加熱
  848.                                                                 }
  849.                                                          }

  850.                                                         break;
  851.                                 }
  852.         
  853.               ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  854.               uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
  855.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  856.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  857.               break;      
  858.                      
  859.                 case 4:
  860.                            if(ucBootScreen == 0)  //開機(jī)
  861.                            {
  862.                                         ucWd=1;
  863.                                         ucWd1Update=1;  //窗口1更新顯示
  864.                                         ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)
  865.                                         ucBootScreen = 1; //開關(guān)標(biāo)志位置1,為關(guān)機(jī)做準(zhǔn)備
  866.                            }
  867. //                                 if(ucBootScreen == 1)//關(guān)機(jī)
  868. //                           {
  869. //                                        ucWd=6;
  870. //                                        ucBootScreen = 0; //開關(guān)標(biāo)志位清零,為開機(jī)做準(zhǔn)備
  871. //                                        ucStartheat = 0; //停止加熱
  872. //                                        ucSetTimeCnt1 = 12; //復(fù)位默認(rèn)設(shè)的小時(shí)
  873. //                                    ucSetTimeCnt2 = 30; //復(fù)位默認(rèn)設(shè)的分鐘
  874. //                    ucSetTepCnt1 = 50; //復(fù)位默認(rèn)溫度值
  875. //                                        ucPart = 0;         //設(shè)置清零
  876. //                           }
  877.               ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  878.               uiVoiceCnt=const_voice_long; //按鍵聲音觸發(fā),滴一聲就停。
  879.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  880.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  881.                 break;

  882.                  case 5:
  883.                            if(ucBootScreen == 1)//關(guān)機(jī)
  884.                            {
  885.                                         ucWd=6;
  886.                                         ucBootScreen = 0; //開關(guān)標(biāo)志位清零,為開機(jī)做準(zhǔn)備
  887.                                         ucStartheat = 0; //停止加熱
  888.                                         ucSetTimeCnt1 = 12; //復(fù)位默認(rèn)設(shè)的小時(shí)
  889.                                     ucSetTimeCnt2 = 30; //復(fù)位默認(rèn)設(shè)的分鐘
  890.                     ucSetTepCnt1 = 50; //復(fù)位默認(rèn)溫度值
  891.                                         ucPart = 0;         //設(shè)置清零
  892.                            }
  893.               ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  894.               uiVoiceCnt=const_voice_long; //按鍵聲音觸發(fā),滴一聲就停。
  895.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  896.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  897.                 break;

  898.                 case 17://長按3秒設(shè)置按鍵
  899.                         switch(ucWd)  //在不同的窗口下,設(shè)置不同的參數(shù)
  900.                         {
  901.                                 case 1:
  902.                                                 if(ucPart==0) //處于非設(shè)置時(shí)間的狀態(tài)下,要第一次激活設(shè)置時(shí)間,必須是長按3秒才可以
  903.                                                 {
  904.                                                                 ucWd=2;
  905.                                                                 ucPart=1;  //進(jìn)入到設(shè)置日期的狀態(tài)下
  906.                                                                 ucWd2Update=1;  //窗口1更新顯示
  907.                                                 }
  908.                                                 break;
  909. //                                case 4:
  910. //                                       if(ucPart == 0)
  911. //                                           {
  912. //                                                      ucWd=2;
  913. //                                                   ucPart=1;  //進(jìn)入到設(shè)置時(shí)間的狀態(tài)下
  914. //                                                   ucWd2Update=1;  //窗口2更新顯示
  915. //                                           }
  916. //                                        break;
  917.                         }
  918.         
  919.               ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  920.               uiVoiceCnt=const_voice_long; //按鍵聲音觸發(fā),滴一聲就停。
  921.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  922.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  923.               break;  
  924.                   
  925.                  case 18:
  926.                        switch(ucWd)
  927.                            {
  928.                               case 0:break;
  929.                                   case 2:
  930.                                          ucPart = 0;
  931.                                             if(ucPart == 0&& ucStartheat == 0)          //處于非設(shè)置的情況下,長按設(shè)置系統(tǒng)時(shí)間
  932.                                                 {
  933.                                                     ucWd = 1;
  934.                                                         ucPart = 1;
  935.                                                         ucWd1Update = 1;
  936.                                                 }
  937.                                                 else if(ucPart == 0&&ucStartheat == 1)
  938.                                                 {
  939.                                                             //處于非設(shè)置的情況下,久長按退出定時(shí)恒溫?zé)崴?br />
  940.                                                     ucWd = 1;
  941. //                                                        ucPart = 1;
  942.                                                         ucWd1Update = 1;

  943.                                                         ucStartheat = 0; //停止加熱
  944.                                                         ucSetTimeCnt1 = 12; //復(fù)位默認(rèn)設(shè)的小時(shí)
  945.                                                     ucSetTimeCnt2 = 30; //復(fù)位默認(rèn)設(shè)的分鐘
  946.                             ucSetTepCnt1 = 50; //復(fù)位默認(rèn)溫度值
  947.                                                         ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)
  948.                                                 }
  949.                                   break;

  950.                            }

  951.                   ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  952.               uiVoiceCnt=const_voice_long; //按鍵聲音觸發(fā),滴一聲就停。
  953.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  954.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  955.       
  956.                  break;  
  957.         }         

  958. }

  959. /********************************************************************************************
  960. 函數(shù)名稱:DS1302采樣程序
  961. 功    能:讀取DS1302的數(shù)據(jù)
  962. 返 回 值:無
  963. 時(shí)    間:2014-11-11        
  964. 備    注:系統(tǒng)不用時(shí)時(shí)刻刻采集ds1302的內(nèi)部數(shù)據(jù),每隔一段時(shí)間更新采集一次就可以了。
  965.           這個(gè)間隔時(shí)間應(yīng)該小于或者等于1秒鐘的時(shí)間,否則在數(shù)碼管上看不到每秒鐘的時(shí)間變化。
  966. **************************************************************************************************/
  967. void ds1302_sampling(void) //ds1302采樣程序,內(nèi)部每秒鐘采集更新一次
  968. {
  969.    if(ucPart==0)  //當(dāng)系統(tǒng)不是處于設(shè)置日期和時(shí)間的情況下
  970.    {
  971.       ++uiSampingCnt;  //累計(jì)主循環(huán)次數(shù)的時(shí)間

  972.       if(uiSampingCnt>const_ds1302_sampling_time)  //每隔一段時(shí)間就更新采集一次Ds1302數(shù)據(jù)
  973.       {
  974.                         uiSampingCnt=0;
  975.                         ucHourBCD=Read1302(READ_HOUR); //讀取時(shí)
  976.                         ucMinuteBCD=Read1302(READ_MINUTE); //讀取分

  977.                         ucHour=bcd_to_number(ucHourBCD);  //BCD轉(zhuǎn)原始數(shù)值
  978.                         ucMinute=bcd_to_number(ucMinuteBCD);  //BCD轉(zhuǎn)原始數(shù)值
  979.                         ucWd1Update=1; //窗口1更新顯示時(shí)間
  980.       }
  981.   }
  982. }


  983. /********************************************************************************************
  984. 函數(shù)名稱:修改DS1302時(shí)間的驅(qū)動(dòng)程序
  985. 功    能:讀取DS1302的數(shù)據(jù)
  986. 返 回 值:無
  987. 時(shí)    間:2014-11-11        
  988. 備    注:此處寫的是BCD碼
  989. **************************************************************************************************/
  990. void Write1302 ( unsigned char addr, unsigned char dat )
  991. {
  992.      
  993.          unsigned char i,temp;//單片機(jī)驅(qū)動(dòng)DS1302屬于SPI通訊方式,根據(jù)我的經(jīng)驗(yàn),不用關(guān)閉中斷
  994.      DS1302_CE_dr=0;      //CE引腳為低,數(shù)據(jù)傳送中止
  995.      delay_short(1);           
  996.      SCLK_dr=0;           //清零時(shí)鐘總線
  997.      delay_short(1);
  998.      DS1302_CE_dr = 1;    //CE引腳為高,邏輯控制有效
  999.      delay_short(1);
  1000.      for ( i=0; i<8; i++ )//循環(huán)8次移位
  1001.      {
  1002.         DIO_dr_sr = 0;
  1003.         temp = addr;
  1004.         if(temp&0x01)
  1005.         {
  1006.             DIO_dr_sr =1;
  1007.         }
  1008.         else
  1009.         {
  1010.             DIO_dr_sr =0;
  1011.         }
  1012.         delay_short(1);
  1013.         addr >>= 1;                                           //右移一位
  1014.         SCLK_dr = 1;
  1015.         delay_short(1);
  1016.         SCLK_dr = 0;
  1017.         delay_short(1);
  1018.      }
  1019.      //發(fā)送數(shù)據(jù)

  1020.      for ( i=0; i<8; i++ )                                    //循環(huán)8次移位
  1021.      {
  1022.         DIO_dr_sr = 0;
  1023.         temp = dat;
  1024.         if(temp&0x01)
  1025.         {
  1026.             DIO_dr_sr =1;
  1027.         }
  1028.         else
  1029.         {
  1030.            DIO_dr_sr =0;
  1031.         }
  1032.         delay_short(1);
  1033.         dat >>= 1;                                             //右移一位
  1034.         SCLK_dr = 1;
  1035.         delay_short(1);
  1036.         SCLK_dr = 0;
  1037.         delay_short(1);
  1038.      }
  1039.      DS1302_CE_dr = 0;
  1040.      delay_short(1);
  1041. }         


  1042. /********************************************************************************************
  1043. 函數(shù)名稱:讀取DS1302時(shí)間的驅(qū)動(dòng)程序
  1044. 功    能:讀取DS1302的數(shù)據(jù)
  1045. 返 回 值:無
  1046. 時(shí)    間:2014-11-11        
  1047. 備    注:此處讀的是BCD碼
  1048. **************************************************************************************************/
  1049. unsigned char Read1302 ( unsigned char addr )
  1050. {
  1051.     unsigned char i,temp,dat1;
  1052.     DS1302_CE_dr=0;      //單片機(jī)驅(qū)動(dòng)DS1302屬于SPI通訊方式,根據(jù)我的經(jīng)驗(yàn),不用關(guān)閉中斷
  1053.     delay_short(1);
  1054.     SCLK_dr=0;
  1055.     delay_short(1);
  1056.     DS1302_CE_dr = 1;
  1057.     delay_short(1);
  1058.     for ( i=0; i<8; i++ )                                      //循環(huán)8次移位
  1059.     {
  1060.        DIO_dr_sr = 0;
  1061.        temp = addr;
  1062.        if(temp&0x01)
  1063.        {
  1064.           DIO_dr_sr =1;
  1065.        }
  1066.        else
  1067.        {
  1068.           DIO_dr_sr =0;
  1069.        }
  1070.        delay_short(1);
  1071.        addr >>= 1;                                             //右移一位
  1072.        SCLK_dr = 1;
  1073.        delay_short(1);
  1074.        SCLK_dr = 0;
  1075.        delay_short(1);
  1076.     }

  1077. /********************************************************************************************
  1078. 注    釋:51單片機(jī)IO口的特點(diǎn),在讀取數(shù)據(jù)之前必須先輸出高電平,
  1079.           如果是PIC,AVR等單片機(jī),這里應(yīng)該把IO方向寄存器設(shè)置為輸入
  1080. 時(shí)    間:2014-11-11        
  1081. **************************************************************************************************/
  1082.    DIO_dr_sr =1;   //51單片機(jī)IO口的特點(diǎn),在讀取數(shù)據(jù)之前必須先輸出高電平,
  1083.    temp=0;

  1084.    for ( i=0; i<8; i++ )
  1085.    {
  1086.       temp>>=1;
  1087.       if(DIO_dr_sr==1)
  1088.       {
  1089.          temp=temp+0x80;
  1090.       }

  1091.       DIO_dr_sr =1;  //51單片機(jī)IO口的特點(diǎn),在讀取數(shù)據(jù)之前必須先輸出高電平
  1092.       delay_short(1);
  1093.       SCLK_dr = 1;
  1094.       delay_short(1);
  1095.       SCLK_dr = 0;
  1096.       delay_short(1);
  1097.     }

  1098.     DS1302_CE_dr=0;
  1099.     delay_short(1);
  1100.     dat1=temp;
  1101.     return (dat1);
  1102. }

  1103. /********************************************************************************************
  1104. 函數(shù)名稱:BCD轉(zhuǎn)原始數(shù)值程序
  1105. 功    能:
  1106. 返 回 值:無
  1107. 時(shí)    間:2014-11-11        
  1108. 備    注:
  1109. **************************************************************************************************/
  1110. unsigned char bcd_to_number(unsigned char ucBcdTemp)  //BCD轉(zhuǎn)原始數(shù)值
  1111. {
  1112.    unsigned char ucNumberResult=0;
  1113.    unsigned char ucBcdTemp10;
  1114.    unsigned char ucBcdTemp1;

  1115.    ucBcdTemp10=ucBcdTemp;
  1116.    ucBcdTemp10=ucBcdTemp10>>4;
  1117.    ucBcdTemp1=ucBcdTemp;
  1118.    ucBcdTemp1=ucBcdTemp1&0x0f;
  1119.    ucNumberResult=ucBcdTemp10*10+ucBcdTemp1;
  1120.    return ucNumberResult;
  1121. }


  1122. /********************************************************************************************
  1123. 函數(shù)名稱:原始數(shù)值轉(zhuǎn)換成BCD碼
  1124. 功    能:
  1125. 返 回 值:無
  1126. 時(shí)    間:2014-11-11        
  1127. 備    注:
  1128. **************************************************************************************************/
  1129. unsigned char number_to_bcd(unsigned char ucNumberTemp) //原始數(shù)值轉(zhuǎn)BCD
  1130. {
  1131.    unsigned char ucBcdResult=0;
  1132.    unsigned char ucNumberTemp10;
  1133.    unsigned char ucNumberTemp1;

  1134.    ucNumberTemp10=ucNumberTemp;
  1135.    ucNumberTemp10=ucNumberTemp10/10;
  1136.    ucNumberTemp10=ucNumberTemp10<<4;
  1137.    ucNumberTemp10=ucNumberTemp10&0xf0;
  1138.    ucNumberTemp1=ucNumberTemp;
  1139.    ucNumberTemp1=ucNumberTemp1%10;
  1140.    ucBcdResult=ucNumberTemp10|ucNumberTemp1;
  1141.    return ucBcdResult;
  1142. }

  1143. /********************************************************************************************
  1144. 函數(shù)名稱:DS1302備用電池電量用完報(bào)警程序
  1145. 功    能:DS1302備用電池電量用完后,蜂鳴器在0.5S發(fā)也鳴叫
  1146. 返 回 值:無
  1147. 時(shí)    間:2014-11-11        
  1148. 備    注:
  1149. **************************************************************************************************/
  1150. void ds1302_alarm_service(void) //ds1302出錯(cuò)報(bào)警
  1151. {
  1152.     if(ucDs1302Error==1)  //備用電池的電量用完了報(bào)警提示         
  1153.     {
  1154.            if(uiDs1302Cnt>const_ds1302_0_5s)  //大概0.5秒鐘蜂鳴器響一次
  1155.            {
  1156.                                 ucDs1302Lock=1;  //原子鎖加鎖
  1157.                                 uiDs1302Cnt=0; //計(jì)時(shí)器清零
  1158.                                 uiVoiceCnt=const_voice_short; //蜂鳴器聲音觸發(fā),滴一聲就停。
  1159.                                 ucDs1302Lock=0;  //原子鎖解鎖
  1160.            }
  1161.    }
  1162. }

  1163. /********************************************************************************************
  1164. 函數(shù)名稱:熱水完畢報(bào)警程序
  1165. 功    能:熱水完畢后,發(fā)出報(bào)警聲
  1166. 返 回 值:無
  1167. 時(shí)    間:2014-11-14        
  1168. 備    注:
  1169. **************************************************************************************************/
  1170. void ucAlarmPrompt_service()
  1171. {
  1172.     static        unsigned int uiAlarmPromptCnt;        //報(bào)警延時(shí)計(jì)數(shù)器
  1173.         static  unsigned char ucNumberCnt;                //報(bào)警次數(shù)計(jì)數(shù)器
  1174.         static  unsigned int const_time_2s = 400; //報(bào)警的時(shí)間間隔
  1175.         static  unsigned int const_voice_AlarmPrompt = 200;

  1176.    if(ucAlarmPrompt == 1)                                        //報(bào)警標(biāo)志位置位后報(bào)警
  1177.    {
  1178.        uiAlarmPromptCnt++;                                        //報(bào)警延時(shí)計(jì)數(shù)器自加1

  1179.        if(uiAlarmPromptCnt>const_time_2s)        //2S發(fā)出報(bào)警聲音
  1180.            {
  1181.                       uiAlarmPromptCnt = 0;                        //報(bào)警延時(shí)計(jì)數(shù)器清零
  1182.                    uiVoiceCnt=const_voice_AlarmPrompt;                //
  1183.                    ucNumberCnt++;                                        //報(bào)警次數(shù)計(jì)數(shù)器加1
  1184.                   
  1185.                    if(ucNumberCnt == 5)                        //報(bào)警次數(shù)為10次
  1186.                    {
  1187.                               ucNumberCnt = 0;                                //報(bào)警次數(shù)計(jì)數(shù)器清零
  1188.                            ucAlarmPrompt = 0;                        //關(guān)閉報(bào)警
  1189.                    }
  1190.            }
  1191.    }
  1192. }

  1193. /********************************************************************************************
  1194. 函數(shù)名稱:數(shù)碼管顯示驅(qū)動(dòng)程序
  1195. 功    能:顯示對(duì)應(yīng)的時(shí)間
  1196. 返 回 值:無
  1197. 時(shí)    間:2014-11-11        
  1198. 備    注:
  1199. **************************************************************************************************/
  1200. void display()
  1201. {
  1202.         switch(ucDigStep)          //步驟變量
  1203.         {
  1204.            case 1:
  1205.                  P0 = array[ucDigShow1];                  //第一位數(shù)碼管顯示的內(nèi)容
  1206.                          dig1_dr = 0;
  1207.                          delay(10);
  1208.                          dig1_dr = 1;
  1209.                          ucDigStep = 2;
  1210.            break;

  1211.            case 2:
  1212.                             P0 = array[ucDigShow2];                  //第二位數(shù)碼管顯示的內(nèi)容
  1213.                          dig2_dr = 0;
  1214.                          delay(10);
  1215.                          dig2_dr = 1;
  1216.                          ucDigStep = 3;
  1217.            break;

  1218.            case 3:
  1219.                             P0 = array[ucDigShow3];                  //第三位數(shù)碼管顯示的內(nèi)容
  1220.                          dig3_dr = 0;
  1221.                          delay(10);
  1222.                          dig3_dr = 1;
  1223.                          ucDigStep = 4;
  1224.            break;

  1225.            case 4:
  1226.                             P0 = array[ucDigShow4];                  //第四位數(shù)碼管顯示的內(nèi)容
  1227.                          dig4_dr = 0;
  1228.                          delay(10);
  1229.                          dig4_dr = 1;
  1230.                          ucDigStep =1;
  1231.            break;
  1232.         }         
  1233. }


  1234. /********************************************************************************************
  1235. 函數(shù)名稱:熱水時(shí)間和溫度數(shù)據(jù)對(duì)比
  1236. 功    能:將設(shè)定的時(shí)間于當(dāng)前的時(shí)間作對(duì)比,數(shù)據(jù)正確執(zhí)行。
  1237. 返 回 值:無
  1238. 時(shí)    間:2014-11-11        
  1239. 備    注:
  1240. **************************************************************************************************/
  1241. void TimeData_contrast()
  1242. {
  1243.         static unsigned char preser_heat = 0;        //保溫標(biāo)志位
  1244.         static unsigned char  ucCheakFault = 0;                //故障檢查標(biāo)志位
  1245.         static unsigned char ucTimeEqual = 0;       //設(shè)定時(shí)間相等的標(biāo)志位
  1246.         static unsigned char ucTimeAfter  = 0;      //兩分鐘前的時(shí)間
  1247.         static unsigned char ucTepAfter  = 0;      //兩分鐘前的時(shí)間

  1248.         if(ucStartheat == 1&&ucPart == 0)   //開始預(yù)設(shè)加熱標(biāo)志
  1249.         {
  1250.                 if((ucHour == ucSetTimeCnt1) && (ucMinute == ucSetTimeCnt2)&&ucTimeEqual == 0)  //設(shè)定的時(shí)間相等
  1251.             {
  1252. //                        ucStartheat = 1;//啟動(dòng)加熱標(biāo)志位
  1253.                         ucWd = 4;                  //更新到窗口4,顯示溫度
  1254.                         ucWd4Update = 1;
  1255.                         ucDigTimeLock = 1;  //小數(shù)點(diǎn)不顯示

  1256.                         relay_dr = 1;        //繼電器輸出高(吸合)
  1257.                         ucCheakFault = 1;//故障檢查
  1258.                         ucTimeEqual = 1;//時(shí)間對(duì)比完成
  1259.                         ucTimeAfter         = 0;//先對(duì)變量清零
  1260.                         ucTepAfter         = 0;//先對(duì)變量清零
  1261.                         ucTimeAfter = ucMinute;
  1262.                         ucTepAfter = ucAD_value_Tem;
  1263. //                        ucAlarmPrompt = 1;  //故障報(bào)警
  1264.                 }

  1265.                 if(ucCheakFault == 1&&(ucTimeAfter+3) == ucMinute)
  1266.                 {
  1267.                         if(ucAD_value_Tem>=(ucTepAfter+2))
  1268.                         {
  1269.                            ucCheakFault = 0;   //故障檢測(cè)清零,只做一次檢測(cè)
  1270.                            ucTimeEqual = 0;//時(shí)間對(duì)比完成標(biāo)志清零,為下一次做準(zhǔn)備

  1271.                         }
  1272.                         else
  1273.                         {
  1274.                                 relay_dr = 0;        //繼電器輸出(斷開)

  1275.                                 ucWd = 5;                  //更新到窗口5,顯示錯(cuò)誤代碼E001
  1276.                                 ucWd5Update = 1;

  1277.                                 ucTemp1 = 12; //E
  1278.                                 ucTemp2 = 0;  //0
  1279.                                 ucTemp3 = 0;  //0
  1280.                                 ucTemp4 = 1;  //1

  1281.                                 ucDigTimeLock = 1;  //小數(shù)點(diǎn)不顯示
  1282.                                 ucAlarmPrompt = 1;  //故障報(bào)警
  1283.                                 ucCheakFault = 0;   //故障檢測(cè)清零,只做一次檢測(cè)
  1284.                                 ucStartheat = 0;  //檢測(cè)到有故障,停止加熱
  1285.                         }
  1286.                         
  1287.                 }

  1288.                 if(ucAD_value_Tem>=ucSetTepCnt1)        //設(shè)定到加熱溫度相等         
  1289.             {
  1290.                         ucStartheat = 0;//停止預(yù)設(shè)加熱標(biāo)志
  1291.                         relay_dr = 0;        //繼電器輸出(斷開)

  1292. //                        ucCheakFault = 0;//故障檢查標(biāo)志清零,為下一次做準(zhǔn)備

  1293.                         ucAlarmPrompt = 1; //報(bào)警標(biāo)志位置1,啟動(dòng)報(bào)警
  1294.                         preser_heat = 1;   //執(zhí)行保溫標(biāo)志位,開始進(jìn)行保溫

  1295.                         ucWd = 1;                //切換到窗口1顯示時(shí)間
  1296.                         ucWd1Update = 1;//更新窗口1
  1297.                         ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)
  1298.                 }

  1299.         }
  1300.         
  1301.         if(preser_heat == 1)        //保溫程序,開始執(zhí)行
  1302.         {
  1303.                 if((ucSetTepCnt1-5) >= ucAD_value_Tem)
  1304.                 {
  1305.                            relay_dr = 1;        //繼電器輸出

  1306.                         ucWd = 4;                //切換到窗口4顯示時(shí)間
  1307.                         ucWd4Update = 1;//更新窗口4
  1308.                         ucDigTimeLock = 1; //不顯示小數(shù)點(diǎn)

  1309.                 }

  1310.                 if((ucSetTepCnt1+5) <= ucAD_value_Tem)
  1311.                 {
  1312.                         relay_dr = 0;        //繼電器輸出

  1313.                         ucWd = 1;                //切換到窗口1顯示時(shí)間
  1314.                         ucWd1Update = 1;//更新窗口1
  1315.                         ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)

  1316.                 }
  1317.         }
  1318. }


  1319. /********************************************************************************************
  1320. 函數(shù)名稱:ADC采樣程序
  1321. 功    能:讀取ADC0832轉(zhuǎn)換后的數(shù)據(jù)
  1322. 返 回 值:
  1323. 時(shí)    間:2014-11-24        
  1324. 備    注:
  1325. **************************************************************************************************/
  1326. void ADC_sampling_service()
  1327. {
  1328.         static unsigned char i = 0;  //讀取數(shù)據(jù)8位的次數(shù)變量
  1329.         static unsigned char ucADC;  //AD值
  1330.         static unsigned char ucCheckADC; //校驗(yàn)的AD值
  1331.         static unsigned int ucTemp;   //參與換算的中間變量
  1332.         static unsigned int uiTempFilterV=0; //參與換算的中間變量
  1333. //    static unsigned long ulBackupFilterV=255;  //備份最新采樣數(shù)據(jù)的中間變量
  1334. //        static unsigned int  uiTimpFilterTep = 0;
  1335.         static unsigned char wendu;
  1336.         static unsigned int Adresult;
  1337.     static unsigned char ucSamplingCnt=0; //統(tǒng)計(jì)采樣的次數(shù)  本程序采樣8次后求平均值

  1338.         adc0832_CS_dr = 0;        //使能端置低

  1339.         adc0832_DI_sr_dr = 1;  //起始位
  1340.         adc0832_CLK_dr = 0;           //輸出低電平
  1341.         delay_short(1);                   //小延時(shí)
  1342.         adc0832_CLK_dr = 1;           //輸出高電平

  1343.         adc0832_DI_sr_dr = 1;  //選擇通道,輸出數(shù)據(jù)1
  1344.         adc0832_CLK_dr = 0;
  1345.         adc0832_CLK_dr = 1;

  1346.         adc0832_DI_sr_dr = 0;  //選擇通道。輸出數(shù)據(jù)0
  1347.         adc0832_CLK_dr = 0;
  1348.         adc0832_CLK_dr = 1;

  1349.     adc0832_DI_sr_dr = 1;  //拉高數(shù)據(jù)線
  1350.         delay_short(2);                   //延時(shí)

  1351.         adc0832_CLK_dr = 1;           //一個(gè)下降延
  1352.         adc0832_CLK_dr = 0;
  1353.         delay_short(1);

  1354.         for(i = 0;i<8;i++)                //讀取8位
  1355.         {
  1356.             ucADC <<= 1;
  1357.             adc0832_CLK_dr = 1;
  1358.             adc0832_CLK_dr = 0;

  1359.                 if(adc0832_DI_sr_dr == 1)
  1360.                 {
  1361.                    ucADC  |= 0x01;
  1362.                 }

  1363.         }

  1364.         for(i=0;i<8;i++)                //讀取校驗(yàn)位
  1365.         {
  1366.            ucCheckADC >>= 1;

  1367.            if(adc0832_DI_sr_dr == 1)
  1368.            {
  1369.                ucCheckADC |= 0x80;
  1370.            }
  1371.            adc0832_CLK_dr = 1;
  1372.            adc0832_CLK_dr = 0;

  1373.         }
  1374.         
  1375.         adc0832_CS_dr = 1;                //拉高使能端

  1376.         if(ucADC == ucCheckADC)        //校驗(yàn)兩個(gè)讀取的數(shù)據(jù)是否一致
  1377.         {
  1378.         ucTemp=ucADC; //把char類型數(shù)據(jù)賦值給long類型數(shù)據(jù),參與乘除法運(yùn)算的數(shù)據(jù),為了避免運(yùn)算結(jié)果溢出,我都用long類型


  1379.                 uiTempFilterV=uiTempFilterV+ucTemp;  //累加8次后求平均值
  1380.                 ucSamplingCnt++;  //統(tǒng)計(jì)已經(jīng)采樣累計(jì)的次數(shù)

  1381.                 if(ucSamplingCnt>=8)
  1382.                 {

  1383. /* 注釋二:
  1384. * 求平均值濾波法,為了得到的數(shù)據(jù)更加圓滑,去除小毛刺。
  1385. * 向右邊移動(dòng)3位相當(dāng)于除以8。
  1386. */

  1387. //                     uiTempFilterV=uiTempFilterV>>3; //求平均值濾波法


  1388.                                     Adresult=(255000/uiTempFilterV)-100;//求得當(dāng)前溫度對(duì)應(yīng)的阻值,十歐為單位,此公式的演變請(qǐng)看上述詳細(xì)說明

  1389. //                                     if(ulBackupFilterV>=20)  //最近備份的上一次數(shù)據(jù)大于等于0.02V的情況下
  1390. //                    {
  1391. //                                                if(Adresult<(ulBackupFilterV-5)||Adresult>(ulBackupFilterV+5)) //在正負(fù)0.020V偏差范圍外,更新
  1392. //                                                {
  1393. //                                                        ulBackupFilterV=Adresult;  //備份最新采樣的數(shù)據(jù),方便下一次對(duì)比判斷
  1394. //                                                        uiTimpFilterTep=Adresult; //得到經(jīng)過濾波處理的實(shí)時(shí)電壓值
  1395. ////                                                        ucWd4Part1Update=1; //局部更新顯示經(jīng)過濾波處理的電壓
  1396. //                                                }
  1397. //                    }
  1398. //                    else   //最近備份的上一次數(shù)據(jù)小于0.02V的情況下
  1399. //                    {
  1400. //                                                if(uiTempFilterV>(ulBackupFilterV+2))  //在正0.020V偏差范圍外,更新
  1401. //                                                {
  1402. //                                                        ulBackupFilterV=Adresult;  //備份最新采樣的數(shù)據(jù),方便下一次對(duì)比判斷
  1403. //                                                        uiTimpFilterTep=Adresult; //得到經(jīng)過濾波處理的實(shí)時(shí)電壓值
  1404. ////                                                        ucWd4Part1Update=1; //局部更新顯示經(jīng)過濾波處理的電壓
  1405. //                                                }
  1406. //                  
  1407. //                    }

  1408.                                          wendu = 0;//清零

  1409.                                          while(1)
  1410.                                          {
  1411.                                              if(Adresult>=wendu_tab[wendu])
  1412.                                                  {
  1413.                                                         break;
  1414.                                                  }

  1415.                                                  wendu++;

  1416.                                                  if(wendu>=105)
  1417.                                                  {
  1418.                                                      wendu = 105;
  1419.                                                          break;
  1420.                                                  }
  1421.                                                 
  1422.                                          }

  1423.                                         ucAD_value_Tem = wendu;

  1424.                     ucSamplingCnt=0;  //清零,為下一輪采樣濾波作準(zhǔn)備。
  1425.                     uiTempFilterV=0;
  1426.                 }
  1427.         
  1428.         }
  1429.         else
  1430.         {
  1431.             ucADC = 0;                        //兩次讀取的數(shù)據(jù)不一致,就把數(shù)據(jù)清零
  1432.                 ucAD_value_Tem = wendu;

  1433.         }
  1434.     ucWd4Update = 1;//更新窗口4

  1435. }


  1436. /********************************************************************************************
  1437. 函數(shù)名稱:定時(shí)器中斷程序
  1438. 功    能:
  1439. 返 回 值:無
  1440. 時(shí)    間:2014-11-11        
  1441. 備    注:
  1442. **************************************************************************************************/
  1443. void T0_time() interrupt 1
  1444. {

  1445.    TF0=0;  //清除中斷標(biāo)志
  1446.    TR0=0; //關(guān)中斷
  1447.    display();                 //數(shù)碼管顯示放在中斷里
  1448.    key_scan();                 //按鍵掃描放在中斷里
  1449. /********************************************************************************************
  1450. 功    能:按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器在外部可以關(guān)閉,不開啟計(jì)時(shí)功能
  1451. 時(shí)    間:2014-11-11        
  1452. **************************************************************************************************/
  1453.    if(ucKeyStartFlag1==1)           //啟動(dòng)計(jì)數(shù)器
  1454.    {
  1455.        if(uiKeyTimeCnt1<0xffff)//防止計(jì)數(shù)器超出范圍
  1456.            {
  1457.                uiKeyTimeCnt1++;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器自加1
  1458.            }   
  1459.    }

  1460. /********************************************************************************************
  1461. 功    能:按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器在外部可以關(guān)閉,不開啟計(jì)時(shí)功能
  1462. 時(shí)    間:2014-11-11        
  1463. **************************************************************************************************/
  1464.    if(ucKeyStartFlag2==1)          //啟動(dòng)計(jì)數(shù)器
  1465.    {
  1466.        if(uiKeyTimeCnt2<0xffff)        //防止計(jì)數(shù)器超出范圍
  1467.            {
  1468.                uiKeyTimeCnt2++;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器自加1
  1469.            }
  1470.    }

  1471. /********************************************************************************************
  1472. 功    能:按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器在外部可以關(guān)閉,不開啟計(jì)時(shí)功能
  1473. 時(shí)    間:2014-11-11        
  1474. **************************************************************************************************/
  1475.    if(ucKeyStartFlag3==1)          //啟動(dòng)計(jì)數(shù)器
  1476.    {
  1477.        if(uiKeyTimeCnt3<0xffff)        //防止計(jì)數(shù)器超出范圍
  1478.            {
  1479.                uiKeyTimeCnt3++;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器自加1
  1480.            }
  1481.    }

  1482. /********************************************************************************************
  1483. 功    能:按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器在外部可以關(guān)閉,不開啟計(jì)時(shí)功能
  1484. 時(shí)    間:2014-11-11        
  1485. **************************************************************************************************/
  1486.    if(ucKeyStartFlag4==1)          //啟動(dòng)計(jì)數(shù)器
  1487.    {
  1488.        if(uiKeyTimeCnt3<0xffff)        //防止計(jì)數(shù)器超出范圍
  1489.            {
  1490.                uiKeyTimeCnt4++;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器自加1
  1491.            }
  1492.    }

  1493. /********************************************************************************************
  1494. 功    能:間歇性蜂鳴器報(bào)警計(jì)數(shù)器在外部可以關(guān)閉,不開啟計(jì)時(shí)功能
  1495. 時(shí)    間:2014-11-11        
  1496. **************************************************************************************************/
  1497.     if(ucDs1302Error>0) //EEPROM出錯(cuò)
  1498.         {
  1499.                 if(ucDs1302Lock==0)//原子鎖判斷
  1500.                 {
  1501.                         uiDs1302Cnt++;  //間歇性蜂鳴器報(bào)警的計(jì)時(shí)器
  1502.                 }
  1503.         }

  1504. /********************************************************************************************
  1505. 功    能:蜂鳴器驅(qū)動(dòng)放在中斷里面
  1506. 時(shí)    間:2014-11-11        
  1507. **************************************************************************************************/
  1508.    if(uiVoiceCnt!=0)   //蜂鳴器
  1509.    {
  1510.        uiVoiceCnt--;  //每次進(jìn)入定時(shí)中斷都自減1,直到等于零為止。才停止鳴叫
  1511.            beep_dr = 0;          //蜂鳴器是PNP三極管控制,低電平就開始鳴叫
  1512.    }
  1513.    else
  1514.    {
  1515.        beep_dr = 1;   //蜂鳴器是PNP三極管控制,高電平就停止鳴叫。
  1516.    }


  1517.         TH0=0xf8;   //重裝初始值(65535-2000)=63535=0xf82f
  1518.         TL0=0x2f;
  1519.         EA = 1;
  1520.         ET0 = 1;
  1521.         TR0=1;  //開中斷
  1522. }


  1523. /********************************************************************************************
  1524. 函數(shù)名稱:定時(shí)器初始化程序
  1525. 功    能:
  1526. 返 回 值:無
  1527. 時(shí)    間:2014-11-11        
  1528. 備    注:
  1529. **************************************************************************************************/
  1530. void T0_init()
  1531. {
  1532.    TH0=0xf8;   //重裝初始值(65535-2000)=63535=0xf82f
  1533.    TL0=0x2f;
  1534.    EA = 1;
  1535.    ET0 = 1;
  1536.    TR0=1;  //開中斷

  1537.    /* 注釋七:
  1538.         * 檢查ds1302芯片的備用電池電量是否用完了。
  1539.         * 在上電的時(shí)候,在一個(gè)特定的地址里把數(shù)據(jù)讀出來,如果發(fā)現(xiàn)不等于0x5a,
  1540.         * 則是因?yàn)閭溆秒姵仉娏坑猛炅,?dǎo)致保存在ds1302內(nèi)部RAM數(shù)據(jù)區(qū)的數(shù)據(jù)被更改,
  1541.         * 與此同時(shí),應(yīng)該重新寫入一次0x5a,為下一次通電判斷做準(zhǔn)備
  1542.         */
  1543.         ucCheckDs1302=Read1302(READ_CHECK); //判斷ds1302內(nèi)部的數(shù)據(jù)是否被更改
  1544.         if(ucCheckDs1302!=0x5a)  
  1545.         {
  1546.                 Write1302 (WRITE_PROTECT,0X00);          //禁止寫保護(hù)
  1547.                 Write1302 (WRITE_CHECK,0x5a);            //重新寫入標(biāo)志數(shù)據(jù),方便下一次更換新電池后的判斷
  1548.                 Write1302 (WRITE_PROTECT,0x80);          //允許寫保護(hù)
  1549.                 ucDs1302Error = 1;                                //1表示報(bào)警啟動(dòng)
  1550.                 ucWd = 5;                  //更新到窗口5,顯示錯(cuò)誤代碼E001
  1551.                 ucWd5Update = 1;
  1552.                
  1553.                 ucTemp1 = 12; //E
  1554.                 ucTemp2 = 0;  //0
  1555.                 ucTemp3 = 0;  //0
  1556.                 ucTemp4 = 2;  //1
  1557.                
  1558.                 ucDigTimeLock = 1;  //小數(shù)點(diǎn)不顯示

  1559.         }
  1560. }


  1561. /********************************************************************************************
  1562. 函數(shù)名稱:初始化單片機(jī)內(nèi)部和外部IO口
  1563. 功    能:
  1564. 返 回 值:無
  1565. 時(shí)    間:2014-11-11        
  1566. 備    注:
  1567. **************************************************************************************************/
  1568. void initial_myself(void)  //第一區(qū) 初始化單片機(jī)
  1569. {
  1570.         beep_dr=1; //用PNP三極管控制蜂鳴器,輸出高電平時(shí)不叫。
  1571.         relay_dr = 0;
  1572.         dig1_dr = 1;
  1573.         dig2_dr = 1;
  1574.         dig3_dr = 1;
  1575.         dig4_dr = 1;
  1576.         delay_long(30);
  1577. }


  1578. /********************************************************************************************
  1579. 函數(shù)名稱:延時(shí)程序
  1580. 功    能:
  1581. 返 回 值:無
  1582. 時(shí)    間:2014-11-11        
  1583. 備    注:
  1584. **************************************************************************************************/
  1585. void delay(unsigned int delay_ms)                  //延時(shí)函數(shù)
  1586. {
  1587.     unsigned int i,j;

  1588.         for(i = delay_ms;i>0;i--)
  1589.            for(j = 10;j>0;j--);
  1590. }

  1591. /********************************************************************************************
  1592. 函數(shù)名稱:延時(shí)程序
  1593. 功    能:
  1594. 返 回 值:無
  1595. 時(shí)    間:2014-11-11        
  1596. 備    注:
  1597. **************************************************************************************************/
  1598. void delay_short(unsigned int uiDelayShort)
  1599. {
  1600.    unsigned int i;  

  1601.    for(i=0;i<uiDelayShort;i++)
  1602.    {
  1603.       ;   //一個(gè)分號(hào)相當(dāng)于執(zhí)行一條空語句
  1604.    }
  1605. }

  1606. /********************************************************************************************
  1607. 函數(shù)名稱: 延時(shí)程序
  1608. 功    能:
  1609. 返 回 值:無
  1610. 時(shí)    間:2014-11-11        
  1611. 備    注:
  1612. **************************************************************************************************/
  1613. void delay_long(unsigned int uiDelayLong)
  1614. {
  1615.    unsigned int i;
  1616.    unsigned int j;

  1617.    for(i=uiDelayLong;i>0;i--)
  1618.       for(j=50;j>0;j--);  //內(nèi)嵌循環(huán)的空指令數(shù)量
  1619. }
復(fù)制代碼



由于水平能力有限,紕漏之處,還望各位讀者指出。。。。。。。
















IMG_20141202_151857.jpg (1.66 MB, 下載次數(shù): 398)

IMG_20141202_151857.jpg

IMG_20141202_151918.jpg (1.5 MB, 下載次數(shù): 391)

IMG_20141202_151918.jpg

作者: admin    時(shí)間: 2014-12-3 15:20
下面是樓主的程序:
  1. /********************************************************************************************
  2. 名    稱:智能熱水器控制系統(tǒng)
  3. 功    能:
  4.           1、數(shù)碼管顯示當(dāng)前北京時(shí)間。可對(duì)時(shí)間進(jìn)行修改。
  5.                   2、設(shè)定時(shí)間,到達(dá)設(shè)定的時(shí)間開始加熱。
  6.                   3、設(shè)定溫度,到達(dá)設(shè)定的溫度值,停止加熱。
  7.                   4、加熱完畢后,蜂鳴器報(bào)警提示,溫度控制在設(shè)定溫度+-5度變化。
  8.                   5、DS1302備用電池電量用完時(shí),蜂鳴器報(bào)警。并在數(shù)碼管上顯示E002代碼
  9.                   6、發(fā)熱體好壞判別,如果壞了,蜂鳴器報(bào)警,并在數(shù)碼管上顯示E001代碼。
  10.                   7、沒有水的情況下,不加熱,并且蜂鳴器發(fā)出報(bào)警。

  11. 作    者:肖亞平
  12. 創(chuàng)建時(shí)間:2014年11月11日
  13. 修改時(shí)間:
  14. 備    注:
  15. **************************************************************************************************/
  16. #include<reg52.h>                                //頭文件

  17. #define const_dpy_time_half  200  //數(shù)碼管閃爍時(shí)間的半值
  18. #define const_dpy_time_all   400  //數(shù)碼管閃爍時(shí)間的全值 一定要比const_dpy_time_half 大
  19. #define const_voice_short  40   //蜂鳴器短叫的持續(xù)時(shí)間
  20. #define const_voice_long  120 //蜂鳴器長鳴叫的時(shí)間
  21. #define const_DigTime_level 240        //小數(shù)點(diǎn)計(jì)時(shí)上限值
  22. #define const_KeyTime_level 30 //按鍵去抖動(dòng)延時(shí)的時(shí)間
  23. #define const_key_time_short3  30    //短按的按鍵去抖動(dòng)延時(shí)的時(shí)間
  24. #define const_key_time_long3   1024     //長按的按鍵去抖動(dòng)延時(shí)的時(shí)間
  25. #define const_time_0_25s  111   //0.25秒鐘的時(shí)間需要的定時(shí)中斷次數(shù)
  26. #define const_time_1s     444   //1秒鐘的時(shí)間需要的定時(shí)中斷次數(shù)
  27. #define const_ds1302_0_5s  200   //大概0.5秒的時(shí)間
  28. #define const_ds1302_sampling_time    300   //累計(jì)主循環(huán)次數(shù)的時(shí)間,每次刷新采樣時(shí)鐘芯片的時(shí)間

  29. #define WRITE_SECOND    0x80    //DS1302內(nèi)部的相關(guān)地址
  30. #define WRITE_MINUTE    0x82
  31. #define WRITE_HOUR      0x84
  32. #define WRITE_DATE      0x86
  33. #define WRITE_MONTH     0x88
  34. #define WRITE_YEAR      0x8C
  35. #define WRITE_CHECK     0xC2  //用來檢查芯片的備用電池是否用完了的地址
  36. #define READ_CHECK      0xC3  //用來檢查芯片的備用電池是否用完了的地址
  37. #define READ_SECOND     0x81
  38. #define READ_MINUTE     0x83
  39. #define READ_HOUR       0x85
  40. #define READ_DATE       0x87
  41. #define READ_MONTH      0x89
  42. #define READ_YEAR       0x8D
  43. #define WRITE_PROTECT   0x8E

  44. #define WRITE_SET_HOUR     0xC4  //用來檢查芯片的備用電池是否用完了的地址
  45. #define READ_SET_HOUR      0xC5  //用來檢查芯片的備用電池是否用完了的地址

  46. #define WRITE_SET_MINUTE     0xC6  //用來檢查芯片的備用電池是否用完了的地址
  47. #define READ_SET_MINUTE      0xC7  //用來檢查芯片的備用電池是否用完了的地址

  48. sbit SCLK_dr      =P1^0;  
  49. sbit DIO_dr_sr    =P1^1;  
  50. sbit DS1302_CE_dr =P1^2;  

  51. sbit dig1_dr =  P2^0;                        //第一位數(shù)碼管位選輸出
  52. sbit dig2_dr =  P2^1;                        //第二位數(shù)碼管位選輸出
  53. sbit dig3_dr =  P2^2;                        //第三位數(shù)碼管位選輸出
  54. sbit dig4_dr =  P2^3;                        //第四位數(shù)碼管位選輸出
  55. sbit digital_dp_dr = P2^4;                //小數(shù)點(diǎn)輸出

  56. sbit beep_dr = P2^5;           //蜂鳴器輸出
  57. sbit Key_sr1 = P3^7;                        //確認(rèn)/選擇鍵
  58. sbit Key_sr2 = P3^6;                           //上選擇鍵        Down
  59. sbit Key_sr3 = P3^5;                        //下選擇鍵        UP
  60. sbit relay_dr = P1^5;                        //繼電器輸出
  61. sbit Key_sr4 = P1^3;                        //開機(jī)按鍵

  62. sbit adc0832_CS_dr = P1^4;                        //adc0832的使能端口
  63. sbit adc0832_DI_sr_dr = P1^6;                        //adc0832的數(shù)據(jù)端口
  64. sbit adc0832_CLK_dr = P1^7;                //adc0832的時(shí)鐘端口

  65. unsigned char ucShortTouchFlag3 = 0; //短按的自鎖標(biāo)志、
  66. unsigned char ucShortTouchFlag4 = 0; //短按的自鎖標(biāo)志

  67. unsigned char ucDigStep = 1;        //步驟變量          
  68. unsigned int uiDigTimeCnt = 0;        //小數(shù)點(diǎn)延時(shí)計(jì)數(shù)器
  69. unsigned char ucDigTimeLock = 0;//原子鎖
  70. unsigned int uiVoiceCnt        = 0;         //蜂鳴器計(jì)數(shù)器

  71. unsigned int uiDigTemp1 = 0;        //第一位數(shù)碼管顯示內(nèi)容
  72. unsigned int uiDigTemp2 = 0;        //第二位數(shù)碼管顯示內(nèi)容
  73. unsigned int uiDigTemp3 = 0;        //第三位數(shù)碼管顯示內(nèi)容
  74. unsigned int uiDigTemp4 = 0;        //第四位數(shù)碼管顯示內(nèi)容

  75. unsigned int uiDigTemp = 0;     //計(jì)數(shù)的變量

  76. unsigned int uiKeyTimeCnt1 = 0;  //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器
  77. unsigned char ucKeyLock1 = 0;         //按鍵觸發(fā)后自鎖的變量標(biāo)志
  78. unsigned char ucKeySec = 0;                         //被觸發(fā)的按鍵編號(hào)

  79. unsigned int uiKeyTimeCnt2 = 0;  //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器
  80. unsigned char ucKeyLock2 = 0;         //按鍵觸發(fā)后自鎖的變量標(biāo)志

  81. unsigned int uiKeyTimeCnt3 = 0;  //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器
  82. unsigned char ucKeyLock3 = 0;         //按鍵觸發(fā)后自鎖的變量標(biāo)志

  83. unsigned int uiKeyTimeCnt4 = 0;  //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器
  84. unsigned char ucKeyLock4 = 0;         //按鍵觸發(fā)后自鎖的變量標(biāo)志

  85. unsigned char ucKeyStartFlag1=0; //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)
  86. unsigned char ucKeyStartFlag2=0; //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)
  87. unsigned char ucKeyStartFlag3=0; //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)
  88. unsigned char ucKeyStartFlag4=0; //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)

  89. unsigned int uiKeyCtntyCnt1 = 0; //連續(xù)觸發(fā)延時(shí)計(jì)數(shù)器累加
  90. unsigned int uiKeyCtntyCnt2 = 0;
  91. /*****************************************************************************************/

  92. unsigned char  ucVoiceLock=0;  //蜂鳴器鳴叫的原子鎖

  93. unsigned char ucDigShowTemp=0; //臨時(shí)中間變量
  94. unsigned char ucWd=6;  //本程序的核心變量,窗口顯示變量。類似于一級(jí)菜單的變量。代表顯示不同的窗口。
  95. unsigned char ucPart=0;//本程序的核心變量,局部顯示變量。類似于二級(jí)菜單的變量。代表顯示不同的局部。
  96. unsigned char ucWd1Update=0; //窗口1更新顯示標(biāo)志
  97. unsigned char ucWd2Update=1; //窗口2更新顯示標(biāo)志
  98. unsigned char ucWd3Update=1; //窗口3更新顯示標(biāo)志
  99. unsigned char ucWd4Update=1; //窗口4更新顯示標(biāo)志
  100. unsigned char ucWd5Update=1; //窗口5更新顯示標(biāo)志

  101. unsigned char ucWd1Part1Update=0;  //在窗口1中,局部1的更新顯示標(biāo)志
  102. unsigned char ucWd1Part2Update=0; //在窗口1中,局部2的更新顯示標(biāo)志

  103. unsigned char ucWd2Part1Update=0;  //在窗口2中,局部1的更新顯示標(biāo)志
  104. unsigned char ucWd2Part2Update=0; //在窗口2中,局部2的更新顯示標(biāo)志

  105. unsigned char ucWd3Part1Update=0; //在窗口3中,局部1的更新顯示標(biāo)志
  106. unsigned char ucWd3Part2Update=0; //在窗口3中,局部2的更新顯示標(biāo)志

  107. unsigned char ucWd4Part1Update = 0;        //在窗口4中,局部1的更新顯示標(biāo)志
  108. unsigned char ucWd4Part2Update = 0;        //在窗口4中,局部2的更新顯示標(biāo)志

  109. unsigned char ucWd5Part1Update = 0;        //在窗口5中,局部1的更新顯示標(biāo)志


  110. unsigned char ucDelayTimerLock=0; //原子鎖

  111. //unsigned int  uiDelayTimer=0;
  112. unsigned char ucCheckDs1302=0;  //檢查Ds1302芯片是否正常
  113. unsigned char ucDs1302Error=0; //Ds1302芯片的備用電池是否用完了的報(bào)警標(biāo)志
  114. unsigned char ucDs1302Lock=0;//原子鎖
  115. unsigned int  uiDs1302Cnt=0; //間歇性蜂鳴器報(bào)警的計(jì)時(shí)器
  116. unsigned char ucDpyTimeLock=0; //原子鎖
  117. unsigned int  uiDpyTimeCnt=0;  //數(shù)碼管的閃爍計(jì)時(shí)器,放在定時(shí)中斷里不斷累加
  118. unsigned char ucAutoDisplayDateLock1 = 0;  //原子鎖
  119. unsigned char ucAutoDisplayDateLock2 = 0;  //原子鎖

  120. unsigned char  ucHour=0;  
  121. unsigned char  ucMinute=0;  
  122. unsigned char  ucSecond=0;  

  123. unsigned char  ucHourBCD=0;  
  124. unsigned char  ucMinuteBCD=0;  
  125. unsigned char  ucSecondBCD=0;  

  126. unsigned char ucSetTimedataCnt1;
  127. unsigned char ucSetTimedataCnt2;
  128. unsigned char ucSetTimeCnt1BCD;
  129. unsigned char ucSetTimeCnt2BCD;

  130. unsigned char ucTemp1=0;  //中間過渡變量
  131. unsigned char ucTemp2=0;  //中間過渡變量
  132. unsigned char ucTemp3=0;  //中間過渡變量
  133. unsigned char ucTemp4=0;  //中間過渡變量

  134. unsigned char ucSetTimeCnt1 = 12; //設(shè)定時(shí)間變量
  135. unsigned char ucSetTimeCnt2 = 30;

  136. unsigned char ucSetTepCnt1 = 50;         //設(shè)置溫度計(jì)數(shù)器

  137. unsigned char ucDigShow4;  //第4位數(shù)碼管要顯示的內(nèi)容
  138. unsigned char ucDigShow3;  //第3位數(shù)碼管要顯示的內(nèi)容
  139. unsigned char ucDigShow2;  //第2位數(shù)碼管要顯示的內(nèi)容
  140. unsigned char ucDigShow1;  //第1位數(shù)碼管要顯示的內(nèi)容

  141. unsigned int uiSampingCnt=0;   //采集Ds1302的計(jì)時(shí)器,每秒鐘更新采集一次
  142. unsigned char ucStartheat = 0;  //啟動(dòng)加熱標(biāo)志位
  143. unsigned char ucAlarmPrompt = 0;//加熱完畢報(bào)警提示標(biāo)志位

  144. unsigned char ucAD_value_Tem = 0;//AD轉(zhuǎn)換過后的溫度數(shù)據(jù)
  145. unsigned char ucADC_value = 0;//AD數(shù)據(jù)
  146. unsigned char ucADC_sampling_number = 1; //開啟ADC采樣的標(biāo)志位
  147. unsigned char ucADC_samplingCnt = 0;         //ADC采樣次數(shù)變量
  148. unsigned char KeyChangeTimeFlag;
  149. unsigned char ucBootScreen = 0;  //開機(jī)標(biāo)志位

  150. /************************************************************************************************/

  151. void ds1302_alarm_service(void); //ds1302出錯(cuò)報(bào)警
  152. void ds1302_sampling(void); //ds1302采樣程序,內(nèi)部每秒鐘采集更新一次
  153. void Write1302 ( unsigned char addr, unsigned char dat );//修改時(shí)間的驅(qū)動(dòng)
  154. void display_service(void); //顯示的窗口菜單服務(wù)程序

  155. void delay_short(unsigned int uiDelayShort);
  156. void delay_long(unsigned int uiDelayLong);

  157. unsigned char Read1302 ( unsigned char addr );//讀取時(shí)間的驅(qū)動(dòng)
  158. unsigned char bcd_to_number(unsigned char ucBcdTemp);  //BCD轉(zhuǎn)原始數(shù)值
  159. unsigned char number_to_bcd(unsigned char ucNumberTemp); //原始數(shù)值轉(zhuǎn)BCD

  160. void initial_myself(void);  //第一區(qū) 初始化單片機(jī)
  161. void delay(unsigned int delay_ms);
  162. void display();
  163. void T0_time();
  164. void key_scan();
  165. void key_service();
  166. void T0_init();
  167. void TimeData_contrast();
  168. void ucAlarmPrompt_service();
  169. void ADC_sampling_service();
  170.                                                   
  171. unsigned char array[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc6,0x86,
  172.                        0xc6,0xf6,0xf6,0xf0};

  173. const unsigned int code wendu_tab[106]=
  174. {
  175.    3274,3111,2957,2812,2674,2545,2422,2306,2196,2092, //0~9
  176.    1993,1900,1811,1728,1648,1573,1501,1433,1369,1308, //10~19
  177.    1250,1194,1142,1092,1045,1000,957,916,877,840,          //20~29
  178.    805,771,739,709,679,652,625,600,576,553,                          //30~39
  179.    531,510,490,471,453,435,418,402,387,372,                          //40~49
  180.    358,345,332,320,308,297,286,276,266,256,                          //50~59
  181.    247,238,230,222,214,207,199,193,186,180,                          //60~69
  182.    174,168,162,157,152,147,142,137,133,128,                          //70~79
  183.    124,120,116,113,109,106,102,99,96,93,                          //80~89
  184.    90,88,85,82,80,78,75,73,71,69,                                          //90~99
  185.    67,65,63,61,59,58                                                                  //100~105
  186. };

  187. /********************************************************************************************
  188. 函數(shù)名稱:主程序
  189. 功    能:程序執(zhí)行的入口
  190. 返 回 值:無
  191. 時(shí)    間:2014-11-11       
  192. 備    注:
  193. **************************************************************************************************/
  194. void main()
  195. {
  196.     T0_init();
  197.         initial_myself();
  198.         while(1)
  199.         {

  200.                  ds1302_alarm_service(); //ds1302出錯(cuò)報(bào)警
  201.                  ucAlarmPrompt_service();
  202.                  display_service(); //顯示的窗口菜單服務(wù)程序
  203.                  ds1302_sampling(); //ds1302采樣程序,內(nèi)部每秒鐘采集更新一次
  204.                  key_service();                         //按鍵服務(wù)函數(shù)放在主程序里
  205.                  TimeData_contrast();

  206.                 if(ucADC_sampling_number == 1)
  207.                 {
  208.                         ucADC_samplingCnt++;

  209.                         if(ucADC_samplingCnt==10)
  210.                         {
  211.                             ucADC_sampling_number = 0;
  212.                                 ucADC_samplingCnt = 0;
  213.                                 ADC_sampling_service();
  214.                             ucADC_sampling_number = 1;
  215.                         }
  216.                 }

  217.                  if(ucDigTimeLock == 0 && ucPart == 0)          //開始計(jì)數(shù)器標(biāo)志
  218.                  {
  219.                     uiDigTimeCnt++;                  //計(jì)數(shù)器開始計(jì)數(shù)
  220.                  }
  221.                  else
  222.                  {
  223.                     digital_dp_dr = 1;  //關(guān)閉小數(shù)點(diǎn)顯示
  224.                  }
  225.                  
  226.                  if(uiDigTimeCnt >= const_DigTime_level)  //計(jì)數(shù)時(shí)間到
  227.                  {
  228.                          ucDigTimeLock = 1;                                          //計(jì)數(shù)器標(biāo)志位置1
  229.                          uiDigTimeCnt = 0;                                          //計(jì)數(shù)器清零
  230.                          digital_dp_dr = ~digital_dp_dr;          //小數(shù)點(diǎn)輸出
  231.                          ucDigTimeLock = 0;                                          //計(jì)數(shù)器標(biāo)志位清零,開始計(jì)數(shù)。
  232.                  }
  233.                  
  234. /********************************************************************************************
  235. 功    能:數(shù)碼管閃爍計(jì)數(shù)器在外部可以關(guān)閉,不開啟計(jì)時(shí)功能
  236. 時(shí)    間:2014-11-11       
  237. **************************************************************************************************/
  238.     if(ucDpyTimeLock==0) //原子鎖判斷
  239.         {
  240.                 uiDpyTimeCnt++;  //數(shù)碼管的閃爍計(jì)時(shí)器
  241.         }


  242.         }  
  243. }         


  244. /********************************************************************************************
  245. 函數(shù)名稱:按鍵掃描
  246. 功    能:
  247.          1、按下Key_sr1,加1,如果安下一直不松,就連續(xù)加。
  248.                  2、按下Key_sr2,加減1,如果安下一直不松,就連續(xù)減。
  249.                  3、按下Key_sr3,單擊單步觸發(fā),和長按觸發(fā)
  250. 返 回 值:無
  251. 時(shí)    間:2014-11-11       
  252. 備    注:按鍵運(yùn)用了,單擊,長按,連續(xù)觸發(fā)的方法。
  253. **************************************************************************************************/
  254. void key_scan()
  255. {
  256.         static unsigned char KeyChangeTimeFlag3;

  257.         if(Key_sr1 == 1)                 //1號(hào)鍵
  258.         {
  259.            ucKeyStartFlag1 = 0;         //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)清零
  260.            uiKeyTimeCnt1 = 0;         //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  261.            ucKeyLock1 = 0;                  //按鍵觸發(fā)后自鎖的變量標(biāo)志清零
  262.           
  263.         }
  264.         else if(ucKeyLock1 == 0)
  265.         {
  266.               ucKeyStartFlag1 = 1;                //開啟計(jì)數(shù)器開關(guān),開始計(jì)數(shù)

  267.                 if(uiKeyTimeCnt1>=const_KeyTime_level)
  268.                 {
  269.                     ucKeyStartFlag1 = 0;        //開啟計(jì)數(shù)器關(guān)閉,停止計(jì)數(shù)
  270.                         ucKeyLock1 = 1;                        //自鎖按鍵置位,避免一直觸發(fā)
  271.                         uiKeyTimeCnt1 = 0;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  272.                         ucKeySec = 1;                   //觸發(fā)1號(hào)鍵
  273.                 }
  274.         }

  275.         else if(uiKeyTimeCnt1<const_time_1s)
  276.         {
  277.                  uiKeyTimeCnt1++;
  278.         }
  279.         else
  280.         {
  281.                  uiKeyCtntyCnt1++; //連續(xù)觸發(fā)延時(shí)計(jì)數(shù)器累加

  282.                 if(uiKeyCtntyCnt1>const_time_0_25s)
  283.                 {
  284.                         uiKeyCtntyCnt1 = 0;
  285.                         ucKeySec = 1;                   //觸發(fā)1號(hào)鍵
  286.                 }
  287.         }


  288.         if(Key_sr2 == 1)                 //2號(hào)鍵
  289.         {
  290.            ucKeyStartFlag2 = 0;         //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)清零
  291.            uiKeyTimeCnt2 = 0;         //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  292.            ucKeyLock2 = 0;                  //按鍵觸發(fā)后自鎖的變量標(biāo)志清零
  293.         }
  294.         else if(ucKeyLock2 == 0)
  295.         {
  296.               ucKeyStartFlag2 = 1;                //開啟計(jì)數(shù)器開關(guān),開始計(jì)數(shù)

  297.                 if(uiKeyTimeCnt2>=const_KeyTime_level)
  298.                 {
  299.                     ucKeyStartFlag2 = 0;        //開啟計(jì)數(shù)器關(guān)閉,停止計(jì)數(shù)
  300.                         ucKeyLock2 = 1;                        //自鎖按鍵置位,避免一直觸發(fā)
  301.                         uiKeyTimeCnt2 = 0;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  302.                         ucKeySec = 2;                   //觸發(fā)2號(hào)鍵
  303.                 }
  304.         }
  305.         else if(uiKeyTimeCnt2<const_time_1s)
  306.         {
  307.                  uiKeyTimeCnt2++;
  308.         }
  309.         else
  310.         {
  311.                  uiKeyCtntyCnt2++; //連續(xù)觸發(fā)延時(shí)計(jì)數(shù)器累加

  312.                 if(uiKeyCtntyCnt2>const_time_0_25s)
  313.                 {
  314.                         uiKeyCtntyCnt2 = 0;
  315.                         ucKeySec = 2;                   //觸發(fā)1號(hào)鍵
  316.                 }
  317.         }
  318.             
  319.         if(Key_sr3 == 1)                 //3,4號(hào)鍵
  320.         {
  321.            ucKeyStartFlag3 = 0;         //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)清零
  322.            uiKeyTimeCnt3 = 0;         //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  323.            ucKeyLock3 = 0;                  //按鍵觸發(fā)后自鎖的變量標(biāo)志清零
  324.            ucShortTouchFlag3 = 0; //短按的自鎖標(biāo)志清零
  325.             KeyChangeTimeFlag3 = 0;
  326.         }
  327.         else if(ucKeyLock3 == 0)
  328.         {
  329.               ucKeyStartFlag3 = 1;                //開啟計(jì)數(shù)器開關(guān),開始計(jì)數(shù)

  330.                 if(ucShortTouchFlag3 == 0)
  331.                 {
  332.                         if(uiKeyTimeCnt3>=const_key_time_short3)  //短按中間間隔的時(shí)間
  333.                         {
  334.                             ucShortTouchFlag3 = 1;
  335.                                 ucKeySec = 3;                   //觸發(fā)3號(hào)鍵
  336.                         }
  337.                 }

  338.                 if(uiKeyTimeCnt3>=const_key_time_long3&&KeyChangeTimeFlag3 == 0)
  339.                 {
  340.             KeyChangeTimeFlag3 = 1;
  341.                         ucKeySec = 17;                   //觸發(fā)17號(hào)鍵
  342.                 }
  343.             if(uiKeyTimeCnt3>=const_key_time_long3+const_key_time_long3)
  344.                 {
  345.                     ucKeyStartFlag3 = 0;        //開啟計(jì)數(shù)器關(guān)閉,停止計(jì)數(shù)
  346.                         ucKeyLock3 = 1;                        //自鎖按鍵置位,避免一直觸發(fā)
  347.                         uiKeyTimeCnt3 = 0;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  348.                         ucKeySec = 18;                   //觸發(fā)17號(hào)鍵
  349.                 }

  350.         }

  351.         if(Key_sr4 == 1)                 //1號(hào)鍵
  352.         {
  353.            ucKeyStartFlag4 = 0;         //啟動(dòng)定時(shí)中斷計(jì)數(shù)的開關(guān)清零
  354.            uiKeyTimeCnt4 = 0;         //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  355.            ucKeyLock4 = 0;                  //按鍵觸發(fā)后自鎖的變量標(biāo)志清零
  356.            ucShortTouchFlag4 = 0; ///短按的自鎖標(biāo)志清零
  357.           
  358.         }
  359.         else if(ucKeyLock4 == 0)
  360.         {
  361.               ucKeyStartFlag4 = 1;                //開啟計(jì)數(shù)器開關(guān),開始計(jì)數(shù)

  362.                 if(ucShortTouchFlag4 == 0)
  363.                 {         
  364.                         if(uiKeyTimeCnt4>=const_KeyTime_level)
  365.                         {
  366.                                 ucShortTouchFlag4 = 1;
  367.                                 ucKeySec = 4;                   //觸發(fā)4號(hào)鍵
  368.                         }

  369.                
  370.                 }

  371.            if(uiKeyTimeCnt4>=const_key_time_long3)
  372.            {
  373.                         ucKeyStartFlag4 = 0;        //開啟計(jì)數(shù)器關(guān)閉,停止計(jì)數(shù)
  374.                         ucKeyLock4 = 1;                        //自鎖按鍵置位,避免一直觸發(fā)
  375.                         uiKeyTimeCnt4 = 0;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零
  376.                         ucKeySec = 5;                   //觸發(fā)5號(hào)鍵

  377.            }
  378.         }
  379. }

  380. /********************************************************************************************
  381. 函數(shù)名稱:顯示的窗口菜單服務(wù)程序
  382. 功    能:更新顯示內(nèi)容
  383. 返 回 值:無
  384. 時(shí)    間:2014-11-11       
  385. 備    注:
  386. **************************************************************************************************/

  387. void display_service(void) //顯示的窗口菜單服務(wù)程序
  388. {
  389.    switch(ucWd)  //本程序的核心變量,窗口顯示變量。類似于一級(jí)菜單的變量。代表顯示不同的窗口。
  390.    {
  391.            case 1:   //顯示時(shí)間窗口的數(shù)據(jù)  數(shù)據(jù)格式 SS FF MM 時(shí) 分 秒
  392.                 if(ucWd1Update==1)  //窗口1要全部更新顯示
  393.                 {
  394.                                 ucWd1Update=0;  //及時(shí)清零標(biāo)志,避免一直進(jìn)來掃描
  395.                                 ucWd1Part1Update=1;  //局部時(shí)更新顯示
  396.                                 ucWd1Part2Update=1;  //局部分更新顯示
  397.                 }
  398.        
  399.                         if(ucWd1Part1Update==1)//局部時(shí)更新顯示
  400.                         {
  401.                                 ucWd1Part1Update=0;
  402.                                 ucTemp1=ucHour/10;  //時(shí)
  403.                                 ucTemp2=ucHour%10;
  404.                                 ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  405.                                 ucDigShow2=ucTemp2;
  406.                         }
  407.        
  408.                         if(ucWd1Part2Update==1)//局部分更新顯示
  409.                         {
  410.                                 ucWd1Part2Update=0;
  411.                                 ucTemp3=ucMinute/10;  //分
  412.                                 ucTemp4=ucMinute%10;
  413.                                 ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  414.                                 ucDigShow4=ucTemp4;
  415.                         }
  416.        
  417.              //數(shù)碼管閃爍
  418.                 switch(ucPart)  //相當(dāng)于二級(jí)菜單,根據(jù)局部變量的值,使對(duì)應(yīng)的參數(shù)產(chǎn)生閃爍的動(dòng)態(tài)效果。
  419.                         {
  420.                             case 0:  //都不閃爍
  421.                                  break;
  422.                             case 1:  //時(shí)參數(shù)閃爍
  423.                                  if(uiDpyTimeCnt==const_dpy_time_half)
  424.                                  {
  425.                                        ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  426.                                        ucDigShow2=ucTemp2;
  427.                                   }
  428.                                  else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  429.                                  {
  430.                                                 ucDpyTimeLock=1; //原子鎖加鎖
  431.                                                 uiDpyTimeCnt=0;   //及時(shí)把閃爍記時(shí)器清零
  432.                                                 ucDpyTimeLock=0;  //原子鎖解鎖
  433.                                                 ucDigShow1=10;   //數(shù)碼管顯示空,什么都不顯示
  434.                                                 ucDigShow2=10;
  435.                                  }
  436.                                  break;
  437.                        
  438.                             case 2:   //分參數(shù)閃爍
  439.                                  if(uiDpyTimeCnt==const_dpy_time_half)
  440.                                  {
  441.                                                 ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容,顯示前兩位,
  442.                                     ucDigShow2=ucTemp2;         //目的是上面閃爍后,數(shù)碼管顯示內(nèi)容會(huì)清零

  443.                                                 ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  444.                                                 ucDigShow4=ucTemp4;
  445.                                  }
  446.                                  else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  447.                                  {
  448.                                                 ucDpyTimeLock=1; //原子鎖加鎖
  449.                                                 uiDpyTimeCnt=0;   //及時(shí)把閃爍記時(shí)器清零
  450.                                                 ucDpyTimeLock=0;  //原子鎖解鎖
  451.                                                 ucDigShow3=10;   //數(shù)碼管顯示空,什么都不顯示
  452.                                                 ucDigShow4=10;

  453.                                  }
  454.                                 break;
  455.                         }
  456.             break;

  457.                 case 2:
  458.                     if(ucWd2Update==1)  //窗口1要全部更新顯示
  459.                 {
  460.                                 ucWd2Update=0;  //及時(shí)清零標(biāo)志,避免一直進(jìn)來掃描
  461.                                 ucWd2Part1Update=1;  //局部時(shí)更新顯示
  462.                                 ucWd2Part2Update=1;  //局部分更新顯示
  463.                 }

  464.                         if(ucWd2Part1Update == 1)
  465.                         {
  466.                                    ucWd2Part1Update = 0;
  467.                                 ucTemp1=ucSetTimeCnt1/10;  //時(shí)
  468.                                 ucTemp2=ucSetTimeCnt1%10;
  469.                                 ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  470.                                 ucDigShow2=ucTemp2;
  471.                         }

  472.                         if(ucWd2Part2Update == 1)
  473.                         {
  474.                                    ucWd2Part2Update = 0;
  475.                                 ucTemp3=ucSetTimeCnt2/10;  //時(shí)
  476.                                 ucTemp4=ucSetTimeCnt2%10;
  477.                                 ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  478.                                 ucDigShow4=ucTemp4;
  479.                         }

  480.                     switch(ucPart)  //相當(dāng)于二級(jí)菜單,根據(jù)局部變量的值,使對(duì)應(yīng)的參數(shù)產(chǎn)生閃爍的動(dòng)態(tài)效果。
  481.                         {
  482.                             case 0:  //都不閃爍
  483.                                  break;
  484.                             case 1:  //時(shí)參數(shù)閃爍
  485.                                  if(uiDpyTimeCnt==const_dpy_time_half)
  486.                                  {
  487.                                        ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  488.                                        ucDigShow2=ucTemp2;
  489.                                   }
  490.                                  else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  491.                                  {
  492.                                                 ucDpyTimeLock=1; //原子鎖加鎖
  493.                                                 uiDpyTimeCnt=0;   //及時(shí)把閃爍記時(shí)器清零
  494.                                                 ucDpyTimeLock=0;  //原子鎖解鎖
  495.                                                 ucDigShow1=10;   //數(shù)碼管顯示空,什么都不顯示
  496.                                                 ucDigShow2=10;
  497.                                  }
  498.                                  break;
  499.                        
  500.                             case 2:   //分參數(shù)閃爍
  501.                                  if(uiDpyTimeCnt==const_dpy_time_half)
  502.                                  {
  503.                                                 ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容,這里是為了顯示前兩位
  504.                                     ucDigShow2=ucTemp2;         //目的是上面閃爍后,數(shù)碼管顯示內(nèi)容會(huì)清零

  505.                                                 ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  506.                                                 ucDigShow4=ucTemp4;
  507.                                  }
  508.                                  else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  509.                                  {
  510.                                                 ucDpyTimeLock=1; //原子鎖加鎖
  511.                                                 uiDpyTimeCnt=0;   //及時(shí)把閃爍記時(shí)器清零
  512.                                                 ucDpyTimeLock=0;  //原子鎖解鎖
  513.                                                 ucDigShow3=10;   //數(shù)碼管顯示空,什么都不顯示
  514.                                                 ucDigShow4=10;

  515.                                  }
  516.                                 break;
  517.                         }
  518.             break;

  519.                  case 3:
  520.                        if(ucWd3Update==1)  //窗口3要全部更新顯示
  521.                    {
  522.                                    ucWd3Update=0;  //及時(shí)清零標(biāo)志,避免一直進(jìn)來掃描
  523.                                    ucWd3Part1Update=1;  //局部時(shí)更新顯示
  524.                                    ucWd3Part2Update=1;  //局部分更新顯示
  525.                    }  
  526.                           
  527.                            if(ucWd3Part1Update == 1)
  528.                            {
  529.                                       ucWd3Part1Update = 0;

  530.                                    if(ucSetTepCnt1>=100)
  531.                                    {
  532.                                               ucTemp1 = ucSetTepCnt1/100;
  533.                                        ucTemp2 = ucSetTepCnt1/10%10;
  534.                                            ucTemp3 = ucSetTepCnt1%10;
  535.                                    }
  536.                                    else
  537.                                    {
  538.                                               ucTemp1 = ucSetTepCnt1/10;
  539.                                        ucTemp2 = ucSetTepCnt1%10;
  540.                                            ucTemp3 = 10;
  541.                                    }

  542.                                    ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  543.                                    ucDigShow2=ucTemp2; //數(shù)碼管顯示實(shí)際內(nèi)容
  544.                                    ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  545.                            }

  546.                            if(ucWd3Part2Update == 1)
  547.                            {
  548.                                        ucWd3Part2Update = 0;       
  549.                                         ucDigShow4 = 11;
  550.                            }

  551.                            switch(ucPart)
  552.                            {
  553.                                 case 0:  break;
  554.                                 case 1:
  555.                                          if(uiDpyTimeCnt==const_dpy_time_half)
  556.                                          {
  557.                                                         ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  558.                                                         ucDigShow2=ucTemp2;
  559.                                          }
  560.                                          else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
  561.                                          {
  562.                                                         ucDpyTimeLock=1; //原子鎖加鎖
  563.                                                         uiDpyTimeCnt=0;   //及時(shí)把閃爍記時(shí)器清零
  564.                                                         ucDpyTimeLock=0;  //原子鎖解鎖
  565.                                                         ucDigShow1=10;   //數(shù)碼管顯示空,什么都不顯示
  566.                                                         ucDigShow2=10;
  567.        
  568.                                          }
  569.                                                  break;

  570.                            }
  571.                            break;

  572.                 case 4:       
  573.                        if(ucWd4Update==1)  //窗口4要全部更新顯示
  574.                    {
  575.                                    ucWd4Update=0;  //及時(shí)清零標(biāo)志,避免一直進(jìn)來掃描
  576.                                    ucWd4Part1Update=1;  //局部時(shí)更新顯示
  577.                                    ucWd4Part2Update=1;  //局部分更新顯示
  578.                    }  
  579.                           
  580.                            if(ucWd4Part1Update == 1)
  581.                            {
  582.                                       ucWd4Part1Update = 0;

  583.                                    if(ucAD_value_Tem>=100)
  584.                                    {
  585.                                               ucTemp1 = ucAD_value_Tem/100;
  586.                                        ucTemp2 = ucAD_value_Tem/10%10;
  587.                                            ucTemp3 = ucAD_value_Tem%10;
  588.                                    }
  589.                                    else
  590.                                    {
  591.                                               ucTemp1 = ucAD_value_Tem/10;
  592.                                        ucTemp2 = ucAD_value_Tem%10;
  593.                                            ucTemp3 = 10;
  594.                                    }

  595.                                    ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  596.                                    ucDigShow2=ucTemp2; //數(shù)碼管顯示實(shí)際內(nèi)容
  597.                                    ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  598.                            }

  599.                            if(ucWd4Part2Update == 1)
  600.                            {
  601.                                        ucWd4Part2Update = 0;       
  602.                                         ucDigShow4 = 11;
  603.                            }
  604.                 break;

  605.                 case 5:if(ucWd5Update==1)  //窗口5要全部更新顯示
  606.                    {
  607.                                    ucWd5Update=0;  //及時(shí)清零標(biāo)志,避免一直進(jìn)來掃描
  608.                                    ucWd5Part1Update=1;  //局部時(shí)更新顯示
  609.                    }  
  610.                           
  611.                            if(ucWd5Part1Update == 1)
  612.                            {
  613. //                                      ucWd5Part1Update = 0;
  614.                   
  615.                                    ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
  616.                                    ucDigShow2=ucTemp2; //數(shù)碼管顯示實(shí)際內(nèi)容
  617.                                    ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
  618.                                    ucDigShow4=ucTemp4; //數(shù)碼管顯示實(shí)際內(nèi)容

  619.                            }
  620.                            break;

  621.                  case 6:ucDigTimeLock = 1; //不顯示小數(shù)點(diǎn)
  622.                                 ucDigShow1=13; //數(shù)碼管顯示實(shí)際內(nèi)容
  623.                                 ucDigShow2=14; //數(shù)碼管顯示實(shí)際內(nèi)容
  624.                                 ucDigShow3=15; //數(shù)碼管顯示實(shí)際內(nèi)容
  625.                                 ucDigShow4=16; //數(shù)碼管顯示實(shí)際內(nèi)容

  626.                  break;
  627.       }
  628. }


  629. /********************************************************************************************
  630. 函數(shù)名稱:按鍵服務(wù)程序
  631. 功    能:按鍵處理的事務(wù)
  632. 返 回 值:無
  633. 時(shí)    間:2014-11-11       
  634. 備    注:
  635. **************************************************************************************************/
  636. void key_service(void) //按鍵服務(wù)的應(yīng)用程序
  637. {
  638.         switch(ucKeySec) //按鍵服務(wù)狀態(tài)切換
  639.         {
  640.                 case 1:// 加按鍵  
  641.                                 switch(ucWd)  //在不同的窗口下,設(shè)置不同的參數(shù)
  642.                                 {
  643.                                
  644.                                 case 1:switch(ucPart) //在不同的局部變量下,相當(dāng)于二級(jí)菜單
  645.                                                 {
  646.                                                         case 1:  //時(shí)
  647.                                                                         ucHour++;
  648.                        
  649.                                                                         if(ucHour>23)
  650.                                                                         {
  651.                                                                                 ucHour=23;
  652.                                                                         }
  653.                                                                         ucWd1Part1Update=1;  //更新顯示                                               
  654.                                                                         break;
  655.        
  656.                                                         case 2: //分
  657.                                                                         ucMinute++;
  658.                                                                         if(ucMinute>59)
  659.                                                                         {
  660.                                                                                 ucMinute=59;
  661.                                                                         }
  662.                                                                         ucWd1Part2Update=1;  //更新顯示                                                      
  663.                                                                         break;
  664.                                                 }
  665.                                         break;

  666.                                  case 2:
  667.                                         switch(ucPart)
  668.                                                 {
  669.                                                         case 1:
  670.                                                               ucSetTimeCnt1++;
  671.                                                                   if(ucSetTimeCnt1>23)
  672.                                                                   {
  673.                                                                      ucSetTimeCnt1 = 23;
  674.                                                                   }

  675.                                                                   ucWd2Part1Update=1;  //更新顯示
  676.                                                                  break;

  677.                                                         case 2:
  678.                                                                    ucSetTimeCnt2++;
  679.                                                                   if(ucSetTimeCnt2>59)
  680.                                                                   {
  681.                                                                      ucSetTimeCnt2 = 59;
  682.                                                                   }
  683.                                                                   ucWd2Part2Update=1;  //更新顯示
  684.                                                               break;
  685.                                                 }
  686.                                  break;

  687.                                  case 3:
  688.                                        switch(ucPart)
  689.                                            {
  690.                                              
  691.                                                    case 1:
  692.                                                          ucSetTepCnt1++;
  693.                                                                  if(ucSetTepCnt1>125)
  694.                                                                  {
  695.                                                                      ucSetTepCnt1 = 125;
  696.                                                                  }
  697.                                                                  ucWd3Part1Update = 1;
  698.                                                    break;
  699.                                                   
  700.                                            }
  701.                                  break;

  702.                                 }
  703.        
  704.               ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  705.               uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
  706.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  707.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  708.               break;   
  709.        
  710.        
  711.                 case 2:// 減按鍵  
  712.                       switch(ucWd)  //在不同的窗口下,設(shè)置不同的參數(shù)
  713.                       {
  714.                                       case 1:
  715.                                 switch(ucPart) //在不同的局部變量下,相當(dāng)于二級(jí)菜單
  716.                                                 {
  717.                                                         case 1:  //時(shí)
  718.                                                                         ucHour--;
  719.                                                                         if(ucHour>23)
  720.                                                                         {
  721.                                                                                 ucHour=0;
  722.                                                                         }
  723.                                                                         ucWd1Part1Update=1;  //更新顯示                                               
  724.                                                                 break;
  725.        
  726.                                                         case 2: //分
  727.                                                                         ucMinute--;
  728.                                                                         if(ucMinute>59)
  729.                                                                         {
  730.                                                                                 ucMinute=0;
  731.                                                                         }
  732.                                                                         ucWd1Part2Update=1;  //更新顯示                                                      
  733.                                                                         break;
  734.                                                         }
  735.                                 break;
  736.                                    case 2:
  737.                                 switch(ucPart) //在不同的局部變量下,相當(dāng)于二級(jí)菜單
  738.                                                 {
  739.                                                         case 1:  //時(shí)
  740.                                                                         ucSetTimeCnt1--;
  741.                                                                         if(ucSetTimeCnt1>23)
  742.                                                                         {
  743.                                                                                 ucSetTimeCnt1=0;
  744.                                                                         }

  745.                                                                         ucWd2Part1Update=1;  //更新顯示                                               
  746.                                                                     break;
  747.        
  748.                                                         case 2: //分
  749.                                                                         ucSetTimeCnt2--;
  750.                                                                         if(ucSetTimeCnt2>59)
  751.                                                                         {
  752.                                                                                 ucSetTimeCnt2=0;
  753.                                                                         }
  754.                                                                         ucWd2Part2Update=1;  //更新顯示                                                      
  755.                                                                         break;
  756.                                                         }
  757.                                 break;
  758.                                        
  759.                                 case 3:        switch(ucPart)
  760.                                                 {
  761.                                                        
  762.                                                         case 1:
  763.                                                                 ucSetTepCnt1--;

  764.                                                                 if(ucSetTepCnt1>125)
  765.                                                                 {
  766.                                                                         ucSetTepCnt1 = 0;
  767.                                                                 }
  768.                                                                 ucWd3Part1Update = 1;
  769.                                                                 break;
  770.                                                        
  771.                                                         }
  772.                                                 break;


  773.                       }
  774.        
  775.               ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  776.               uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
  777.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  778.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  779.               break;
  780.                   
  781.                 case 3://短按設(shè)置按鍵
  782.                                 switch(ucWd)  //在不同的窗口下,設(shè)置不同的參數(shù)
  783.                                 {
  784.                                        
  785.                                         case 1:
  786.                                                 if(ucAlarmPrompt == 1)         //此時(shí)報(bào)警啟動(dòng)
  787.                                                         {
  788.                                                             ucAlarmPrompt = 0;          //報(bào)警關(guān)閉
  789.                                                         }

  790.                                                         if(ucPart>0) //在窗口2的時(shí)候,要第一次激活設(shè)置時(shí)間,必須是長按3秒才可以,這里短按激活不了第一次
  791.                                                         {
  792.                                                                 ucPart++;
  793.                                                                 if(ucPart>2)  //設(shè)置時(shí)間結(jié)束
  794.                                                                 {
  795.                                                                         ucPart=0;
  796.                                                                         /* 注釋五:
  797.                                                                         * 每個(gè)月份的天數(shù)最大值是不一樣的,在寫入ds1302時(shí)鐘芯片內(nèi)部數(shù)據(jù)前,應(yīng)該做一次調(diào)整。
  798.                                                                         * 有的月份最大28天,有的月份最大29天,有的月份最大30天,有的月份最大31天,
  799.                                                                         */                                                   
  800.                                                                         ucHourBCD=number_to_bcd(ucHour);  //原始數(shù)值轉(zhuǎn)BCD
  801.                                                                         ucMinuteBCD=number_to_bcd(ucMinute);  //原始數(shù)值轉(zhuǎn)BCD
  802.                                                                         ucSecondBCD=number_to_bcd(ucSecond);  //原始數(shù)值轉(zhuǎn)BCD

  803.                                                                         Write1302 (WRITE_PROTECT,0X00);          //禁止寫保護(hù)
  804.                                                                         Write1302 (WRITE_HOUR,ucHourBCD);        //小時(shí)修改
  805.                                                                         Write1302 (WRITE_MINUTE,ucMinuteBCD);    //分鐘修改
  806.                                                                         Write1302 (WRITE_SECOND,ucSecondBCD);    //秒位修改
  807.                                                                         Write1302 (WRITE_PROTECT,0x80);          //允許寫保護(hù)

  808.                                                                 }
  809.                                                                 ucWd1Update=1;  //窗口1更新顯示
  810.                                                         }
  811.                                                 break;

  812.                                            case 2:
  813.                                                         if(ucPart>0)
  814.                                                         {
  815.                                                                 ucPart++;
  816.                                                                 if(ucPart>2)
  817.                                                                 {
  818.                                                                ucPart = 1;
  819.                                                                    ucWd=3; //切換到第三個(gè)窗口,設(shè)置預(yù)定時(shí)
  820.                                                                    ucWd3Update=1;  //窗口3更新顯示
  821.                                                                 }
  822.                                                         }
  823.                                                         break;

  824.                                            case 3:
  825.                                                  if(ucPart>0)
  826.                                                          {
  827.                                                             ucPart++;
  828.                                                                 if(ucPart>1)
  829.                                                                 {
  830.                                                                     ucPart = 0;
  831.                                                                         ucWd = 4;  //切換到第四個(gè)窗口,
  832.                                                                         ucPart = 1;
  833.                                                                         ucDigTimeLock = 1;  //小數(shù)點(diǎn)不顯示
  834.                                                                 }
  835.                                                          }
  836.                                                         break;

  837.                                            case 4:
  838.                                                  if(ucPart>0)
  839.                                                          {
  840.                                                             ucPart++;
  841.                                                                 if(ucPart>1)
  842.                                                                 {
  843.                                                                     ucPart = 0;
  844.                                                                         ucWd = 1;
  845.                                                                         ucWd1Update = 1;
  846.                                                                         ucDigTimeLock = 0;  //顯示小數(shù)點(diǎn)
  847.                                                                         ucStartheat = 1;//啟動(dòng)加熱
  848.                                                                 }
  849.                                                          }

  850.                                                         break;
  851.                                 }
  852.        
  853.               ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  854.               uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
  855.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  856.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  857.               break;      
  858.                      
  859.                 case 4:
  860.                            if(ucBootScreen == 0)  //開機(jī)
  861.                            {
  862.                                         ucWd=1;
  863.                                         ucWd1Update=1;  //窗口1更新顯示
  864.                                         ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)
  865.                                         ucBootScreen = 1; //開關(guān)標(biāo)志位置1,為關(guān)機(jī)做準(zhǔn)備
  866.                            }
  867. //                                 if(ucBootScreen == 1)//關(guān)機(jī)
  868. //                           {
  869. //                                        ucWd=6;
  870. //                                        ucBootScreen = 0; //開關(guān)標(biāo)志位清零,為開機(jī)做準(zhǔn)備
  871. //                                        ucStartheat = 0; //停止加熱
  872. //                                        ucSetTimeCnt1 = 12; //復(fù)位默認(rèn)設(shè)的小時(shí)
  873. //                                    ucSetTimeCnt2 = 30; //復(fù)位默認(rèn)設(shè)的分鐘
  874. //                    ucSetTepCnt1 = 50; //復(fù)位默認(rèn)溫度值
  875. //                                        ucPart = 0;         //設(shè)置清零
  876. //                           }
  877.               ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  878.               uiVoiceCnt=const_voice_long; //按鍵聲音觸發(fā),滴一聲就停。
  879.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  880.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  881.                 break;

  882.                 case 5:
  883.                            if(ucBootScreen == 1)//關(guān)機(jī)
  884.                            {
  885.                                         ucWd=6;
  886.                                         ucBootScreen = 0; //開關(guān)標(biāo)志位清零,為開機(jī)做準(zhǔn)備
  887.                                         ucStartheat = 0; //停止加熱
  888.                                         ucSetTimeCnt1 = 12; //復(fù)位默認(rèn)設(shè)的小時(shí)
  889.                                     ucSetTimeCnt2 = 30; //復(fù)位默認(rèn)設(shè)的分鐘
  890.                     ucSetTepCnt1 = 50; //復(fù)位默認(rèn)溫度值
  891.                                         ucPart = 0;         //設(shè)置清零
  892.                            }
  893.               ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  894.               uiVoiceCnt=const_voice_long; //按鍵聲音觸發(fā),滴一聲就停。
  895.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  896.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  897.                 break;

  898.                 case 17://長按3秒設(shè)置按鍵
  899.                         switch(ucWd)  //在不同的窗口下,設(shè)置不同的參數(shù)
  900.                         {
  901.                                 case 1:
  902.                                                 if(ucPart==0) //處于非設(shè)置時(shí)間的狀態(tài)下,要第一次激活設(shè)置時(shí)間,必須是長按3秒才可以
  903.                                                 {
  904.                                                                 ucWd=2;
  905.                                                                 ucPart=1;  //進(jìn)入到設(shè)置日期的狀態(tài)下
  906.                                                                 ucWd2Update=1;  //窗口1更新顯示
  907.                                                 }
  908.                                                 break;
  909. //                                case 4:
  910. //                                       if(ucPart == 0)
  911. //                                           {
  912. //                                                      ucWd=2;
  913. //                                                   ucPart=1;  //進(jìn)入到設(shè)置時(shí)間的狀態(tài)下
  914. //                                                   ucWd2Update=1;  //窗口2更新顯示
  915. //                                           }
  916. //                                        break;
  917.                         }
  918.        
  919.               ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  920.               uiVoiceCnt=const_voice_long; //按鍵聲音觸發(fā),滴一聲就停。
  921.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  922.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  923.               break;  
  924.                   
  925.                  case 18:
  926.                        switch(ucWd)
  927.                            {
  928.                               case 0:break;
  929.                                   case 2:
  930.                                          ucPart = 0;
  931.                                             if(ucPart == 0&& ucStartheat == 0)          //處于非設(shè)置的情況下,長按設(shè)置系統(tǒng)時(shí)間
  932.                                                 {
  933.                                                     ucWd = 1;
  934.                                                         ucPart = 1;
  935.                                                         ucWd1Update = 1;
  936.                                                 }
  937.                                                 else if(ucPart == 0&&ucStartheat == 1)
  938.                                                 {
  939.                                                             //處于非設(shè)置的情況下,久長按退出定時(shí)恒溫?zé)崴?br />
  940.                                                     ucWd = 1;
  941. //                                                        ucPart = 1;
  942.                                                         ucWd1Update = 1;

  943.                                                         ucStartheat = 0; //停止加熱
  944.                                                         ucSetTimeCnt1 = 12; //復(fù)位默認(rèn)設(shè)的小時(shí)
  945.                                                     ucSetTimeCnt2 = 30; //復(fù)位默認(rèn)設(shè)的分鐘
  946.                             ucSetTepCnt1 = 50; //復(fù)位默認(rèn)溫度值
  947.                                                         ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)
  948.                                                 }
  949.                                   break;

  950.                            }

  951.                   ucVoiceLock=1;  //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  952.               uiVoiceCnt=const_voice_long; //按鍵聲音觸發(fā),滴一聲就停。
  953.               ucVoiceLock=0;  //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
  954.               ucKeySec=0;  //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號(hào)清零,避免一致觸發(fā)
  955.       
  956.                  break;  
  957.         }         

  958. }

  959. /********************************************************************************************
  960. 函數(shù)名稱:DS1302采樣程序
  961. 功    能:讀取DS1302的數(shù)據(jù)
  962. 返 回 值:無
  963. 時(shí)    間:2014-11-11       
  964. 備    注:系統(tǒng)不用時(shí)時(shí)刻刻采集ds1302的內(nèi)部數(shù)據(jù),每隔一段時(shí)間更新采集一次就可以了。
  965.           這個(gè)間隔時(shí)間應(yīng)該小于或者等于1秒鐘的時(shí)間,否則在數(shù)碼管上看不到每秒鐘的時(shí)間變化。
  966. **************************************************************************************************/
  967. void ds1302_sampling(void) //ds1302采樣程序,內(nèi)部每秒鐘采集更新一次
  968. {
  969.    if(ucPart==0)  //當(dāng)系統(tǒng)不是處于設(shè)置日期和時(shí)間的情況下
  970.    {
  971.       ++uiSampingCnt;  //累計(jì)主循環(huán)次數(shù)的時(shí)間

  972.       if(uiSampingCnt>const_ds1302_sampling_time)  //每隔一段時(shí)間就更新采集一次Ds1302數(shù)據(jù)
  973.       {
  974.                         uiSampingCnt=0;
  975.                         ucHourBCD=Read1302(READ_HOUR); //讀取時(shí)
  976.                         ucMinuteBCD=Read1302(READ_MINUTE); //讀取分

  977.                         ucHour=bcd_to_number(ucHourBCD);  //BCD轉(zhuǎn)原始數(shù)值
  978.                         ucMinute=bcd_to_number(ucMinuteBCD);  //BCD轉(zhuǎn)原始數(shù)值
  979.                         ucWd1Update=1; //窗口1更新顯示時(shí)間
  980.       }
  981.   }
  982. }


  983. /********************************************************************************************
  984. 函數(shù)名稱:修改DS1302時(shí)間的驅(qū)動(dòng)程序
  985. 功    能:讀取DS1302的數(shù)據(jù)
  986. 返 回 值:無
  987. 時(shí)    間:2014-11-11       
  988. 備    注:此處寫的是BCD碼
  989. **************************************************************************************************/
  990. void Write1302 ( unsigned char addr, unsigned char dat )
  991. {
  992.      
  993.          unsigned char i,temp;//單片機(jī)驅(qū)動(dòng)DS1302屬于SPI通訊方式,根據(jù)我的經(jīng)驗(yàn),不用關(guān)閉中斷
  994.      DS1302_CE_dr=0;      //CE引腳為低,數(shù)據(jù)傳送中止
  995.      delay_short(1);           
  996.      SCLK_dr=0;           //清零時(shí)鐘總線
  997.      delay_short(1);
  998.      DS1302_CE_dr = 1;    //CE引腳為高,邏輯控制有效
  999.      delay_short(1);
  1000.      for ( i=0; i<8; i++ )//循環(huán)8次移位
  1001.      {
  1002.         DIO_dr_sr = 0;
  1003.         temp = addr;
  1004.         if(temp&0x01)
  1005.         {
  1006.             DIO_dr_sr =1;
  1007.         }
  1008.         else
  1009.         {
  1010.             DIO_dr_sr =0;
  1011.         }
  1012.         delay_short(1);
  1013.         addr >>= 1;                                           //右移一位
  1014.         SCLK_dr = 1;
  1015.         delay_short(1);
  1016.         SCLK_dr = 0;
  1017.         delay_short(1);
  1018.      }
  1019.      //發(fā)送數(shù)據(jù)

  1020.      for ( i=0; i<8; i++ )                                    //循環(huán)8次移位
  1021.      {
  1022.         DIO_dr_sr = 0;
  1023.         temp = dat;
  1024.         if(temp&0x01)
  1025.         {
  1026.             DIO_dr_sr =1;
  1027.         }
  1028.         else
  1029.         {
  1030.            DIO_dr_sr =0;
  1031.         }
  1032.         delay_short(1);
  1033.         dat >>= 1;                                             //右移一位
  1034.         SCLK_dr = 1;
  1035.         delay_short(1);
  1036.         SCLK_dr = 0;
  1037.         delay_short(1);
  1038.      }
  1039.      DS1302_CE_dr = 0;
  1040.      delay_short(1);
  1041. }         


  1042. /********************************************************************************************
  1043. 函數(shù)名稱:讀取DS1302時(shí)間的驅(qū)動(dòng)程序
  1044. 功    能:讀取DS1302的數(shù)據(jù)
  1045. 返 回 值:無
  1046. 時(shí)    間:2014-11-11       
  1047. 備    注:此處讀的是BCD碼
  1048. **************************************************************************************************/
  1049. unsigned char Read1302 ( unsigned char addr )
  1050. {
  1051.     unsigned char i,temp,dat1;
  1052.     DS1302_CE_dr=0;      //單片機(jī)驅(qū)動(dòng)DS1302屬于SPI通訊方式,根據(jù)我的經(jīng)驗(yàn),不用關(guān)閉中斷
  1053.     delay_short(1);
  1054.     SCLK_dr=0;
  1055.     delay_short(1);
  1056.     DS1302_CE_dr = 1;
  1057.     delay_short(1);
  1058.     for ( i=0; i<8; i++ )                                      //循環(huán)8次移位
  1059.     {
  1060.        DIO_dr_sr = 0;
  1061.        temp = addr;
  1062.        if(temp&0x01)
  1063.        {
  1064.           DIO_dr_sr =1;
  1065.        }
  1066.        else
  1067.        {
  1068.           DIO_dr_sr =0;
  1069.        }
  1070.        delay_short(1);
  1071.        addr >>= 1;                                             //右移一位
  1072.        SCLK_dr = 1;
  1073.        delay_short(1);
  1074.        SCLK_dr = 0;
  1075.        delay_short(1);
  1076.     }

  1077. /********************************************************************************************
  1078. 注    釋:51單片機(jī)IO口的特點(diǎn),在讀取數(shù)據(jù)之前必須先輸出高電平,
  1079.           如果是PIC,AVR等單片機(jī),這里應(yīng)該把IO方向寄存器設(shè)置為輸入
  1080. 時(shí)    間:2014-11-11       
  1081. **************************************************************************************************/
  1082.    DIO_dr_sr =1;   //51單片機(jī)IO口的特點(diǎn),在讀取數(shù)據(jù)之前必須先輸出高電平,
  1083.    temp=0;

  1084.    for ( i=0; i<8; i++ )
  1085.    {
  1086.       temp>>=1;
  1087.       if(DIO_dr_sr==1)
  1088.       {
  1089.          temp=temp+0x80;
  1090.       }

  1091.       DIO_dr_sr =1;  //51單片機(jī)IO口的特點(diǎn),在讀取數(shù)據(jù)之前必須先輸出高電平
  1092.       delay_short(1);
  1093.       SCLK_dr = 1;
  1094.       delay_short(1);
  1095.       SCLK_dr = 0;
  1096.       delay_short(1);
  1097.     }

  1098.     DS1302_CE_dr=0;
  1099.     delay_short(1);
  1100.     dat1=temp;
  1101.     return (dat1);
  1102. }

  1103. /********************************************************************************************
  1104. 函數(shù)名稱:BCD轉(zhuǎn)原始數(shù)值程序
  1105. 功    能:
  1106. 返 回 值:無
  1107. 時(shí)    間:2014-11-11       
  1108. 備    注:
  1109. **************************************************************************************************/
  1110. unsigned char bcd_to_number(unsigned char ucBcdTemp)  //BCD轉(zhuǎn)原始數(shù)值
  1111. {
  1112.    unsigned char ucNumberResult=0;
  1113.    unsigned char ucBcdTemp10;
  1114.    unsigned char ucBcdTemp1;

  1115.    ucBcdTemp10=ucBcdTemp;
  1116.    ucBcdTemp10=ucBcdTemp10>>4;
  1117.    ucBcdTemp1=ucBcdTemp;
  1118.    ucBcdTemp1=ucBcdTemp1&0x0f;
  1119.    ucNumberResult=ucBcdTemp10*10+ucBcdTemp1;
  1120.    return ucNumberResult;
  1121. }


  1122. /********************************************************************************************
  1123. 函數(shù)名稱:原始數(shù)值轉(zhuǎn)換成BCD碼
  1124. 功    能:
  1125. 返 回 值:無
  1126. 時(shí)    間:2014-11-11       
  1127. 備    注:
  1128. **************************************************************************************************/
  1129. unsigned char number_to_bcd(unsigned char ucNumberTemp) //原始數(shù)值轉(zhuǎn)BCD
  1130. {
  1131.    unsigned char ucBcdResult=0;
  1132.    unsigned char ucNumberTemp10;
  1133.    unsigned char ucNumberTemp1;

  1134.    ucNumberTemp10=ucNumberTemp;
  1135.    ucNumberTemp10=ucNumberTemp10/10;
  1136.    ucNumberTemp10=ucNumberTemp10<<4;
  1137.    ucNumberTemp10=ucNumberTemp10&0xf0;
  1138.    ucNumberTemp1=ucNumberTemp;
  1139.    ucNumberTemp1=ucNumberTemp1%10;
  1140.    ucBcdResult=ucNumberTemp10|ucNumberTemp1;
  1141.    return ucBcdResult;
  1142. }

  1143. /********************************************************************************************
  1144. 函數(shù)名稱:DS1302備用電池電量用完報(bào)警程序
  1145. 功    能:DS1302備用電池電量用完后,蜂鳴器在0.5S發(fā)也鳴叫
  1146. 返 回 值:無
  1147. 時(shí)    間:2014-11-11       
  1148. 備    注:
  1149. **************************************************************************************************/
  1150. void ds1302_alarm_service(void) //ds1302出錯(cuò)報(bào)警
  1151. {
  1152.     if(ucDs1302Error==1)  //備用電池的電量用完了報(bào)警提示         
  1153.     {
  1154.            if(uiDs1302Cnt>const_ds1302_0_5s)  //大概0.5秒鐘蜂鳴器響一次
  1155.            {
  1156.                                 ucDs1302Lock=1;  //原子鎖加鎖
  1157.                                 uiDs1302Cnt=0; //計(jì)時(shí)器清零
  1158.                                 uiVoiceCnt=const_voice_short; //蜂鳴器聲音觸發(fā),滴一聲就停。
  1159.                                 ucDs1302Lock=0;  //原子鎖解鎖
  1160.            }
  1161.    }
  1162. }

  1163. /********************************************************************************************
  1164. 函數(shù)名稱:熱水完畢報(bào)警程序
  1165. 功    能:熱水完畢后,發(fā)出報(bào)警聲
  1166. 返 回 值:無
  1167. 時(shí)    間:2014-11-14       
  1168. 備    注:
  1169. **************************************************************************************************/
  1170. void ucAlarmPrompt_service()
  1171. {
  1172.     static        unsigned int uiAlarmPromptCnt;        //報(bào)警延時(shí)計(jì)數(shù)器
  1173.         static  unsigned char ucNumberCnt;                //報(bào)警次數(shù)計(jì)數(shù)器
  1174.         static  unsigned int const_time_2s = 400; //報(bào)警的時(shí)間間隔
  1175.         static  unsigned int const_voice_AlarmPrompt = 200;

  1176.    if(ucAlarmPrompt == 1)                                        //報(bào)警標(biāo)志位置位后報(bào)警
  1177.    {
  1178.        uiAlarmPromptCnt++;                                        //報(bào)警延時(shí)計(jì)數(shù)器自加1

  1179.        if(uiAlarmPromptCnt>const_time_2s)        //2S發(fā)出報(bào)警聲音
  1180.            {
  1181.                       uiAlarmPromptCnt = 0;                        //報(bào)警延時(shí)計(jì)數(shù)器清零
  1182.                    uiVoiceCnt=const_voice_AlarmPrompt;                //
  1183.                    ucNumberCnt++;                                        //報(bào)警次數(shù)計(jì)數(shù)器加1
  1184.                   
  1185.                    if(ucNumberCnt == 5)                        //報(bào)警次數(shù)為10次
  1186.                    {
  1187.                               ucNumberCnt = 0;                                //報(bào)警次數(shù)計(jì)數(shù)器清零
  1188.                            ucAlarmPrompt = 0;                        //關(guān)閉報(bào)警
  1189.                    }
  1190.            }
  1191.    }
  1192. }

  1193. /********************************************************************************************
  1194. 函數(shù)名稱:數(shù)碼管顯示驅(qū)動(dòng)程序
  1195. 功    能:顯示對(duì)應(yīng)的時(shí)間
  1196. 返 回 值:無
  1197. 時(shí)    間:2014-11-11       
  1198. 備    注:
  1199. **************************************************************************************************/
  1200. void display()
  1201. {
  1202.         switch(ucDigStep)          //步驟變量
  1203.         {
  1204.            case 1:
  1205.                  P0 = array[ucDigShow1];                  //第一位數(shù)碼管顯示的內(nèi)容
  1206.                          dig1_dr = 0;
  1207.                          delay(10);
  1208.                          dig1_dr = 1;
  1209.                          ucDigStep = 2;
  1210.            break;

  1211.            case 2:
  1212.                             P0 = array[ucDigShow2];                  //第二位數(shù)碼管顯示的內(nèi)容
  1213.                          dig2_dr = 0;
  1214.                          delay(10);
  1215.                          dig2_dr = 1;
  1216.                          ucDigStep = 3;
  1217.            break;

  1218.            case 3:
  1219.                             P0 = array[ucDigShow3];                  //第三位數(shù)碼管顯示的內(nèi)容
  1220.                          dig3_dr = 0;
  1221.                          delay(10);
  1222.                          dig3_dr = 1;
  1223.                          ucDigStep = 4;
  1224.            break;

  1225.            case 4:
  1226.                             P0 = array[ucDigShow4];                  //第四位數(shù)碼管顯示的內(nèi)容
  1227.                          dig4_dr = 0;
  1228.                          delay(10);
  1229.                          dig4_dr = 1;
  1230.                          ucDigStep =1;
  1231.            break;
  1232.         }         
  1233. }


  1234. /********************************************************************************************
  1235. 函數(shù)名稱:熱水時(shí)間和溫度數(shù)據(jù)對(duì)比
  1236. 功    能:將設(shè)定的時(shí)間于當(dāng)前的時(shí)間作對(duì)比,數(shù)據(jù)正確執(zhí)行。
  1237. 返 回 值:無
  1238. 時(shí)    間:2014-11-11       
  1239. 備    注:
  1240. **************************************************************************************************/
  1241. void TimeData_contrast()
  1242. {
  1243.         static unsigned char preser_heat = 0;        //保溫標(biāo)志位
  1244.         static unsigned char  ucCheakFault = 0;                //故障檢查標(biāo)志位
  1245.         static unsigned char ucTimeEqual = 0;       //設(shè)定時(shí)間相等的標(biāo)志位
  1246.         static unsigned char ucTimeAfter  = 0;      //兩分鐘前的時(shí)間
  1247.         static unsigned char ucTepAfter  = 0;      //兩分鐘前的時(shí)間

  1248.         if(ucStartheat == 1&&ucPart == 0)   //開始預(yù)設(shè)加熱標(biāo)志
  1249.         {
  1250.                 if((ucHour == ucSetTimeCnt1) && (ucMinute == ucSetTimeCnt2)&&ucTimeEqual == 0)  //設(shè)定的時(shí)間相等
  1251.             {
  1252. //                        ucStartheat = 1;//啟動(dòng)加熱標(biāo)志位
  1253.                         ucWd = 4;                  //更新到窗口4,顯示溫度
  1254.                         ucWd4Update = 1;
  1255.                         ucDigTimeLock = 1;  //小數(shù)點(diǎn)不顯示

  1256.                         relay_dr = 1;        //繼電器輸出高(吸合)
  1257.                         ucCheakFault = 1;//故障檢查
  1258.                         ucTimeEqual = 1;//時(shí)間對(duì)比完成
  1259.                         ucTimeAfter         = 0;//先對(duì)變量清零
  1260.                         ucTepAfter         = 0;//先對(duì)變量清零
  1261.                         ucTimeAfter = ucMinute;
  1262.                         ucTepAfter = ucAD_value_Tem;
  1263. //                        ucAlarmPrompt = 1;  //故障報(bào)警
  1264.                 }

  1265.                 if(ucCheakFault == 1&&(ucTimeAfter+3) == ucMinute)
  1266.                 {
  1267.                         if(ucAD_value_Tem>=(ucTepAfter+2))
  1268.                         {
  1269.                            ucCheakFault = 0;   //故障檢測(cè)清零,只做一次檢測(cè)
  1270.                            ucTimeEqual = 0;//時(shí)間對(duì)比完成標(biāo)志清零,為下一次做準(zhǔn)備

  1271.                         }
  1272.                         else
  1273.                         {
  1274.                                 relay_dr = 0;        //繼電器輸出(斷開)

  1275.                                 ucWd = 5;                  //更新到窗口5,顯示錯(cuò)誤代碼E001
  1276.                                 ucWd5Update = 1;

  1277.                                 ucTemp1 = 12; //E
  1278.                                 ucTemp2 = 0;  //0
  1279.                                 ucTemp3 = 0;  //0
  1280.                                 ucTemp4 = 1;  //1

  1281.                                 ucDigTimeLock = 1;  //小數(shù)點(diǎn)不顯示
  1282.                                 ucAlarmPrompt = 1;  //故障報(bào)警
  1283.                                 ucCheakFault = 0;   //故障檢測(cè)清零,只做一次檢測(cè)
  1284.                                 ucStartheat = 0;  //檢測(cè)到有故障,停止加熱
  1285.                         }
  1286.                        
  1287.                 }

  1288.                 if(ucAD_value_Tem>=ucSetTepCnt1)        //設(shè)定到加熱溫度相等         
  1289.             {
  1290.                         ucStartheat = 0;//停止預(yù)設(shè)加熱標(biāo)志
  1291.                         relay_dr = 0;        //繼電器輸出(斷開)

  1292. //                        ucCheakFault = 0;//故障檢查標(biāo)志清零,為下一次做準(zhǔn)備

  1293.                         ucAlarmPrompt = 1; //報(bào)警標(biāo)志位置1,啟動(dòng)報(bào)警
  1294.                         preser_heat = 1;   //執(zhí)行保溫標(biāo)志位,開始進(jìn)行保溫

  1295.                         ucWd = 1;                //切換到窗口1顯示時(shí)間
  1296.                         ucWd1Update = 1;//更新窗口1
  1297.                         ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)
  1298.                 }

  1299.         }
  1300.        
  1301.         if(preser_heat == 1)        //保溫程序,開始執(zhí)行
  1302.         {
  1303.                 if((ucSetTepCnt1-5) >= ucAD_value_Tem)
  1304.                 {
  1305.                            relay_dr = 1;        //繼電器輸出

  1306.                         ucWd = 4;                //切換到窗口4顯示時(shí)間
  1307.                         ucWd4Update = 1;//更新窗口4
  1308.                         ucDigTimeLock = 1; //不顯示小數(shù)點(diǎn)

  1309.                 }

  1310.                 if((ucSetTepCnt1+5) <= ucAD_value_Tem)
  1311.                 {
  1312.                         relay_dr = 0;        //繼電器輸出

  1313.                         ucWd = 1;                //切換到窗口1顯示時(shí)間
  1314.                         ucWd1Update = 1;//更新窗口1
  1315.                         ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)

  1316.                 }
  1317.         }
  1318. }


  1319. /********************************************************************************************
  1320. 函數(shù)名稱:ADC采樣程序
  1321. 功    能:讀取ADC0832轉(zhuǎn)換后的數(shù)據(jù)
  1322. 返 回 值:
  1323. 時(shí)    間:2014-11-24       
  1324. 備    注:
  1325. **************************************************************************************************/
  1326. void ADC_sampling_service()
  1327. {
  1328.         static unsigned char i = 0;  //讀取數(shù)據(jù)8位的次數(shù)變量
  1329.         static unsigned char ucADC;  //AD值
  1330.         static unsigned char ucCheckADC; //校驗(yàn)的AD值
  1331.         static unsigned int ucTemp;   //參與換算的中間變量
  1332.         static unsigned int uiTempFilterV=0; //參與換算的中間變量
  1333. //    static unsigned long ulBackupFilterV=255;  //備份最新采樣數(shù)據(jù)的中間變量
  1334. //        static unsigned int  uiTimpFilterTep = 0;
  1335.         static unsigned char wendu;
  1336.         static unsigned int Adresult;
  1337.     static unsigned char ucSamplingCnt=0; //統(tǒng)計(jì)采樣的次數(shù)  本程序采樣8次后求平均值

  1338.         adc0832_CS_dr = 0;        //使能端置低

  1339.         adc0832_DI_sr_dr = 1;  //起始位
  1340.         adc0832_CLK_dr = 0;           //輸出低電平
  1341.         delay_short(1);                   //小延時(shí)
  1342.         adc0832_CLK_dr = 1;           //輸出高電平

  1343.         adc0832_DI_sr_dr = 1;  //選擇通道,輸出數(shù)據(jù)1
  1344.         adc0832_CLK_dr = 0;
  1345.         adc0832_CLK_dr = 1;

  1346.         adc0832_DI_sr_dr = 0;  //選擇通道。輸出數(shù)據(jù)0
  1347.         adc0832_CLK_dr = 0;
  1348.         adc0832_CLK_dr = 1;

  1349.     adc0832_DI_sr_dr = 1;  //拉高數(shù)據(jù)線
  1350.         delay_short(2);                   //延時(shí)

  1351.         adc0832_CLK_dr = 1;           //一個(gè)下降延
  1352.         adc0832_CLK_dr = 0;
  1353.         delay_short(1);

  1354.         for(i = 0;i<8;i++)                //讀取8位
  1355.         {
  1356.             ucADC <<= 1;
  1357.             adc0832_CLK_dr = 1;
  1358.             adc0832_CLK_dr = 0;

  1359.                 if(adc0832_DI_sr_dr == 1)
  1360.                 {
  1361.                    ucADC  |= 0x01;
  1362.                 }

  1363.         }

  1364.         for(i=0;i<8;i++)                //讀取校驗(yàn)位
  1365.         {
  1366.            ucCheckADC >>= 1;

  1367.            if(adc0832_DI_sr_dr == 1)
  1368.            {
  1369.                ucCheckADC |= 0x80;
  1370.            }
  1371.            adc0832_CLK_dr = 1;
  1372.            adc0832_CLK_dr = 0;

  1373.         }
  1374.        
  1375.         adc0832_CS_dr = 1;                //拉高使能端

  1376.         if(ucADC == ucCheckADC)        //校驗(yàn)兩個(gè)讀取的數(shù)據(jù)是否一致
  1377.         {
  1378.         ucTemp=ucADC; //把char類型數(shù)據(jù)賦值給long類型數(shù)據(jù),參與乘除法運(yùn)算的數(shù)據(jù),為了避免運(yùn)算結(jié)果溢出,我都用long類型


  1379.                 uiTempFilterV=uiTempFilterV+ucTemp;  //累加8次后求平均值
  1380.                 ucSamplingCnt++;  //統(tǒng)計(jì)已經(jīng)采樣累計(jì)的次數(shù)

  1381.                 if(ucSamplingCnt>=8)
  1382.                 {

  1383. /* 注釋二:
  1384. * 求平均值濾波法,為了得到的數(shù)據(jù)更加圓滑,去除小毛刺。
  1385. * 向右邊移動(dòng)3位相當(dāng)于除以8。
  1386. */

  1387. //                     uiTempFilterV=uiTempFilterV>>3; //求平均值濾波法


  1388.                                     Adresult=(255000/uiTempFilterV)-100;//求得當(dāng)前溫度對(duì)應(yīng)的阻值,十歐為單位,此公式的演變請(qǐng)看上述詳細(xì)說明

  1389. //                                     if(ulBackupFilterV>=20)  //最近備份的上一次數(shù)據(jù)大于等于0.02V的情況下
  1390. //                    {
  1391. //                                                if(Adresult<(ulBackupFilterV-5)||Adresult>(ulBackupFilterV+5)) //在正負(fù)0.020V偏差范圍外,更新
  1392. //                                                {
  1393. //                                                        ulBackupFilterV=Adresult;  //備份最新采樣的數(shù)據(jù),方便下一次對(duì)比判斷
  1394. //                                                        uiTimpFilterTep=Adresult; //得到經(jīng)過濾波處理的實(shí)時(shí)電壓值
  1395. ////                                                        ucWd4Part1Update=1; //局部更新顯示經(jīng)過濾波處理的電壓
  1396. //                                                }
  1397. //                    }
  1398. //                    else   //最近備份的上一次數(shù)據(jù)小于0.02V的情況下
  1399. //                    {
  1400. //                                                if(uiTempFilterV>(ulBackupFilterV+2))  //在正0.020V偏差范圍外,更新
  1401. //                                                {
  1402. //                                                        ulBackupFilterV=Adresult;  //備份最新采樣的數(shù)據(jù),方便下一次對(duì)比判斷
  1403. //                                                        uiTimpFilterTep=Adresult; //得到經(jīng)過濾波處理的實(shí)時(shí)電壓值
  1404. ////                                                        ucWd4Part1Update=1; //局部更新顯示經(jīng)過濾波處理的電壓
  1405. //                                                }
  1406. //                  
  1407. //                    }

  1408.                                          wendu = 0;//清零

  1409.                                          while(1)
  1410.                                          {
  1411.                                              if(Adresult>=wendu_tab[wendu])
  1412.                                                  {
  1413.                                                         break;
  1414.                                                  }

  1415.                                                  wendu++;

  1416.                                                  if(wendu>=105)
  1417.                                                  {
  1418.                                                      wendu = 105;
  1419.                                                          break;
  1420.                                                  }
  1421.                                                  
  1422.                                          }

  1423.                                         ucAD_value_Tem = wendu;

  1424.                     ucSamplingCnt=0;  //清零,為下一輪采樣濾波作準(zhǔn)備。
  1425.                     uiTempFilterV=0;
  1426.                 }
  1427.         
  1428.         }
  1429.         else
  1430.         {
  1431.             ucADC = 0;                        //兩次讀取的數(shù)據(jù)不一致,就把數(shù)據(jù)清零
  1432.                 ucAD_value_Tem = wendu;

  1433.         }
  1434.     ucWd4Update = 1;//更新窗口4

  1435. }


  1436. /********************************************************************************************
  1437. 函數(shù)名稱:定時(shí)器中斷程序
  1438. 功    能:
  1439. 返 回 值:無
  1440. 時(shí)    間:2014-11-11       
  1441. 備    注:
  1442. **************************************************************************************************/
  1443. void T0_time() interrupt 1
  1444. {

  1445.    TF0=0;  //清除中斷標(biāo)志
  1446.    TR0=0; //關(guān)中斷
  1447.    display();                 //數(shù)碼管顯示放在中斷里
  1448.    key_scan();                 //按鍵掃描放在中斷里
  1449. /********************************************************************************************
  1450. 功    能:按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器在外部可以關(guān)閉,不開啟計(jì)時(shí)功能
  1451. 時(shí)    間:2014-11-11       
  1452. **************************************************************************************************/
  1453.    if(ucKeyStartFlag1==1)           //啟動(dòng)計(jì)數(shù)器
  1454.    {
  1455.        if(uiKeyTimeCnt1<0xffff)//防止計(jì)數(shù)器超出范圍
  1456.            {
  1457.                uiKeyTimeCnt1++;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器自加1
  1458.            }   
  1459.    }

  1460. /********************************************************************************************
  1461. 功    能:按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器在外部可以關(guān)閉,不開啟計(jì)時(shí)功能
  1462. 時(shí)    間:2014-11-11       
  1463. **************************************************************************************************/
  1464.    if(ucKeyStartFlag2==1)          //啟動(dòng)計(jì)數(shù)器
  1465.    {
  1466.        if(uiKeyTimeCnt2<0xffff)        //防止計(jì)數(shù)器超出范圍
  1467.            {
  1468.                uiKeyTimeCnt2++;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器自加1
  1469.            }
  1470.    }

  1471. /********************************************************************************************
  1472. 功    能:按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器在外部可以關(guān)閉,不開啟計(jì)時(shí)功能
  1473. 時(shí)    間:2014-11-11       
  1474. **************************************************************************************************/
  1475.    if(ucKeyStartFlag3==1)          //啟動(dòng)計(jì)數(shù)器
  1476.    {
  1477.        if(uiKeyTimeCnt3<0xffff)        //防止計(jì)數(shù)器超出范圍
  1478.            {
  1479.                uiKeyTimeCnt3++;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器自加1
  1480.            }
  1481.    }

  1482. /********************************************************************************************
  1483. 功    能:按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器在外部可以關(guān)閉,不開啟計(jì)時(shí)功能
  1484. 時(shí)    間:2014-11-11       
  1485. **************************************************************************************************/
  1486.    if(ucKeyStartFlag4==1)          //啟動(dòng)計(jì)數(shù)器
  1487.    {
  1488.        if(uiKeyTimeCnt3<0xffff)        //防止計(jì)數(shù)器超出范圍
  1489.            {
  1490.                uiKeyTimeCnt4++;           //按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器自加1
  1491.            }
  1492.    }

  1493. /********************************************************************************************
  1494. 功    能:間歇性蜂鳴器報(bào)警計(jì)數(shù)器在外部可以關(guān)閉,不開啟計(jì)時(shí)功能
  1495. 時(shí)    間:2014-11-11       
  1496. **************************************************************************************************/
  1497.     if(ucDs1302Error>0) //EEPROM出錯(cuò)
  1498.         {
  1499.                 if(ucDs1302Lock==0)//原子鎖判斷
  1500.                 {
  1501.                         uiDs1302Cnt++;  //間歇性蜂鳴器報(bào)警的計(jì)時(shí)器
  1502.                 }
  1503.         }

  1504. /********************************************************************************************
  1505. 功    能:蜂鳴器驅(qū)動(dòng)放在中斷里面
  1506. 時(shí)    間:2014-11-11       
  1507. **************************************************************************************************/
  1508.    if(uiVoiceCnt!=0)   //蜂鳴器
  1509.    {
  1510.        uiVoiceCnt--;  //每次進(jìn)入定時(shí)中斷都自減1,直到等于零為止。才停止鳴叫
  1511.            beep_dr = 0;          //蜂鳴器是PNP三極管控制,低電平就開始鳴叫
  1512.    }
  1513.    else
  1514.    {
  1515.        beep_dr = 1;   //蜂鳴器是PNP三極管控制,高電平就停止鳴叫。
  1516.    }


  1517.         TH0=0xf8;   //重裝初始值(65535-2000)=63535=0xf82f
  1518.         TL0=0x2f;
  1519.         EA = 1;
  1520.         ET0 = 1;
  1521.         TR0=1;  //開中斷
  1522. }


  1523. /********************************************************************************************
  1524. 函數(shù)名稱:定時(shí)器初始化程序
  1525. 功    能:
  1526. 返 回 值:無
  1527. 時(shí)    間:2014-11-11       
  1528. 備    注:
  1529. **************************************************************************************************/
  1530. void T0_init()
  1531. {
  1532.    TH0=0xf8;   //重裝初始值(65535-2000)=63535=0xf82f
  1533.    TL0=0x2f;
  1534.    EA = 1;
  1535.    ET0 = 1;
  1536.    TR0=1;  //開中斷

  1537.    /* 注釋七:
  1538.         * 檢查ds1302芯片的備用電池電量是否用完了。
  1539.         * 在上電的時(shí)候,在一個(gè)特定的地址里把數(shù)據(jù)讀出來,如果發(fā)現(xiàn)不等于0x5a,
  1540.         * 則是因?yàn)閭溆秒姵仉娏坑猛炅,?dǎo)致保存在ds1302內(nèi)部RAM數(shù)據(jù)區(qū)的數(shù)據(jù)被更改,
  1541.         * 與此同時(shí),應(yīng)該重新寫入一次0x5a,為下一次通電判斷做準(zhǔn)備
  1542.         */
  1543.         ucCheckDs1302=Read1302(READ_CHECK); //判斷ds1302內(nèi)部的數(shù)據(jù)是否被更改
  1544.         if(ucCheckDs1302!=0x5a)  
  1545.         {
  1546.                 Write1302 (WRITE_PROTECT,0X00);          //禁止寫保護(hù)
  1547.                 Write1302 (WRITE_CHECK,0x5a);            //重新寫入標(biāo)志數(shù)據(jù),方便下一次更換新電池后的判斷
  1548.                 Write1302 (WRITE_PROTECT,0x80);          //允許寫保護(hù)
  1549.                 ucDs1302Error = 1;                                //1表示報(bào)警啟動(dòng)
  1550.                 ucWd = 5;                  //更新到窗口5,顯示錯(cuò)誤代碼E001
  1551.                 ucWd5Update = 1;
  1552.                
  1553.                 ucTemp1 = 12; //E
  1554.                 ucTemp2 = 0;  //0
  1555.                 ucTemp3 = 0;  //0
  1556.                 ucTemp4 = 2;  //1
  1557.                
  1558.                 ucDigTimeLock = 1;  //小數(shù)點(diǎn)不顯示

  1559.         }
  1560. }


  1561. /********************************************************************************************
  1562. 函數(shù)名稱:初始化單片機(jī)內(nèi)部和外部IO口
  1563. 功    能:
  1564. 返 回 值:無
  1565. 時(shí)    間:2014-11-11       
  1566. 備    注:
  1567. **************************************************************************************************/
  1568. void initial_myself(void)  //第一區(qū) 初始化單片機(jī)
  1569. {
  1570.         beep_dr=1; //用PNP三極管控制蜂鳴器,輸出高電平時(shí)不叫。
  1571.         relay_dr = 0;
  1572.         dig1_dr = 1;
  1573.         dig2_dr = 1;
  1574.         dig3_dr = 1;
  1575.         dig4_dr = 1;
  1576.         delay_long(30);
  1577. }


  1578. /********************************************************************************************
  1579. 函數(shù)名稱:延時(shí)程序
  1580. 功    能:
  1581. 返 回 值:無
  1582. 時(shí)    間:2014-11-11       
  1583. 備    注:
  1584. **************************************************************************************************/
  1585. void delay(unsigned int delay_ms)                  //延時(shí)函數(shù)
  1586. {
  1587.     unsigned int i,j;

  1588.         for(i = delay_ms;i>0;i--)
  1589.            for(j = 10;j>0;j--);
  1590. }

  1591. /********************************************************************************************
  1592. 函數(shù)名稱:延時(shí)程序
  1593. 功    能:
  1594. 返 回 值:無
  1595. 時(shí)    間:2014-11-11       
  1596. 備    注:
  1597. **************************************************************************************************/
  1598. void delay_short(unsigned int uiDelayShort)
  1599. {
  1600.    unsigned int i;  

  1601.    for(i=0;i<uiDelayShort;i++)
  1602.    {
  1603.       ;   //一個(gè)分號(hào)相當(dāng)于執(zhí)行一條空語句
  1604.    }
  1605. }

  1606. /********************************************************************************************
  1607. 函數(shù)名稱: 延時(shí)程序
  1608. 功    能:
  1609. 返 回 值:無
  1610. 時(shí)    間:2014-11-11       
  1611. 備    注:
  1612. **************************************************************************************************/
  1613. void delay_long(unsigned int uiDelayLong)
  1614. {
  1615.    unsigned int i;
  1616.    unsigned int j;

  1617.    for(i=uiDelayLong;i>0;i--)
  1618.       for(j=50;j>0;j--);  //內(nèi)嵌循環(huán)的空指令數(shù)量
  1619. }
復(fù)制代碼


作者: hujia    時(shí)間: 2014-12-9 22:09
這個(gè)東西很實(shí)用 ,,樓主的diy能力太強(qiáng)了 不過繼電器容易壞 特別是在潮濕的環(huán)境里面 建議改成可控硅的 ,成本也基本上差不多
作者: xiao_yp2014    時(shí)間: 2014-12-10 09:15
hujia 發(fā)表于 2014-12-9 22:09
這個(gè)東西很實(shí)用 ,,樓主的diy能力太強(qiáng)了 不過繼電器容易壞 特別是在潮濕的環(huán)境里面 建議改成可控硅的 ,成 ...

相與學(xué)習(xí),感謝您的寶貴意見,我也考慮過用可控硅,但是控制電路相對(duì)于繼電器來說要復(fù)雜一些。我的繼電器采用的12V 40A應(yīng)該問題不大。
作者: pps111    時(shí)間: 2014-12-19 22:00
不錯(cuò)啦,值得收藏
作者: pps111    時(shí)間: 2014-12-19 22:01
謝謝你了
作者: xiao_yp2014    時(shí)間: 2014-12-20 11:00
pps111 發(fā)表于 2014-12-19 22:00
不錯(cuò)啦,值得收藏


作者: xiao_yp2014    時(shí)間: 2014-12-20 11:00
pps111 發(fā)表于 2014-12-19 22:01
謝謝你了

不客氣
作者: seeking1005    時(shí)間: 2015-1-21 01:31
51Hei(51黑)論壇有你更精彩
作者: qq704661078    時(shí)間: 2015-1-31 18:49
謝謝啦,值得收藏!!
作者: jinqilin    時(shí)間: 2015-1-31 20:02
樓主 好強(qiáng)大

作者: hurbo    時(shí)間: 2015-2-16 20:39
學(xué)習(xí)一下,非常不錯(cuò)。謝謝樓主分享
作者: yyh    時(shí)間: 2015-2-25 17:23
樓主太厲害了
作者: yyh    時(shí)間: 2015-2-25 17:26
真是高手
作者: yyh    時(shí)間: 2015-2-25 17:27
好強(qiáng)大
作者: yyh    時(shí)間: 2015-2-25 17:27
功能強(qiáng)大
作者: yyh    時(shí)間: 2015-2-25 18:49
有沒有
作者: yyh    時(shí)間: 2015-2-25 18:49
電路圖
作者: eclidtf    時(shí)間: 2015-2-26 22:41
功能很齊全,設(shè)計(jì)想到的很細(xì),比較全面

作者: 小天愛小蔥    時(shí)間: 2015-4-24 15:25
厲害!
作者: hlywhp    時(shí)間: 2015-4-26 13:47
這是個(gè)好的東西,
作者: hlywhp    時(shí)間: 2015-4-26 13:47
謝謝樓主共享
作者: hlywhp    時(shí)間: 2015-4-26 13:50
謝謝樓主
作者: hlywhp    時(shí)間: 2015-4-26 13:50
電路板搞得漂亮
作者: 安陽市新世紀(jì)    時(shí)間: 2015-5-3 10:49
做工精細(xì),好好學(xué)習(xí)學(xué)習(xí),多謝樓主分享
作者: 南天白云    時(shí)間: 2015-5-3 18:09
樓主:你太強(qiáng)大了,必須頂你。資料不錯(cuò),如果有電路圖更好。
作者: leichyi    時(shí)間: 2015-5-6 15:14
沒黑幣了
作者: leichyi    時(shí)間: 2015-5-6 15:14
再鼎一下
作者: superman_chao    時(shí)間: 2015-5-6 15:51
膜拜啊
作者: qjy822    時(shí)間: 2015-5-8 13:03

好好學(xué)習(xí)學(xué)習(xí),多謝樓主分享
作者: kmtbm    時(shí)間: 2015-5-14 14:37
好好學(xué)習(xí)
作者: kmtbm    時(shí)間: 2015-5-14 14:37
學(xué)習(xí)一下,非常不錯(cuò)。謝謝樓主分享
作者: kmtbm    時(shí)間: 2015-5-14 15:21
樓主強(qiáng)大,
作者: 咕咕咕    時(shí)間: 2015-7-2 15:14
很有用的。
作者: a870739138    時(shí)間: 2015-9-24 11:26
膜拜,學(xué)習(xí)學(xué)習(xí)
作者: ludaijin    時(shí)間: 2015-9-27 19:52
不說什么,就是頂
作者: douhao    時(shí)間: 2015-10-5 08:54
高手中的高手啊,看的我好崇拜
作者: hua7718534    時(shí)間: 2015-11-9 16:39
高手中的高手啊,看的我好崇拜
作者: 愛的步伐XY    時(shí)間: 2015-12-11 01:33
做工精細(xì),好好學(xué)習(xí)學(xué)習(xí),多謝樓主分享
作者: xsynet    時(shí)間: 2015-12-12 12:48
請(qǐng)問樓主,xps文件打不開,怎么辦?謝謝!
作者: ningpan321    時(shí)間: 2015-12-12 19:00
牛X,學(xué)習(xí)學(xué)習(xí)
作者: madell    時(shí)間: 2015-12-24 15:31
非常好,很實(shí)用
作者: sunshine2016    時(shí)間: 2016-2-5 14:02
高手!學(xué)習(xí)學(xué)習(xí)!
作者: sunshine2016    時(shí)間: 2016-2-5 14:02
高手,學(xué)習(xí)學(xué)習(xí)

作者: a739140487    時(shí)間: 2016-2-10 23:11
樓主厲害。
作者: ls0899    時(shí)間: 2016-2-11 21:48
下了。還沒試,我覺得還是用18b20的好
作者: 騰飛的龍    時(shí)間: 2016-2-15 13:20
學(xué)義利用,值得尊敬。謝謝分享!
作者: 2855177040    時(shí)間: 2016-2-23 22:14
只覺得你是高手。
作者: capacitance_1    時(shí)間: 2016-2-24 08:28
樓主焊工了得呀
作者: a525008441    時(shí)間: 2016-3-23 08:47
感謝樓主分享
作者: a525008441    時(shí)間: 2016-3-23 08:48
正好能用上這個(gè)
作者: zrb5688    時(shí)間: 2016-3-23 13:07
這個(gè)不錯(cuò),謝謝樓主分享。
作者: wysh_2004    時(shí)間: 2016-3-24 14:50
用無觸點(diǎn)開關(guān),電路簡單。
作者: 三極管大神    時(shí)間: 2016-3-25 21:00
不錯(cuò),華麗的效果,值得一學(xué)!
作者: 930417801    時(shí)間: 2016-3-26 10:37

做工精細(xì),好好學(xué)習(xí)學(xué)習(xí),多謝樓主分享
作者: yqs138168    時(shí)間: 2016-3-26 13:52
單片機(jī)智能熱水器控制系統(tǒng) [修改]
作者: yqs138168    時(shí)間: 2016-3-26 13:53
RE: 純手工打造,51單片機(jī)智能熱水器控制系統(tǒng) [修改]
作者: d14445    時(shí)間: 2016-5-9 16:57
我都想了1個(gè)星期了,大恩不言謝
作者: hefeng898961    時(shí)間: 2016-5-9 18:30
感謝分享
作者: 1304464498    時(shí)間: 2016-6-24 09:44
有仿真嗎?發(fā)一份學(xué)習(xí)。郵箱1304464498@qq.com
作者: FSLTKJ    時(shí)間: 2016-6-24 12:29
向高手學(xué)習(xí)。
作者: 獨(dú)孤俠    時(shí)間: 2017-10-11 19:36
精細(xì),好好學(xué)習(xí)學(xué)習(xí),多謝樓主分享
作者: mslong    時(shí)間: 2017-10-11 22:38
有用,功能全
作者: yyfpy    時(shí)間: 2017-10-20 09:51
感謝樓主分享!學(xué)習(xí)!
作者: mnbvcxzlkjhgfds    時(shí)間: 2017-11-9 00:30
支持:……金幣都下沒了
作者: ddwe    時(shí)間: 2017-11-9 13:22
謝謝!值得收藏!
作者: 玉溪麒麟    時(shí)間: 2017-11-15 17:23
好東西,我們學(xué)校的熱水器就是類似的功能
作者: 不見曦月_327    時(shí)間: 2017-12-14 20:34
有proteus仿真嗎?大學(xué)生自主學(xué)習(xí),目前還沒有能力焊PCB板,一直用proteus仿真。
只求看一下仿真效果。郵箱2170945198@qq.com
作者: 游俠(單片機(jī)開    時(shí)間: 2017-12-14 22:10
為何不用18b20測(cè)溫
作者: szzxl10    時(shí)間: 2017-12-15 13:56
樓主 好強(qiáng)大
作者: 1418473823    時(shí)間: 2018-3-20 14:49
強(qiáng)的一批。。!
作者: 1571171827    時(shí)間: 2018-4-10 23:13
可以說是非常良心的帖子了
作者: yzh123    時(shí)間: 2018-4-23 17:10
厲害,謝謝分享
作者: cliang223    時(shí)間: 2018-4-23 18:08
強(qiáng)大的功能啊,學(xué)習(xí)下
作者: zhangshanqiao    時(shí)間: 2018-5-25 09:48
看到手工焊接的面包板這么規(guī)整,佩服
作者: cooleaf    時(shí)間: 2018-11-21 13:27
看到手工焊接的面包板這么規(guī)整,是個(gè)細(xì)致的人。
作者: 555555.XY    時(shí)間: 2018-11-21 17:42
謝謝樓主的分享
作者: 大米861    時(shí)間: 2019-3-13 15:08
剛好要學(xué)習(xí)這個(gè),下載學(xué)習(xí)了,謝謝樓主。
作者: cba_cba    時(shí)間: 2019-9-9 16:40
不知有可控硅輸出方面軟件不?
作者: 158987    時(shí)間: 2019-9-10 11:43
謝謝分享 好東西




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1