|
本帖最后由 xiao_yp2014 于 2016-3-11 10:11 編輯
大家好!我叫肖亞平,從小熱愛上了電子技術(shù),讀書時陰差陽錯的選擇了電子這方面的專業(yè),學(xué)習(xí)電子技術(shù)。對于我的理解來說,學(xué)校里面學(xué)到的技術(shù)不是全部實(shí)用,但是必須有用,所以一直奮斗在前線。我對學(xué)習(xí)總結(jié)出一句話“壓力不是有人努力,而是比你牛X N倍的人依然在努力
歡迎加入“單片機(jī)程序開發(fā)”交流群:425089475
/********************************************************************************************
名 稱:智能熱水器控制系統(tǒng)
功 能:
1、數(shù)碼管顯示當(dāng)前北京時間�?蓪r間進(jìn)行修改。
2、設(shè)定時間,到達(dá)設(shè)定的時間開始加熱。
3、設(shè)定溫度,到達(dá)設(shè)定的溫度值,停止加熱。
4、加熱完畢后,蜂鳴器報警提示,溫度控制在設(shè)定溫度+-5度變化。(+-5度還是溫度采樣的精度,只是為了不讓繼電器平凡跳動)
5、DS1302備用電池電量用完時,蜂鳴器報警。并在數(shù)碼管上顯示E002代碼
6、發(fā)熱體好壞判別,如果壞了,蜂鳴器報警,并在數(shù)碼管上顯示E001代碼。
7、沒有水的情況下,不加熱,并且蜂鳴器發(fā)出報警。
8、數(shù)碼管顯示6個窗口。
窗口1:顯示當(dāng)前的北京時間
窗口2:顯示設(shè)定的時間
窗口3:顯示設(shè)定的溫度
窗口4:顯示設(shè)定的水溫
窗口5:顯示錯誤代碼
窗口6:顯示開機(jī)畫面
9、按鍵采用了:單擊,長按,短按。最多一個按鍵實(shí)現(xiàn)三個功能。
作 者:肖亞平
創(chuàng)建時間:2014年11月11日
修改時間:2014年13月3日
備 注:程序如有問題,請聯(lián)系 QQ交流群:425089475 電話:15882089269 由于水平能力有限,紕漏之外,還望各位高人指出。。。。。
**************************************************************************************************/
正面
正面
背面
背面
熱水器程序——測試.zip
(123.57 KB, 下載次數(shù): 382)
2014-12-3 08:51 上傳
點(diǎn)擊文件名下載附件
程序已通過測試
-------->源程序
智能熱水器.zip
(120.23 KB, 下載次數(shù): 402)
2014-12-3 09:17 上傳
點(diǎn)擊文件名下載附件
主要器件說明:
1、STC89C52單片機(jī)作為主控芯片
2、ADC0832
· 8位分辨率;
. 逐次逼近式A/D轉(zhuǎn)換器
· 雙通道A/D轉(zhuǎn)換;
· 輸入輸出電平與TTL/CMOS相兼容;
· 5V電源供電時輸入電壓在0~5V之間;
· 工作頻率為250KHZ,轉(zhuǎn)換時間為32μS;
· 一般功耗僅為15mW;
芯片接口說明:
· CS_片選使能,低電平芯片使能。
· CH0 模擬輸入通道0,或作為IN+/-使用。
· CH1 模擬輸入通道1,或作為IN+/-使用。
· GND 芯片參考0 電位(地)。
· DI 數(shù)據(jù)信號輸入,選擇通道控制。
· DO 數(shù)據(jù)信號輸出,轉(zhuǎn)換數(shù)據(jù)輸出。
· CLK 芯片時鐘輸入。
· Vcc/REF 電源輸入及參考電壓輸入(復(fù)用)。
ADC0832 為8位分辨率A/D轉(zhuǎn)換芯片,其最高分辨可達(dá)256級,可以適應(yīng)一般的模擬量轉(zhuǎn)換要求。其內(nèi)部電源輸入與參考電壓的復(fù)用,使得芯片的模擬電壓輸入在0~5V之間。芯片轉(zhuǎn)換時間僅為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ī)對ADC0832 的控制原理
正常情況下ADC0832 與單片機(jī)的接口應(yīng)為4條數(shù)據(jù)線,分別是CS、CLK、DO、DI。但由于DO端與DI端在通信時并未同時有效并與單片機(jī)的接口是雙向的,所以電路設(shè)計時可以將DO和DI 并聯(lián)在一根數(shù)據(jù)線上使用。當(dāng)ADC0832未工作時其CS輸入端應(yīng)為高電平,此時芯片禁用,CLK 和DO/DI 的電平可任意。當(dāng)要進(jìn)行A/D轉(zhuǎn)換時,須先將CS使能端置于低電平并且保持低電平直到轉(zhuǎn)換完全結(jié)束。此時芯片開始轉(zhuǎn)換工作,同時由處理器向芯片時鐘輸入端CLK 輸入時鐘脈沖,DO/DI端則使用DI端輸入通道功能選擇的數(shù)據(jù)信號。在第1 個時鐘脈沖的下沉之前DI端必須是高電平,表示啟始信號。在第2、3個脈沖下沉之前DI端應(yīng)輸入2 位數(shù)據(jù)用于選擇通道功能,其功能詳見官方資料。
3、DS1302實(shí)時時鐘芯片(用于用準(zhǔn)確的時間)
DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實(shí)時時鐘電路,它可以對年、月、日、周日、時、分、秒進(jìn)行計時,具有閏年補(bǔ)償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產(chǎn)品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,同時提供了對后備電源進(jìn)行涓細(xì)電流充電的能力。
結(jié)構(gòu)DS1302的引腳排列,其中Vcc2為主電源,VCC1為后備電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復(fù)位/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)傳送的方法。當(dāng)RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進(jìn)行操作。如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時,在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細(xì)說明。SCLK為時鐘輸入端。 下圖為DS1302的引腳功能圖
4、溫度采用NTC10K熱敏電阻
10K溫度阻值對應(yīng)表.zip
(4.14 KB, 下載次數(shù): 136)
2014-12-3 09:13 上傳
點(diǎn)擊文件名下載附件
5、繼電器
由于是熱水器,發(fā)熱體的功率比較大,所以就選用:12V、40A
注:原理圖和中的繼電器驅(qū)動用的是低電平,程序中用的是高電平。
6、數(shù)碼管
共陽極數(shù)碼管,PNP三極管做驅(qū)動。中間兩點(diǎn)是時間的秒,要單獨(dú)用一個I/O控制。
為什么要單獨(dú)用一個I/O口控制?
因?yàn)椋褐虚g兩點(diǎn)閃亮一下就是1S,不可以放在P0數(shù)據(jù)端口,這樣數(shù)碼管要500MS才掃描一次,數(shù)碼管會閃爍,所以要單獨(dú)用一個I/O來控制。
程序如下:- /********************************************************************************************
- 名 稱:智能熱水器控制系統(tǒng)
- 功 能:
- 1、數(shù)碼管顯示當(dāng)前北京時間�?蓪r間進(jìn)行修改。
- 2、設(shè)定時間,到達(dá)設(shè)定的時間開始加熱。
- 3、設(shè)定溫度,到達(dá)設(shè)定的溫度值,停止加熱。
- 4、加熱完畢后,蜂鳴器報警提示,溫度控制在設(shè)定溫度+-5度變化。
- 5、DS1302備用電池電量用完時,蜂鳴器報警。并在數(shù)碼管上顯示E002代碼
- 6、發(fā)熱體好壞判別,如果壞了,蜂鳴器報警,并在數(shù)碼管上顯示E001代碼。
- 7、沒有水的情況下,不加熱,并且蜂鳴器發(fā)出報警。
- 作 者:肖亞平
- 創(chuàng)建時間:2014年11月11日
- 修改時間:
- 備 注:
- **************************************************************************************************/
- #include<reg52.h> //頭文件
- #define const_dpy_time_half 200 //數(shù)碼管閃爍時間的半值
- #define const_dpy_time_all 400 //數(shù)碼管閃爍時間的全值 一定要比const_dpy_time_half 大
- #define const_voice_short 40 //蜂鳴器短叫的持續(xù)時間
- #define const_voice_long 120 //蜂鳴器長鳴叫的時間
- #define const_DigTime_level 240 //小數(shù)點(diǎn)計時上限值
- #define const_KeyTime_level 30 //按鍵去抖動延時的時間
- #define const_key_time_short3 30 //短按的按鍵去抖動延時的時間
- #define const_key_time_long3 1024 //長按的按鍵去抖動延時的時間
- #define const_time_0_25s 111 //0.25秒鐘的時間需要的定時中斷次數(shù)
- #define const_time_1s 444 //1秒鐘的時間需要的定時中斷次數(shù)
- #define const_ds1302_0_5s 200 //大概0.5秒的時間
- #define const_ds1302_sampling_time 300 //累計主循環(huán)次數(shù)的時間,每次刷新采樣時鐘芯片的時間
- #define WRITE_SECOND 0x80 //DS1302內(nèi)部的相關(guān)地址
- #define WRITE_MINUTE 0x82
- #define WRITE_HOUR 0x84
- #define WRITE_DATE 0x86
- #define WRITE_MONTH 0x88
- #define WRITE_YEAR 0x8C
- #define WRITE_CHECK 0xC2 //用來檢查芯片的備用電池是否用完了的地址
- #define READ_CHECK 0xC3 //用來檢查芯片的備用電池是否用完了的地址
- #define READ_SECOND 0x81
- #define READ_MINUTE 0x83
- #define READ_HOUR 0x85
- #define READ_DATE 0x87
- #define READ_MONTH 0x89
- #define READ_YEAR 0x8D
- #define WRITE_PROTECT 0x8E
- #define WRITE_SET_HOUR 0xC4 //用來檢查芯片的備用電池是否用完了的地址
- #define READ_SET_HOUR 0xC5 //用來檢查芯片的備用電池是否用完了的地址
- #define WRITE_SET_MINUTE 0xC6 //用來檢查芯片的備用電池是否用完了的地址
- #define READ_SET_MINUTE 0xC7 //用來檢查芯片的備用電池是否用完了的地址
- sbit SCLK_dr =P1^0;
- sbit DIO_dr_sr =P1^1;
- sbit DS1302_CE_dr =P1^2;
- sbit dig1_dr = P2^0; //第一位數(shù)碼管位選輸出
- sbit dig2_dr = P2^1; //第二位數(shù)碼管位選輸出
- sbit dig3_dr = P2^2; //第三位數(shù)碼管位選輸出
- sbit dig4_dr = P2^3; //第四位數(shù)碼管位選輸出
- sbit digital_dp_dr = P2^4; //小數(shù)點(diǎn)輸出
- sbit beep_dr = P2^5; //蜂鳴器輸出
- sbit Key_sr1 = P3^7; //確認(rèn)/選擇鍵
- sbit Key_sr2 = P3^6; //上選擇鍵 Down
- sbit Key_sr3 = P3^5; //下選擇鍵 UP
- sbit relay_dr = P1^5; //繼電器輸出
- sbit Key_sr4 = P1^3; //開機(jī)按鍵
- sbit adc0832_CS_dr = P1^4; //adc0832的使能端口
- sbit adc0832_DI_sr_dr = P1^6; //adc0832的數(shù)據(jù)端口
- sbit adc0832_CLK_dr = P1^7; //adc0832的時鐘端口
- unsigned char ucShortTouchFlag3 = 0; //短按的自鎖標(biāo)志、
- unsigned char ucShortTouchFlag4 = 0; //短按的自鎖標(biāo)志
- unsigned char ucDigStep = 1; //步驟變量
- unsigned int uiDigTimeCnt = 0; //小數(shù)點(diǎn)延時計數(shù)器
- unsigned char ucDigTimeLock = 0;//原子鎖
- unsigned int uiVoiceCnt = 0; //蜂鳴器計數(shù)器
- unsigned int uiDigTemp1 = 0; //第一位數(shù)碼管顯示內(nèi)容
- unsigned int uiDigTemp2 = 0; //第二位數(shù)碼管顯示內(nèi)容
- unsigned int uiDigTemp3 = 0; //第三位數(shù)碼管顯示內(nèi)容
- unsigned int uiDigTemp4 = 0; //第四位數(shù)碼管顯示內(nèi)容
- unsigned int uiDigTemp = 0; //計數(shù)的變量
- unsigned int uiKeyTimeCnt1 = 0; //按鍵去抖動延時計數(shù)器
- unsigned char ucKeyLock1 = 0; //按鍵觸發(fā)后自鎖的變量標(biāo)志
- unsigned char ucKeySec = 0; //被觸發(fā)的按鍵編號
- unsigned int uiKeyTimeCnt2 = 0; //按鍵去抖動延時計數(shù)器
- unsigned char ucKeyLock2 = 0; //按鍵觸發(fā)后自鎖的變量標(biāo)志
- unsigned int uiKeyTimeCnt3 = 0; //按鍵去抖動延時計數(shù)器
- unsigned char ucKeyLock3 = 0; //按鍵觸發(fā)后自鎖的變量標(biāo)志
- unsigned int uiKeyTimeCnt4 = 0; //按鍵去抖動延時計數(shù)器
- unsigned char ucKeyLock4 = 0; //按鍵觸發(fā)后自鎖的變量標(biāo)志
- unsigned char ucKeyStartFlag1=0; //啟動定時中斷計數(shù)的開關(guān)
- unsigned char ucKeyStartFlag2=0; //啟動定時中斷計數(shù)的開關(guān)
- unsigned char ucKeyStartFlag3=0; //啟動定時中斷計數(shù)的開關(guān)
- unsigned char ucKeyStartFlag4=0; //啟動定時中斷計數(shù)的開關(guān)
- unsigned int uiKeyCtntyCnt1 = 0; //連續(xù)觸發(fā)延時計數(shù)器累加
- unsigned int uiKeyCtntyCnt2 = 0;
- /*****************************************************************************************/
- unsigned char ucVoiceLock=0; //蜂鳴器鳴叫的原子鎖
- unsigned char ucDigShowTemp=0; //臨時中間變量
- unsigned char ucWd=6; //本程序的核心變量,窗口顯示變量。類似于一級菜單的變量。代表顯示不同的窗口。
- unsigned char ucPart=0;//本程序的核心變量,局部顯示變量。類似于二級菜單的變量。代表顯示不同的局部。
- unsigned char ucWd1Update=0; //窗口1更新顯示標(biāo)志
- unsigned char ucWd2Update=1; //窗口2更新顯示標(biāo)志
- unsigned char ucWd3Update=1; //窗口3更新顯示標(biāo)志
- unsigned char ucWd4Update=1; //窗口4更新顯示標(biāo)志
- unsigned char ucWd5Update=1; //窗口5更新顯示標(biāo)志
- unsigned char ucWd1Part1Update=0; //在窗口1中,局部1的更新顯示標(biāo)志
- unsigned char ucWd1Part2Update=0; //在窗口1中,局部2的更新顯示標(biāo)志
- unsigned char ucWd2Part1Update=0; //在窗口2中,局部1的更新顯示標(biāo)志
- unsigned char ucWd2Part2Update=0; //在窗口2中,局部2的更新顯示標(biāo)志
- unsigned char ucWd3Part1Update=0; //在窗口3中,局部1的更新顯示標(biāo)志
- unsigned char ucWd3Part2Update=0; //在窗口3中,局部2的更新顯示標(biāo)志
- unsigned char ucWd4Part1Update = 0; //在窗口4中,局部1的更新顯示標(biāo)志
- unsigned char ucWd4Part2Update = 0; //在窗口4中,局部2的更新顯示標(biāo)志
- unsigned char ucWd5Part1Update = 0; //在窗口5中,局部1的更新顯示標(biāo)志
- unsigned char ucDelayTimerLock=0; //原子鎖
- //unsigned int uiDelayTimer=0;
- unsigned char ucCheckDs1302=0; //檢查Ds1302芯片是否正常
- unsigned char ucDs1302Error=0; //Ds1302芯片的備用電池是否用完了的報警標(biāo)志
- unsigned char ucDs1302Lock=0;//原子鎖
- unsigned int uiDs1302Cnt=0; //間歇性蜂鳴器報警的計時器
- unsigned char ucDpyTimeLock=0; //原子鎖
- unsigned int uiDpyTimeCnt=0; //數(shù)碼管的閃爍計時器,放在定時中斷里不斷累加
- unsigned char ucAutoDisplayDateLock1 = 0; //原子鎖
- unsigned char ucAutoDisplayDateLock2 = 0; //原子鎖
- unsigned char ucHour=0;
- unsigned char ucMinute=0;
- unsigned char ucSecond=0;
- unsigned char ucHourBCD=0;
- unsigned char ucMinuteBCD=0;
- unsigned char ucSecondBCD=0;
- unsigned char ucSetTimedataCnt1;
- unsigned char ucSetTimedataCnt2;
- unsigned char ucSetTimeCnt1BCD;
- unsigned char ucSetTimeCnt2BCD;
- unsigned char ucTemp1=0; //中間過渡變量
- unsigned char ucTemp2=0; //中間過渡變量
- unsigned char ucTemp3=0; //中間過渡變量
- unsigned char ucTemp4=0; //中間過渡變量
- unsigned char ucSetTimeCnt1 = 12; //設(shè)定時間變量
- unsigned char ucSetTimeCnt2 = 30;
- unsigned char ucSetTepCnt1 = 50; //設(shè)置溫度計數(shù)器
- unsigned char ucDigShow4; //第4位數(shù)碼管要顯示的內(nèi)容
- unsigned char ucDigShow3; //第3位數(shù)碼管要顯示的內(nèi)容
- unsigned char ucDigShow2; //第2位數(shù)碼管要顯示的內(nèi)容
- unsigned char ucDigShow1; //第1位數(shù)碼管要顯示的內(nèi)容
- unsigned int uiSampingCnt=0; //采集Ds1302的計時器,每秒鐘更新采集一次
- unsigned char ucStartheat = 0; //啟動加熱標(biāo)志位
- unsigned char ucAlarmPrompt = 0;//加熱完畢報警提示標(biāo)志位
- unsigned char ucAD_value_Tem = 0;//AD轉(zhuǎn)換過后的溫度數(shù)據(jù)
- unsigned char ucADC_value = 0;//AD數(shù)據(jù)
- unsigned char ucADC_sampling_number = 1; //開啟ADC采樣的標(biāo)志位
- unsigned char ucADC_samplingCnt = 0; //ADC采樣次數(shù)變量
- unsigned char KeyChangeTimeFlag;
- unsigned char ucBootScreen = 0; //開機(jī)標(biāo)志位
- /************************************************************************************************/
- void ds1302_alarm_service(void); //ds1302出錯報警
- void ds1302_sampling(void); //ds1302采樣程序,內(nèi)部每秒鐘采集更新一次
- void Write1302 ( unsigned char addr, unsigned char dat );//修改時間的驅(qū)動
- void display_service(void); //顯示的窗口菜單服務(wù)程序
- void delay_short(unsigned int uiDelayShort);
- void delay_long(unsigned int uiDelayLong);
- unsigned char Read1302 ( unsigned char addr );//讀取時間的驅(qū)動
- unsigned char bcd_to_number(unsigned char ucBcdTemp); //BCD轉(zhuǎn)原始數(shù)值
- unsigned char number_to_bcd(unsigned char ucNumberTemp); //原始數(shù)值轉(zhuǎn)BCD
- void initial_myself(void); //第一區(qū) 初始化單片機(jī)
- void delay(unsigned int delay_ms);
- void display();
- void T0_time();
- void key_scan();
- void key_service();
- void T0_init();
- void TimeData_contrast();
- void ucAlarmPrompt_service();
- void ADC_sampling_service();
-
- unsigned char array[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc6,0x86,
- 0xc6,0xf6,0xf6,0xf0};
- const unsigned int code wendu_tab[106]=
- {
- 3274,3111,2957,2812,2674,2545,2422,2306,2196,2092, //0~9
- 1993,1900,1811,1728,1648,1573,1501,1433,1369,1308, //10~19
- 1250,1194,1142,1092,1045,1000,957,916,877,840, //20~29
- 805,771,739,709,679,652,625,600,576,553, //30~39
- 531,510,490,471,453,435,418,402,387,372, //40~49
- 358,345,332,320,308,297,286,276,266,256, //50~59
- 247,238,230,222,214,207,199,193,186,180, //60~69
- 174,168,162,157,152,147,142,137,133,128, //70~79
- 124,120,116,113,109,106,102,99,96,93, //80~89
- 90,88,85,82,80,78,75,73,71,69, //90~99
- 67,65,63,61,59,58 //100~105
- };
- /********************************************************************************************
- 函數(shù)名稱:主程序
- 功 能:程序執(zhí)行的入口
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- void main()
- {
- T0_init();
- initial_myself();
- while(1)
- {
- ds1302_alarm_service(); //ds1302出錯報警
- ucAlarmPrompt_service();
- display_service(); //顯示的窗口菜單服務(wù)程序
- ds1302_sampling(); //ds1302采樣程序,內(nèi)部每秒鐘采集更新一次
- key_service(); //按鍵服務(wù)函數(shù)放在主程序里
- TimeData_contrast();
- if(ucADC_sampling_number == 1)
- {
- ucADC_samplingCnt++;
- if(ucADC_samplingCnt==10)
- {
- ucADC_sampling_number = 0;
- ucADC_samplingCnt = 0;
- ADC_sampling_service();
- ucADC_sampling_number = 1;
- }
- }
- if(ucDigTimeLock == 0 && ucPart == 0) //開始計數(shù)器標(biāo)志
- {
- uiDigTimeCnt++; //計數(shù)器開始計數(shù)
- }
- else
- {
- digital_dp_dr = 1; //關(guān)閉小數(shù)點(diǎn)顯示
- }
-
- if(uiDigTimeCnt >= const_DigTime_level) //計數(shù)時間到
- {
- ucDigTimeLock = 1; //計數(shù)器標(biāo)志位置1
- uiDigTimeCnt = 0; //計數(shù)器清零
- digital_dp_dr = ~digital_dp_dr; //小數(shù)點(diǎn)輸出
- ucDigTimeLock = 0; //計數(shù)器標(biāo)志位清零,開始計數(shù)。
- }
-
- /********************************************************************************************
- 功 能:數(shù)碼管閃爍計數(shù)器在外部可以關(guān)閉,不開啟計時功能
- 時 間:2014-11-11
- **************************************************************************************************/
- if(ucDpyTimeLock==0) //原子鎖判斷
- {
- uiDpyTimeCnt++; //數(shù)碼管的閃爍計時器
- }
- }
- }
- /********************************************************************************************
- 函數(shù)名稱:按鍵掃描
- 功 能:
- 1、按下Key_sr1,加1,如果安下一直不松,就連續(xù)加。
- 2、按下Key_sr2,加減1,如果安下一直不松,就連續(xù)減。
- 3、按下Key_sr3,單擊單步觸發(fā),和長按觸發(fā)
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:按鍵運(yùn)用了,單擊,長按,連續(xù)觸發(fā)的方法。
- **************************************************************************************************/
- void key_scan()
- {
- static unsigned char KeyChangeTimeFlag3;
- if(Key_sr1 == 1) //1號鍵
- {
- ucKeyStartFlag1 = 0; //啟動定時中斷計數(shù)的開關(guān)清零
- uiKeyTimeCnt1 = 0; //按鍵去抖動延時計數(shù)器清零
- ucKeyLock1 = 0; //按鍵觸發(fā)后自鎖的變量標(biāo)志清零
-
- }
- else if(ucKeyLock1 == 0)
- {
- ucKeyStartFlag1 = 1; //開啟計數(shù)器開關(guān),開始計數(shù)
- if(uiKeyTimeCnt1>=const_KeyTime_level)
- {
- ucKeyStartFlag1 = 0; //開啟計數(shù)器關(guān)閉,停止計數(shù)
- ucKeyLock1 = 1; //自鎖按鍵置位,避免一直觸發(fā)
- uiKeyTimeCnt1 = 0; //按鍵去抖動延時計數(shù)器清零
- ucKeySec = 1; //觸發(fā)1號鍵
- }
- }
- else if(uiKeyTimeCnt1<const_time_1s)
- {
- uiKeyTimeCnt1++;
- }
- else
- {
- uiKeyCtntyCnt1++; //連續(xù)觸發(fā)延時計數(shù)器累加
- if(uiKeyCtntyCnt1>const_time_0_25s)
- {
- uiKeyCtntyCnt1 = 0;
- ucKeySec = 1; //觸發(fā)1號鍵
- }
- }
- if(Key_sr2 == 1) //2號鍵
- {
- ucKeyStartFlag2 = 0; //啟動定時中斷計數(shù)的開關(guān)清零
- uiKeyTimeCnt2 = 0; //按鍵去抖動延時計數(shù)器清零
- ucKeyLock2 = 0; //按鍵觸發(fā)后自鎖的變量標(biāo)志清零
- }
- else if(ucKeyLock2 == 0)
- {
- ucKeyStartFlag2 = 1; //開啟計數(shù)器開關(guān),開始計數(shù)
- if(uiKeyTimeCnt2>=const_KeyTime_level)
- {
- ucKeyStartFlag2 = 0; //開啟計數(shù)器關(guān)閉,停止計數(shù)
- ucKeyLock2 = 1; //自鎖按鍵置位,避免一直觸發(fā)
- uiKeyTimeCnt2 = 0; //按鍵去抖動延時計數(shù)器清零
- ucKeySec = 2; //觸發(fā)2號鍵
- }
- }
- else if(uiKeyTimeCnt2<const_time_1s)
- {
- uiKeyTimeCnt2++;
- }
- else
- {
- uiKeyCtntyCnt2++; //連續(xù)觸發(fā)延時計數(shù)器累加
- if(uiKeyCtntyCnt2>const_time_0_25s)
- {
- uiKeyCtntyCnt2 = 0;
- ucKeySec = 2; //觸發(fā)1號鍵
- }
- }
-
- if(Key_sr3 == 1) //3,4號鍵
- {
- ucKeyStartFlag3 = 0; //啟動定時中斷計數(shù)的開關(guān)清零
- uiKeyTimeCnt3 = 0; //按鍵去抖動延時計數(shù)器清零
- ucKeyLock3 = 0; //按鍵觸發(fā)后自鎖的變量標(biāo)志清零
- ucShortTouchFlag3 = 0; //短按的自鎖標(biāo)志清零
- KeyChangeTimeFlag3 = 0;
- }
- else if(ucKeyLock3 == 0)
- {
- ucKeyStartFlag3 = 1; //開啟計數(shù)器開關(guān),開始計數(shù)
- if(ucShortTouchFlag3 == 0)
- {
- if(uiKeyTimeCnt3>=const_key_time_short3) //短按中間間隔的時間
- {
- ucShortTouchFlag3 = 1;
- ucKeySec = 3; //觸發(fā)3號鍵
- }
- }
- if(uiKeyTimeCnt3>=const_key_time_long3&&KeyChangeTimeFlag3 == 0)
- {
- KeyChangeTimeFlag3 = 1;
- ucKeySec = 17; //觸發(fā)17號鍵
- }
- if(uiKeyTimeCnt3>=const_key_time_long3+const_key_time_long3)
- {
- ucKeyStartFlag3 = 0; //開啟計數(shù)器關(guān)閉,停止計數(shù)
- ucKeyLock3 = 1; //自鎖按鍵置位,避免一直觸發(fā)
- uiKeyTimeCnt3 = 0; //按鍵去抖動延時計數(shù)器清零
- ucKeySec = 18; //觸發(fā)17號鍵
- }
- }
- if(Key_sr4 == 1) //1號鍵
- {
- ucKeyStartFlag4 = 0; //啟動定時中斷計數(shù)的開關(guān)清零
- uiKeyTimeCnt4 = 0; //按鍵去抖動延時計數(shù)器清零
- ucKeyLock4 = 0; //按鍵觸發(fā)后自鎖的變量標(biāo)志清零
- ucShortTouchFlag4 = 0; ///短按的自鎖標(biāo)志清零
-
- }
- else if(ucKeyLock4 == 0)
- {
- ucKeyStartFlag4 = 1; //開啟計數(shù)器開關(guān),開始計數(shù)
- if(ucShortTouchFlag4 == 0)
- {
- if(uiKeyTimeCnt4>=const_KeyTime_level)
- {
- ucShortTouchFlag4 = 1;
- ucKeySec = 4; //觸發(fā)4號鍵
- }
-
- }
- if(uiKeyTimeCnt4>=const_key_time_long3)
- {
- ucKeyStartFlag4 = 0; //開啟計數(shù)器關(guān)閉,停止計數(shù)
- ucKeyLock4 = 1; //自鎖按鍵置位,避免一直觸發(fā)
- uiKeyTimeCnt4 = 0; //按鍵去抖動延時計數(shù)器清零
- ucKeySec = 5; //觸發(fā)5號鍵
- }
- }
- }
- /********************************************************************************************
- 函數(shù)名稱:顯示的窗口菜單服務(wù)程序
- 功 能:更新顯示內(nèi)容
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- void display_service(void) //顯示的窗口菜單服務(wù)程序
- {
- switch(ucWd) //本程序的核心變量,窗口顯示變量。類似于一級菜單的變量。代表顯示不同的窗口。
- {
- case 1: //顯示時間窗口的數(shù)據(jù) 數(shù)據(jù)格式 SS FF MM 時 分 秒
- if(ucWd1Update==1) //窗口1要全部更新顯示
- {
- ucWd1Update=0; //及時清零標(biāo)志,避免一直進(jìn)來掃描
- ucWd1Part1Update=1; //局部時更新顯示
- ucWd1Part2Update=1; //局部分更新顯示
- }
-
- if(ucWd1Part1Update==1)//局部時更新顯示
- {
- ucWd1Part1Update=0;
- ucTemp1=ucHour/10; //時
- ucTemp2=ucHour%10;
- ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow2=ucTemp2;
- }
-
- if(ucWd1Part2Update==1)//局部分更新顯示
- {
- ucWd1Part2Update=0;
- ucTemp3=ucMinute/10; //分
- ucTemp4=ucMinute%10;
- ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow4=ucTemp4;
- }
-
- //數(shù)碼管閃爍
- switch(ucPart) //相當(dāng)于二級菜單,根據(jù)局部變量的值,使對應(yīng)的參數(shù)產(chǎn)生閃爍的動態(tài)效果。
- {
- case 0: //都不閃爍
- break;
- case 1: //時參數(shù)閃爍
- if(uiDpyTimeCnt==const_dpy_time_half)
- {
- ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow2=ucTemp2;
- }
- else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
- {
- ucDpyTimeLock=1; //原子鎖加鎖
- uiDpyTimeCnt=0; //及時把閃爍記時器清零
- ucDpyTimeLock=0; //原子鎖解鎖
- ucDigShow1=10; //數(shù)碼管顯示空,什么都不顯示
- ucDigShow2=10;
- }
- break;
-
- case 2: //分參數(shù)閃爍
- if(uiDpyTimeCnt==const_dpy_time_half)
- {
- ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容,顯示前兩位,
- ucDigShow2=ucTemp2; //目的是上面閃爍后,數(shù)碼管顯示內(nèi)容會清零
- ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow4=ucTemp4;
- }
- else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
- {
- ucDpyTimeLock=1; //原子鎖加鎖
- uiDpyTimeCnt=0; //及時把閃爍記時器清零
- ucDpyTimeLock=0; //原子鎖解鎖
- ucDigShow3=10; //數(shù)碼管顯示空,什么都不顯示
- ucDigShow4=10;
- }
- break;
- }
- break;
- case 2:
- if(ucWd2Update==1) //窗口1要全部更新顯示
- {
- ucWd2Update=0; //及時清零標(biāo)志,避免一直進(jìn)來掃描
- ucWd2Part1Update=1; //局部時更新顯示
- ucWd2Part2Update=1; //局部分更新顯示
- }
- if(ucWd2Part1Update == 1)
- {
- ucWd2Part1Update = 0;
- ucTemp1=ucSetTimeCnt1/10; //時
- ucTemp2=ucSetTimeCnt1%10;
- ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow2=ucTemp2;
- }
- if(ucWd2Part2Update == 1)
- {
- ucWd2Part2Update = 0;
- ucTemp3=ucSetTimeCnt2/10; //時
- ucTemp4=ucSetTimeCnt2%10;
- ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow4=ucTemp4;
- }
- switch(ucPart) //相當(dāng)于二級菜單,根據(jù)局部變量的值,使對應(yīng)的參數(shù)產(chǎn)生閃爍的動態(tài)效果。
- {
- case 0: //都不閃爍
- break;
- case 1: //時參數(shù)閃爍
- if(uiDpyTimeCnt==const_dpy_time_half)
- {
- ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow2=ucTemp2;
- }
- else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
- {
- ucDpyTimeLock=1; //原子鎖加鎖
- uiDpyTimeCnt=0; //及時把閃爍記時器清零
- ucDpyTimeLock=0; //原子鎖解鎖
- ucDigShow1=10; //數(shù)碼管顯示空,什么都不顯示
- ucDigShow2=10;
- }
- break;
-
- case 2: //分參數(shù)閃爍
- if(uiDpyTimeCnt==const_dpy_time_half)
- {
- ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容,這里是為了顯示前兩位
- ucDigShow2=ucTemp2; //目的是上面閃爍后,數(shù)碼管顯示內(nèi)容會清零
- ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow4=ucTemp4;
- }
- else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
- {
- ucDpyTimeLock=1; //原子鎖加鎖
- uiDpyTimeCnt=0; //及時把閃爍記時器清零
- ucDpyTimeLock=0; //原子鎖解鎖
- ucDigShow3=10; //數(shù)碼管顯示空,什么都不顯示
- ucDigShow4=10;
- }
- break;
- }
- break;
- case 3:
- if(ucWd3Update==1) //窗口3要全部更新顯示
- {
- ucWd3Update=0; //及時清零標(biāo)志,避免一直進(jìn)來掃描
- ucWd3Part1Update=1; //局部時更新顯示
- ucWd3Part2Update=1; //局部分更新顯示
- }
-
- if(ucWd3Part1Update == 1)
- {
- ucWd3Part1Update = 0;
- if(ucSetTepCnt1>=100)
- {
- ucTemp1 = ucSetTepCnt1/100;
- ucTemp2 = ucSetTepCnt1/10%10;
- ucTemp3 = ucSetTepCnt1%10;
- }
- else
- {
- ucTemp1 = ucSetTepCnt1/10;
- ucTemp2 = ucSetTepCnt1%10;
- ucTemp3 = 10;
- }
- ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow2=ucTemp2; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
- }
- if(ucWd3Part2Update == 1)
- {
- ucWd3Part2Update = 0;
- ucDigShow4 = 11;
- }
- switch(ucPart)
- {
- case 0: break;
- case 1:
- if(uiDpyTimeCnt==const_dpy_time_half)
- {
- ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow2=ucTemp2;
- }
- else if(uiDpyTimeCnt>const_dpy_time_all) //const_dpy_time_all一定要比const_dpy_time_half 大
- {
- ucDpyTimeLock=1; //原子鎖加鎖
- uiDpyTimeCnt=0; //及時把閃爍記時器清零
- ucDpyTimeLock=0; //原子鎖解鎖
- ucDigShow1=10; //數(shù)碼管顯示空,什么都不顯示
- ucDigShow2=10;
-
- }
- break;
- }
- break;
- case 4:
- if(ucWd4Update==1) //窗口4要全部更新顯示
- {
- ucWd4Update=0; //及時清零標(biāo)志,避免一直進(jìn)來掃描
- ucWd4Part1Update=1; //局部時更新顯示
- ucWd4Part2Update=1; //局部分更新顯示
- }
-
- if(ucWd4Part1Update == 1)
- {
- ucWd4Part1Update = 0;
- if(ucAD_value_Tem>=100)
- {
- ucTemp1 = ucAD_value_Tem/100;
- ucTemp2 = ucAD_value_Tem/10%10;
- ucTemp3 = ucAD_value_Tem%10;
- }
- else
- {
- ucTemp1 = ucAD_value_Tem/10;
- ucTemp2 = ucAD_value_Tem%10;
- ucTemp3 = 10;
- }
- ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow2=ucTemp2; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
- }
- if(ucWd4Part2Update == 1)
- {
- ucWd4Part2Update = 0;
- ucDigShow4 = 11;
- }
- break;
- case 5:if(ucWd5Update==1) //窗口5要全部更新顯示
- {
- ucWd5Update=0; //及時清零標(biāo)志,避免一直進(jìn)來掃描
- ucWd5Part1Update=1; //局部時更新顯示
- }
-
- if(ucWd5Part1Update == 1)
- {
- // ucWd5Part1Update = 0;
-
- ucDigShow1=ucTemp1; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow2=ucTemp2; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow3=ucTemp3; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow4=ucTemp4; //數(shù)碼管顯示實(shí)際內(nèi)容
- }
- break;
- case 6:ucDigTimeLock = 1; //不顯示小數(shù)點(diǎn)
- ucDigShow1=13; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow2=14; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow3=15; //數(shù)碼管顯示實(shí)際內(nèi)容
- ucDigShow4=16; //數(shù)碼管顯示實(shí)際內(nèi)容
- break;
- }
- }
- /********************************************************************************************
- 函數(shù)名稱:按鍵服務(wù)程序
- 功 能:按鍵處理的事務(wù)
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- void key_service(void) //按鍵服務(wù)的應(yīng)用程序
- {
- switch(ucKeySec) //按鍵服務(wù)狀態(tài)切換
- {
- case 1:// 加按鍵
- switch(ucWd) //在不同的窗口下,設(shè)置不同的參數(shù)
- {
-
- case 1:switch(ucPart) //在不同的局部變量下,相當(dāng)于二級菜單
- {
- case 1: //時
- ucHour++;
-
- if(ucHour>23)
- {
- ucHour=23;
- }
- ucWd1Part1Update=1; //更新顯示
- break;
-
- case 2: //分
- ucMinute++;
- if(ucMinute>59)
- {
- ucMinute=59;
- }
- ucWd1Part2Update=1; //更新顯示
- break;
- }
- break;
- case 2:
- switch(ucPart)
- {
- case 1:
- ucSetTimeCnt1++;
- if(ucSetTimeCnt1>23)
- {
- ucSetTimeCnt1 = 23;
- }
- ucWd2Part1Update=1; //更新顯示
- break;
- case 2:
- ucSetTimeCnt2++;
- if(ucSetTimeCnt2>59)
- {
- ucSetTimeCnt2 = 59;
- }
- ucWd2Part2Update=1; //更新顯示
- break;
- }
- break;
- case 3:
- switch(ucPart)
- {
-
- case 1:
- ucSetTepCnt1++;
- if(ucSetTepCnt1>125)
- {
- ucSetTepCnt1 = 125;
- }
- ucWd3Part1Update = 1;
- break;
-
- }
- break;
- }
-
- ucVoiceLock=1; //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
- ucVoiceLock=0; //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- ucKeySec=0; //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
- break;
-
-
- case 2:// 減按鍵
- switch(ucWd) //在不同的窗口下,設(shè)置不同的參數(shù)
- {
- case 1:
- switch(ucPart) //在不同的局部變量下,相當(dāng)于二級菜單
- {
- case 1: //時
- ucHour--;
- if(ucHour>23)
- {
- ucHour=0;
- }
- ucWd1Part1Update=1; //更新顯示
- break;
-
- case 2: //分
- ucMinute--;
- if(ucMinute>59)
- {
- ucMinute=0;
- }
- ucWd1Part2Update=1; //更新顯示
- break;
- }
- break;
- case 2:
- switch(ucPart) //在不同的局部變量下,相當(dāng)于二級菜單
- {
- case 1: //時
- ucSetTimeCnt1--;
- if(ucSetTimeCnt1>23)
- {
- ucSetTimeCnt1=0;
- }
- ucWd2Part1Update=1; //更新顯示
- break;
-
- case 2: //分
- ucSetTimeCnt2--;
- if(ucSetTimeCnt2>59)
- {
- ucSetTimeCnt2=0;
- }
- ucWd2Part2Update=1; //更新顯示
- break;
- }
- break;
-
- case 3: switch(ucPart)
- {
-
- case 1:
- ucSetTepCnt1--;
- if(ucSetTepCnt1>125)
- {
- ucSetTepCnt1 = 0;
- }
- ucWd3Part1Update = 1;
- break;
-
- }
- break;
- }
-
- ucVoiceLock=1; //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
- ucVoiceLock=0; //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- ucKeySec=0; //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
- break;
-
- case 3://短按設(shè)置按鍵
- switch(ucWd) //在不同的窗口下,設(shè)置不同的參數(shù)
- {
-
- case 1:
- if(ucAlarmPrompt == 1) //此時報警啟動
- {
- ucAlarmPrompt = 0; //報警關(guān)閉
- }
- if(ucPart>0) //在窗口2的時候,要第一次激活設(shè)置時間,必須是長按3秒才可以,這里短按激活不了第一次
- {
- ucPart++;
- if(ucPart>2) //設(shè)置時間結(jié)束
- {
- ucPart=0;
- /* 注釋五:
- * 每個月份的天數(shù)最大值是不一樣的,在寫入ds1302時鐘芯片內(nèi)部數(shù)據(jù)前,應(yīng)該做一次調(diào)整。
- * 有的月份最大28天,有的月份最大29天,有的月份最大30天,有的月份最大31天,
- */
- ucHourBCD=number_to_bcd(ucHour); //原始數(shù)值轉(zhuǎn)BCD
- ucMinuteBCD=number_to_bcd(ucMinute); //原始數(shù)值轉(zhuǎn)BCD
- ucSecondBCD=number_to_bcd(ucSecond); //原始數(shù)值轉(zhuǎn)BCD
- Write1302 (WRITE_PROTECT,0X00); //禁止寫保護(hù)
- Write1302 (WRITE_HOUR,ucHourBCD); //小時修改
- Write1302 (WRITE_MINUTE,ucMinuteBCD); //分鐘修改
- Write1302 (WRITE_SECOND,ucSecondBCD); //秒位修改
- Write1302 (WRITE_PROTECT,0x80); //允許寫保護(hù)
- }
- ucWd1Update=1; //窗口1更新顯示
- }
- break;
- case 2:
- if(ucPart>0)
- {
- ucPart++;
- if(ucPart>2)
- {
- ucPart = 1;
- ucWd=3; //切換到第三個窗口,設(shè)置預(yù)定時
- ucWd3Update=1; //窗口3更新顯示
- }
- }
- break;
- case 3:
- if(ucPart>0)
- {
- ucPart++;
- if(ucPart>1)
- {
- ucPart = 0;
- ucWd = 4; //切換到第四個窗口,
- ucPart = 1;
- ucDigTimeLock = 1; //小數(shù)點(diǎn)不顯示
- }
- }
- break;
- case 4:
- if(ucPart>0)
- {
- ucPart++;
- if(ucPart>1)
- {
- ucPart = 0;
- ucWd = 1;
- ucWd1Update = 1;
- ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)
- ucStartheat = 1;//啟動加熱
- }
- }
- break;
- }
-
- ucVoiceLock=1; //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- uiVoiceCnt=const_voice_short; //按鍵聲音觸發(fā),滴一聲就停。
- ucVoiceLock=0; //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- ucKeySec=0; //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
- break;
-
- case 4:
- if(ucBootScreen == 0) //開機(jī)
- {
- ucWd=1;
- ucWd1Update=1; //窗口1更新顯示
- ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)
- ucBootScreen = 1; //開關(guān)標(biāo)志位置1,為關(guān)機(jī)做準(zhǔn)備
- }
- // if(ucBootScreen == 1)//關(guān)機(jī)
- // {
- // ucWd=6;
- // ucBootScreen = 0; //開關(guān)標(biāo)志位清零,為開機(jī)做準(zhǔn)備
- // ucStartheat = 0; //停止加熱
- // ucSetTimeCnt1 = 12; //復(fù)位默認(rèn)設(shè)的小時
- // ucSetTimeCnt2 = 30; //復(fù)位默認(rèn)設(shè)的分鐘
- // ucSetTepCnt1 = 50; //復(fù)位默認(rèn)溫度值
- // ucPart = 0; //設(shè)置清零
- // }
- ucVoiceLock=1; //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- uiVoiceCnt=const_voice_long; //按鍵聲音觸發(fā),滴一聲就停。
- ucVoiceLock=0; //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- ucKeySec=0; //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
- break;
- case 5:
- if(ucBootScreen == 1)//關(guān)機(jī)
- {
- ucWd=6;
- ucBootScreen = 0; //開關(guān)標(biāo)志位清零,為開機(jī)做準(zhǔn)備
- ucStartheat = 0; //停止加熱
- ucSetTimeCnt1 = 12; //復(fù)位默認(rèn)設(shè)的小時
- ucSetTimeCnt2 = 30; //復(fù)位默認(rèn)設(shè)的分鐘
- ucSetTepCnt1 = 50; //復(fù)位默認(rèn)溫度值
- ucPart = 0; //設(shè)置清零
- }
- ucVoiceLock=1; //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- uiVoiceCnt=const_voice_long; //按鍵聲音觸發(fā),滴一聲就停。
- ucVoiceLock=0; //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- ucKeySec=0; //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
- break;
- case 17://長按3秒設(shè)置按鍵
- switch(ucWd) //在不同的窗口下,設(shè)置不同的參數(shù)
- {
- case 1:
- if(ucPart==0) //處于非設(shè)置時間的狀態(tài)下,要第一次激活設(shè)置時間,必須是長按3秒才可以
- {
- ucWd=2;
- ucPart=1; //進(jìn)入到設(shè)置日期的狀態(tài)下
- ucWd2Update=1; //窗口1更新顯示
- }
- break;
- // case 4:
- // if(ucPart == 0)
- // {
- // ucWd=2;
- // ucPart=1; //進(jìn)入到設(shè)置時間的狀態(tài)下
- // ucWd2Update=1; //窗口2更新顯示
- // }
- // break;
- }
-
- ucVoiceLock=1; //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- uiVoiceCnt=const_voice_long; //按鍵聲音觸發(fā),滴一聲就停。
- ucVoiceLock=0; //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- ucKeySec=0; //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
- break;
-
- case 18:
- switch(ucWd)
- {
- case 0:break;
- case 2:
- ucPart = 0;
- if(ucPart == 0&& ucStartheat == 0) //處于非設(shè)置的情況下,長按設(shè)置系統(tǒng)時間
- {
- ucWd = 1;
- ucPart = 1;
- ucWd1Update = 1;
- }
- else if(ucPart == 0&&ucStartheat == 1)
- {
- //處于非設(shè)置的情況下,久長按退出定時恒溫?zé)崴?br />
- ucWd = 1;
- // ucPart = 1;
- ucWd1Update = 1;
- ucStartheat = 0; //停止加熱
- ucSetTimeCnt1 = 12; //復(fù)位默認(rèn)設(shè)的小時
- ucSetTimeCnt2 = 30; //復(fù)位默認(rèn)設(shè)的分鐘
- ucSetTepCnt1 = 50; //復(fù)位默認(rèn)溫度值
- ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)
- }
- break;
- }
- ucVoiceLock=1; //原子鎖加鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- uiVoiceCnt=const_voice_long; //按鍵聲音觸發(fā),滴一聲就停。
- ucVoiceLock=0; //原子鎖解鎖,保護(hù)主函數(shù)與中斷函數(shù)的共享變量uiVoiceCnt
- ucKeySec=0; //響應(yīng)按鍵服務(wù)處理程序后,按鍵編號清零,避免一致觸發(fā)
-
- break;
- }
- }
- /********************************************************************************************
- 函數(shù)名稱:DS1302采樣程序
- 功 能:讀取DS1302的數(shù)據(jù)
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:系統(tǒng)不用時時刻刻采集ds1302的內(nèi)部數(shù)據(jù),每隔一段時間更新采集一次就可以了。
- 這個間隔時間應(yīng)該小于或者等于1秒鐘的時間,否則在數(shù)碼管上看不到每秒鐘的時間變化。
- **************************************************************************************************/
- void ds1302_sampling(void) //ds1302采樣程序,內(nèi)部每秒鐘采集更新一次
- {
- if(ucPart==0) //當(dāng)系統(tǒng)不是處于設(shè)置日期和時間的情況下
- {
- ++uiSampingCnt; //累計主循環(huán)次數(shù)的時間
- if(uiSampingCnt>const_ds1302_sampling_time) //每隔一段時間就更新采集一次Ds1302數(shù)據(jù)
- {
- uiSampingCnt=0;
- ucHourBCD=Read1302(READ_HOUR); //讀取時
- ucMinuteBCD=Read1302(READ_MINUTE); //讀取分
- ucHour=bcd_to_number(ucHourBCD); //BCD轉(zhuǎn)原始數(shù)值
- ucMinute=bcd_to_number(ucMinuteBCD); //BCD轉(zhuǎn)原始數(shù)值
- ucWd1Update=1; //窗口1更新顯示時間
- }
- }
- }
- /********************************************************************************************
- 函數(shù)名稱:修改DS1302時間的驅(qū)動程序
- 功 能:讀取DS1302的數(shù)據(jù)
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:此處寫的是BCD碼
- **************************************************************************************************/
- void Write1302 ( unsigned char addr, unsigned char dat )
- {
-
- unsigned char i,temp;//單片機(jī)驅(qū)動DS1302屬于SPI通訊方式,根據(jù)我的經(jīng)驗(yàn),不用關(guān)閉中斷
- DS1302_CE_dr=0; //CE引腳為低,數(shù)據(jù)傳送中止
- delay_short(1);
- SCLK_dr=0; //清零時鐘總線
- delay_short(1);
- DS1302_CE_dr = 1; //CE引腳為高,邏輯控制有效
- delay_short(1);
- for ( i=0; i<8; i++ )//循環(huán)8次移位
- {
- DIO_dr_sr = 0;
- temp = addr;
- if(temp&0x01)
- {
- DIO_dr_sr =1;
- }
- else
- {
- DIO_dr_sr =0;
- }
- delay_short(1);
- addr >>= 1; //右移一位
- SCLK_dr = 1;
- delay_short(1);
- SCLK_dr = 0;
- delay_short(1);
- }
- //發(fā)送數(shù)據(jù)
- for ( i=0; i<8; i++ ) //循環(huán)8次移位
- {
- DIO_dr_sr = 0;
- temp = dat;
- if(temp&0x01)
- {
- DIO_dr_sr =1;
- }
- else
- {
- DIO_dr_sr =0;
- }
- delay_short(1);
- dat >>= 1; //右移一位
- SCLK_dr = 1;
- delay_short(1);
- SCLK_dr = 0;
- delay_short(1);
- }
- DS1302_CE_dr = 0;
- delay_short(1);
- }
- /********************************************************************************************
- 函數(shù)名稱:讀取DS1302時間的驅(qū)動程序
- 功 能:讀取DS1302的數(shù)據(jù)
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:此處讀的是BCD碼
- **************************************************************************************************/
- unsigned char Read1302 ( unsigned char addr )
- {
- unsigned char i,temp,dat1;
- DS1302_CE_dr=0; //單片機(jī)驅(qū)動DS1302屬于SPI通訊方式,根據(jù)我的經(jīng)驗(yàn),不用關(guān)閉中斷
- delay_short(1);
- SCLK_dr=0;
- delay_short(1);
- DS1302_CE_dr = 1;
- delay_short(1);
- for ( i=0; i<8; i++ ) //循環(huán)8次移位
- {
- DIO_dr_sr = 0;
- temp = addr;
- if(temp&0x01)
- {
- DIO_dr_sr =1;
- }
- else
- {
- DIO_dr_sr =0;
- }
- delay_short(1);
- addr >>= 1; //右移一位
- SCLK_dr = 1;
- delay_short(1);
- SCLK_dr = 0;
- delay_short(1);
- }
- /********************************************************************************************
- 注 釋:51單片機(jī)IO口的特點(diǎn),在讀取數(shù)據(jù)之前必須先輸出高電平,
- 如果是PIC,AVR等單片機(jī),這里應(yīng)該把IO方向寄存器設(shè)置為輸入
- 時 間:2014-11-11
- **************************************************************************************************/
- DIO_dr_sr =1; //51單片機(jī)IO口的特點(diǎn),在讀取數(shù)據(jù)之前必須先輸出高電平,
- temp=0;
- for ( i=0; i<8; i++ )
- {
- temp>>=1;
- if(DIO_dr_sr==1)
- {
- temp=temp+0x80;
- }
- DIO_dr_sr =1; //51單片機(jī)IO口的特點(diǎn),在讀取數(shù)據(jù)之前必須先輸出高電平
- delay_short(1);
- SCLK_dr = 1;
- delay_short(1);
- SCLK_dr = 0;
- delay_short(1);
- }
- DS1302_CE_dr=0;
- delay_short(1);
- dat1=temp;
- return (dat1);
- }
- /********************************************************************************************
- 函數(shù)名稱:BCD轉(zhuǎn)原始數(shù)值程序
- 功 能:
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- unsigned char bcd_to_number(unsigned char ucBcdTemp) //BCD轉(zhuǎn)原始數(shù)值
- {
- unsigned char ucNumberResult=0;
- unsigned char ucBcdTemp10;
- unsigned char ucBcdTemp1;
- ucBcdTemp10=ucBcdTemp;
- ucBcdTemp10=ucBcdTemp10>>4;
- ucBcdTemp1=ucBcdTemp;
- ucBcdTemp1=ucBcdTemp1&0x0f;
- ucNumberResult=ucBcdTemp10*10+ucBcdTemp1;
- return ucNumberResult;
- }
- /********************************************************************************************
- 函數(shù)名稱:原始數(shù)值轉(zhuǎn)換成BCD碼
- 功 能:
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- unsigned char number_to_bcd(unsigned char ucNumberTemp) //原始數(shù)值轉(zhuǎn)BCD
- {
- unsigned char ucBcdResult=0;
- unsigned char ucNumberTemp10;
- unsigned char ucNumberTemp1;
- ucNumberTemp10=ucNumberTemp;
- ucNumberTemp10=ucNumberTemp10/10;
- ucNumberTemp10=ucNumberTemp10<<4;
- ucNumberTemp10=ucNumberTemp10&0xf0;
- ucNumberTemp1=ucNumberTemp;
- ucNumberTemp1=ucNumberTemp1%10;
- ucBcdResult=ucNumberTemp10|ucNumberTemp1;
- return ucBcdResult;
- }
- /********************************************************************************************
- 函數(shù)名稱:DS1302備用電池電量用完報警程序
- 功 能:DS1302備用電池電量用完后,蜂鳴器在0.5S發(fā)也鳴叫
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- void ds1302_alarm_service(void) //ds1302出錯報警
- {
- if(ucDs1302Error==1) //備用電池的電量用完了報警提示
- {
- if(uiDs1302Cnt>const_ds1302_0_5s) //大概0.5秒鐘蜂鳴器響一次
- {
- ucDs1302Lock=1; //原子鎖加鎖
- uiDs1302Cnt=0; //計時器清零
- uiVoiceCnt=const_voice_short; //蜂鳴器聲音觸發(fā),滴一聲就停。
- ucDs1302Lock=0; //原子鎖解鎖
- }
- }
- }
- /********************************************************************************************
- 函數(shù)名稱:熱水完畢報警程序
- 功 能:熱水完畢后,發(fā)出報警聲
- 返 回 值:無
- 時 間:2014-11-14
- 備 注:
- **************************************************************************************************/
- void ucAlarmPrompt_service()
- {
- static unsigned int uiAlarmPromptCnt; //報警延時計數(shù)器
- static unsigned char ucNumberCnt; //報警次數(shù)計數(shù)器
- static unsigned int const_time_2s = 400; //報警的時間間隔
- static unsigned int const_voice_AlarmPrompt = 200;
- if(ucAlarmPrompt == 1) //報警標(biāo)志位置位后報警
- {
- uiAlarmPromptCnt++; //報警延時計數(shù)器自加1
- if(uiAlarmPromptCnt>const_time_2s) //2S發(fā)出報警聲音
- {
- uiAlarmPromptCnt = 0; //報警延時計數(shù)器清零
- uiVoiceCnt=const_voice_AlarmPrompt; //
- ucNumberCnt++; //報警次數(shù)計數(shù)器加1
-
- if(ucNumberCnt == 5) //報警次數(shù)為10次
- {
- ucNumberCnt = 0; //報警次數(shù)計數(shù)器清零
- ucAlarmPrompt = 0; //關(guān)閉報警
- }
- }
- }
- }
- /********************************************************************************************
- 函數(shù)名稱:數(shù)碼管顯示驅(qū)動程序
- 功 能:顯示對應(yīng)的時間
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- void display()
- {
- switch(ucDigStep) //步驟變量
- {
- case 1:
- P0 = array[ucDigShow1]; //第一位數(shù)碼管顯示的內(nèi)容
- dig1_dr = 0;
- delay(10);
- dig1_dr = 1;
- ucDigStep = 2;
- break;
- case 2:
- P0 = array[ucDigShow2]; //第二位數(shù)碼管顯示的內(nèi)容
- dig2_dr = 0;
- delay(10);
- dig2_dr = 1;
- ucDigStep = 3;
- break;
- case 3:
- P0 = array[ucDigShow3]; //第三位數(shù)碼管顯示的內(nèi)容
- dig3_dr = 0;
- delay(10);
- dig3_dr = 1;
- ucDigStep = 4;
- break;
- case 4:
- P0 = array[ucDigShow4]; //第四位數(shù)碼管顯示的內(nèi)容
- dig4_dr = 0;
- delay(10);
- dig4_dr = 1;
- ucDigStep =1;
- break;
- }
- }
- /********************************************************************************************
- 函數(shù)名稱:熱水時間和溫度數(shù)據(jù)對比
- 功 能:將設(shè)定的時間于當(dāng)前的時間作對比,數(shù)據(jù)正確執(zhí)行。
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- void TimeData_contrast()
- {
- static unsigned char preser_heat = 0; //保溫標(biāo)志位
- static unsigned char ucCheakFault = 0; //故障檢查標(biāo)志位
- static unsigned char ucTimeEqual = 0; //設(shè)定時間相等的標(biāo)志位
- static unsigned char ucTimeAfter = 0; //兩分鐘前的時間
- static unsigned char ucTepAfter = 0; //兩分鐘前的時間
- if(ucStartheat == 1&&ucPart == 0) //開始預(yù)設(shè)加熱標(biāo)志
- {
- if((ucHour == ucSetTimeCnt1) && (ucMinute == ucSetTimeCnt2)&&ucTimeEqual == 0) //設(shè)定的時間相等
- {
- // ucStartheat = 1;//啟動加熱標(biāo)志位
- ucWd = 4; //更新到窗口4,顯示溫度
- ucWd4Update = 1;
- ucDigTimeLock = 1; //小數(shù)點(diǎn)不顯示
- relay_dr = 1; //繼電器輸出高(吸合)
- ucCheakFault = 1;//故障檢查
- ucTimeEqual = 1;//時間對比完成
- ucTimeAfter = 0;//先對變量清零
- ucTepAfter = 0;//先對變量清零
- ucTimeAfter = ucMinute;
- ucTepAfter = ucAD_value_Tem;
- // ucAlarmPrompt = 1; //故障報警
- }
- if(ucCheakFault == 1&&(ucTimeAfter+3) == ucMinute)
- {
- if(ucAD_value_Tem>=(ucTepAfter+2))
- {
- ucCheakFault = 0; //故障檢測清零,只做一次檢測
- ucTimeEqual = 0;//時間對比完成標(biāo)志清零,為下一次做準(zhǔn)備
- }
- else
- {
- relay_dr = 0; //繼電器輸出(斷開)
- ucWd = 5; //更新到窗口5,顯示錯誤代碼E001
- ucWd5Update = 1;
- ucTemp1 = 12; //E
- ucTemp2 = 0; //0
- ucTemp3 = 0; //0
- ucTemp4 = 1; //1
- ucDigTimeLock = 1; //小數(shù)點(diǎn)不顯示
- ucAlarmPrompt = 1; //故障報警
- ucCheakFault = 0; //故障檢測清零,只做一次檢測
- ucStartheat = 0; //檢測到有故障,停止加熱
- }
-
- }
- if(ucAD_value_Tem>=ucSetTepCnt1) //設(shè)定到加熱溫度相等
- {
- ucStartheat = 0;//停止預(yù)設(shè)加熱標(biāo)志
- relay_dr = 0; //繼電器輸出(斷開)
- // ucCheakFault = 0;//故障檢查標(biāo)志清零,為下一次做準(zhǔn)備
- ucAlarmPrompt = 1; //報警標(biāo)志位置1,啟動報警
- preser_heat = 1; //執(zhí)行保溫標(biāo)志位,開始進(jìn)行保溫
- ucWd = 1; //切換到窗口1顯示時間
- ucWd1Update = 1;//更新窗口1
- ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)
- }
- }
-
- if(preser_heat == 1) //保溫程序,開始執(zhí)行
- {
- if((ucSetTepCnt1-5) >= ucAD_value_Tem)
- {
- relay_dr = 1; //繼電器輸出
- ucWd = 4; //切換到窗口4顯示時間
- ucWd4Update = 1;//更新窗口4
- ucDigTimeLock = 1; //不顯示小數(shù)點(diǎn)
- }
- if((ucSetTepCnt1+5) <= ucAD_value_Tem)
- {
- relay_dr = 0; //繼電器輸出
- ucWd = 1; //切換到窗口1顯示時間
- ucWd1Update = 1;//更新窗口1
- ucDigTimeLock = 0; //顯示小數(shù)點(diǎn)
- }
- }
- }
- /********************************************************************************************
- 函數(shù)名稱:ADC采樣程序
- 功 能:讀取ADC0832轉(zhuǎn)換后的數(shù)據(jù)
- 返 回 值:
- 時 間:2014-11-24
- 備 注:
- **************************************************************************************************/
- void ADC_sampling_service()
- {
- static unsigned char i = 0; //讀取數(shù)據(jù)8位的次數(shù)變量
- static unsigned char ucADC; //AD值
- static unsigned char ucCheckADC; //校驗(yàn)的AD值
- static unsigned int ucTemp; //參與換算的中間變量
- static unsigned int uiTempFilterV=0; //參與換算的中間變量
- // static unsigned long ulBackupFilterV=255; //備份最新采樣數(shù)據(jù)的中間變量
- // static unsigned int uiTimpFilterTep = 0;
- static unsigned char wendu;
- static unsigned int Adresult;
- static unsigned char ucSamplingCnt=0; //統(tǒng)計采樣的次數(shù) 本程序采樣8次后求平均值
- adc0832_CS_dr = 0; //使能端置低
- adc0832_DI_sr_dr = 1; //起始位
- adc0832_CLK_dr = 0; //輸出低電平
- delay_short(1); //小延時
- adc0832_CLK_dr = 1; //輸出高電平
- adc0832_DI_sr_dr = 1; //選擇通道,輸出數(shù)據(jù)1
- adc0832_CLK_dr = 0;
- adc0832_CLK_dr = 1;
- adc0832_DI_sr_dr = 0; //選擇通道。輸出數(shù)據(jù)0
- adc0832_CLK_dr = 0;
- adc0832_CLK_dr = 1;
- adc0832_DI_sr_dr = 1; //拉高數(shù)據(jù)線
- delay_short(2); //延時
- adc0832_CLK_dr = 1; //一個下降延
- adc0832_CLK_dr = 0;
- delay_short(1);
- for(i = 0;i<8;i++) //讀取8位
- {
- ucADC <<= 1;
- adc0832_CLK_dr = 1;
- adc0832_CLK_dr = 0;
- if(adc0832_DI_sr_dr == 1)
- {
- ucADC |= 0x01;
- }
- }
- for(i=0;i<8;i++) //讀取校驗(yàn)位
- {
- ucCheckADC >>= 1;
- if(adc0832_DI_sr_dr == 1)
- {
- ucCheckADC |= 0x80;
- }
- adc0832_CLK_dr = 1;
- adc0832_CLK_dr = 0;
- }
-
- adc0832_CS_dr = 1; //拉高使能端
- if(ucADC == ucCheckADC) //校驗(yàn)兩個讀取的數(shù)據(jù)是否一致
- {
- ucTemp=ucADC; //把char類型數(shù)據(jù)賦值給long類型數(shù)據(jù),參與乘除法運(yùn)算的數(shù)據(jù),為了避免運(yùn)算結(jié)果溢出,我都用long類型
- uiTempFilterV=uiTempFilterV+ucTemp; //累加8次后求平均值
- ucSamplingCnt++; //統(tǒng)計已經(jīng)采樣累計的次數(shù)
- if(ucSamplingCnt>=8)
- {
- /* 注釋二:
- * 求平均值濾波法,為了得到的數(shù)據(jù)更加圓滑,去除小毛刺。
- * 向右邊移動3位相當(dāng)于除以8。
- */
- // uiTempFilterV=uiTempFilterV>>3; //求平均值濾波法
- Adresult=(255000/uiTempFilterV)-100;//求得當(dāng)前溫度對應(yīng)的阻值,十歐為單位,此公式的演變請看上述詳細(xì)說明
- // if(ulBackupFilterV>=20) //最近備份的上一次數(shù)據(jù)大于等于0.02V的情況下
- // {
- // if(Adresult<(ulBackupFilterV-5)||Adresult>(ulBackupFilterV+5)) //在正負(fù)0.020V偏差范圍外,更新
- // {
- // ulBackupFilterV=Adresult; //備份最新采樣的數(shù)據(jù),方便下一次對比判斷
- // uiTimpFilterTep=Adresult; //得到經(jīng)過濾波處理的實(shí)時電壓值
- //// ucWd4Part1Update=1; //局部更新顯示經(jīng)過濾波處理的電壓
- // }
- // }
- // else //最近備份的上一次數(shù)據(jù)小于0.02V的情況下
- // {
- // if(uiTempFilterV>(ulBackupFilterV+2)) //在正0.020V偏差范圍外,更新
- // {
- // ulBackupFilterV=Adresult; //備份最新采樣的數(shù)據(jù),方便下一次對比判斷
- // uiTimpFilterTep=Adresult; //得到經(jīng)過濾波處理的實(shí)時電壓值
- //// ucWd4Part1Update=1; //局部更新顯示經(jīng)過濾波處理的電壓
- // }
- //
- // }
- wendu = 0;//清零
- while(1)
- {
- if(Adresult>=wendu_tab[wendu])
- {
- break;
- }
- wendu++;
- if(wendu>=105)
- {
- wendu = 105;
- break;
- }
-
- }
- ucAD_value_Tem = wendu;
- ucSamplingCnt=0; //清零,為下一輪采樣濾波作準(zhǔn)備。
- uiTempFilterV=0;
- }
-
- }
- else
- {
- ucADC = 0; //兩次讀取的數(shù)據(jù)不一致,就把數(shù)據(jù)清零
- ucAD_value_Tem = wendu;
- }
- ucWd4Update = 1;//更新窗口4
- }
- /********************************************************************************************
- 函數(shù)名稱:定時器中斷程序
- 功 能:
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- void T0_time() interrupt 1
- {
- TF0=0; //清除中斷標(biāo)志
- TR0=0; //關(guān)中斷
- display(); //數(shù)碼管顯示放在中斷里
- key_scan(); //按鍵掃描放在中斷里
- /********************************************************************************************
- 功 能:按鍵去抖動延時計數(shù)器在外部可以關(guān)閉,不開啟計時功能
- 時 間:2014-11-11
- **************************************************************************************************/
- if(ucKeyStartFlag1==1) //啟動計數(shù)器
- {
- if(uiKeyTimeCnt1<0xffff)//防止計數(shù)器超出范圍
- {
- uiKeyTimeCnt1++; //按鍵去抖動延時計數(shù)器自加1
- }
- }
- /********************************************************************************************
- 功 能:按鍵去抖動延時計數(shù)器在外部可以關(guān)閉,不開啟計時功能
- 時 間:2014-11-11
- **************************************************************************************************/
- if(ucKeyStartFlag2==1) //啟動計數(shù)器
- {
- if(uiKeyTimeCnt2<0xffff) //防止計數(shù)器超出范圍
- {
- uiKeyTimeCnt2++; //按鍵去抖動延時計數(shù)器自加1
- }
- }
- /********************************************************************************************
- 功 能:按鍵去抖動延時計數(shù)器在外部可以關(guān)閉,不開啟計時功能
- 時 間:2014-11-11
- **************************************************************************************************/
- if(ucKeyStartFlag3==1) //啟動計數(shù)器
- {
- if(uiKeyTimeCnt3<0xffff) //防止計數(shù)器超出范圍
- {
- uiKeyTimeCnt3++; //按鍵去抖動延時計數(shù)器自加1
- }
- }
- /********************************************************************************************
- 功 能:按鍵去抖動延時計數(shù)器在外部可以關(guān)閉,不開啟計時功能
- 時 間:2014-11-11
- **************************************************************************************************/
- if(ucKeyStartFlag4==1) //啟動計數(shù)器
- {
- if(uiKeyTimeCnt3<0xffff) //防止計數(shù)器超出范圍
- {
- uiKeyTimeCnt4++; //按鍵去抖動延時計數(shù)器自加1
- }
- }
- /********************************************************************************************
- 功 能:間歇性蜂鳴器報警計數(shù)器在外部可以關(guān)閉,不開啟計時功能
- 時 間:2014-11-11
- **************************************************************************************************/
- if(ucDs1302Error>0) //EEPROM出錯
- {
- if(ucDs1302Lock==0)//原子鎖判斷
- {
- uiDs1302Cnt++; //間歇性蜂鳴器報警的計時器
- }
- }
- /********************************************************************************************
- 功 能:蜂鳴器驅(qū)動放在中斷里面
- 時 間:2014-11-11
- **************************************************************************************************/
- if(uiVoiceCnt!=0) //蜂鳴器
- {
- uiVoiceCnt--; //每次進(jìn)入定時中斷都自減1,直到等于零為止。才停止鳴叫
- beep_dr = 0; //蜂鳴器是PNP三極管控制,低電平就開始鳴叫
- }
- else
- {
- beep_dr = 1; //蜂鳴器是PNP三極管控制,高電平就停止鳴叫。
- }
- TH0=0xf8; //重裝初始值(65535-2000)=63535=0xf82f
- TL0=0x2f;
- EA = 1;
- ET0 = 1;
- TR0=1; //開中斷
- }
- /********************************************************************************************
- 函數(shù)名稱:定時器初始化程序
- 功 能:
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- void T0_init()
- {
- TH0=0xf8; //重裝初始值(65535-2000)=63535=0xf82f
- TL0=0x2f;
- EA = 1;
- ET0 = 1;
- TR0=1; //開中斷
- /* 注釋七:
- * 檢查ds1302芯片的備用電池電量是否用完了。
- * 在上電的時候,在一個特定的地址里把數(shù)據(jù)讀出來,如果發(fā)現(xiàn)不等于0x5a,
- * 則是因?yàn)閭溆秒姵仉娏坑猛炅�,�?dǎo)致保存在ds1302內(nèi)部RAM數(shù)據(jù)區(qū)的數(shù)據(jù)被更改,
- * 與此同時,應(yīng)該重新寫入一次0x5a,為下一次通電判斷做準(zhǔn)備
- */
- ucCheckDs1302=Read1302(READ_CHECK); //判斷ds1302內(nèi)部的數(shù)據(jù)是否被更改
- if(ucCheckDs1302!=0x5a)
- {
- Write1302 (WRITE_PROTECT,0X00); //禁止寫保護(hù)
- Write1302 (WRITE_CHECK,0x5a); //重新寫入標(biāo)志數(shù)據(jù),方便下一次更換新電池后的判斷
- Write1302 (WRITE_PROTECT,0x80); //允許寫保護(hù)
- ucDs1302Error = 1; //1表示報警啟動
- ucWd = 5; //更新到窗口5,顯示錯誤代碼E001
- ucWd5Update = 1;
-
- ucTemp1 = 12; //E
- ucTemp2 = 0; //0
- ucTemp3 = 0; //0
- ucTemp4 = 2; //1
-
- ucDigTimeLock = 1; //小數(shù)點(diǎn)不顯示
- }
- }
- /********************************************************************************************
- 函數(shù)名稱:初始化單片機(jī)內(nèi)部和外部IO口
- 功 能:
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- void initial_myself(void) //第一區(qū) 初始化單片機(jī)
- {
- beep_dr=1; //用PNP三極管控制蜂鳴器,輸出高電平時不叫。
- relay_dr = 0;
- dig1_dr = 1;
- dig2_dr = 1;
- dig3_dr = 1;
- dig4_dr = 1;
- delay_long(30);
- }
- /********************************************************************************************
- 函數(shù)名稱:延時程序
- 功 能:
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- void delay(unsigned int delay_ms) //延時函數(shù)
- {
- unsigned int i,j;
- for(i = delay_ms;i>0;i--)
- for(j = 10;j>0;j--);
- }
- /********************************************************************************************
- 函數(shù)名稱:延時程序
- 功 能:
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- void delay_short(unsigned int uiDelayShort)
- {
- unsigned int i;
- for(i=0;i<uiDelayShort;i++)
- {
- ; //一個分號相當(dāng)于執(zhí)行一條空語句
- }
- }
- /********************************************************************************************
- 函數(shù)名稱: 延時程序
- 功 能:
- 返 回 值:無
- 時 間:2014-11-11
- 備 注:
- **************************************************************************************************/
- void delay_long(unsigned int uiDelayLong)
- {
- unsigned int i;
- unsigned int j;
- for(i=uiDelayLong;i>0;i--)
- for(j=50;j>0;j--); //內(nèi)嵌循環(huán)的空指令數(shù)量
- }
復(fù)制代碼
由于水平能力有限,紕漏之處,還望各位讀者指出。。。。。。。
|
評分
-
查看全部評分
|