光控?cái)?shù)字溫度時(shí)鐘設(shè)計(jì)_第1頁
光控?cái)?shù)字溫度時(shí)鐘設(shè)計(jì)_第2頁
光控?cái)?shù)字溫度時(shí)鐘設(shè)計(jì)_第3頁
光控?cái)?shù)字溫度時(shí)鐘設(shè)計(jì)_第4頁
光控?cái)?shù)字溫度時(shí)鐘設(shè)計(jì)_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 光電技術(shù)課程設(shè)計(jì)題 目:光控?cái)?shù)字溫度時(shí)鐘課程設(shè)計(jì)任務(wù)書1、 主題詞、關(guān)鍵詞數(shù)字時(shí)鐘;DS1302;A/D;D/A;熱敏電阻;光敏電阻;51單片機(jī)2、 課程設(shè)計(jì)內(nèi)容要求 掌握DS1302時(shí)鐘芯片使用方法 掌握光敏電阻原理、特點(diǎn)和使用方法 掌握熱敏電阻原理、特點(diǎn)和使用方法 掌握LED數(shù)碼管動(dòng)態(tài)顯示原理與使用方法 設(shè)計(jì)與開發(fā)一套數(shù)字時(shí)鐘 采用DS1302S時(shí)鐘芯片,帶斷電保護(hù); 具有鬧鐘和定點(diǎn)報(bào)時(shí)功能; 具有溫度顯示功能; 具有光控功能,能根據(jù)環(huán)境光線的強(qiáng)弱,動(dòng)態(tài)調(diào)節(jié)顯示亮度。3、 進(jìn)程安排 第13周:系統(tǒng)硬件電路設(shè)計(jì) 第14周:系統(tǒng)軟件設(shè)計(jì)與仿真 第15周:實(shí)物制作 第16周:撰寫總結(jié)報(bào)告一、

2、整體設(shè)計(jì)思想4二、 系統(tǒng)硬件電路設(shè)計(jì)41、 系統(tǒng)硬件電路圖42、 主控模塊53、 DS1302時(shí)鐘模塊54、 蜂鳴器和按鍵模塊65、 數(shù)碼管顯示模塊和驅(qū)動(dòng)模塊66、溫度光強(qiáng)采集模塊(A/D)7三、 系統(tǒng)軟件設(shè)計(jì)81、主程序流圖82、源程序9MAINCLOCK9DS130224TLC154327USER29四、 實(shí)物圖291、正面292、反面293、工作中30五、 心得體會301、總結(jié)301.1、使用通用51單片機(jī)與專用單片機(jī)的區(qū)別301.2、關(guān)于第三個(gè)數(shù)碼管倒裝的細(xì)節(jié)問題302、心得體會311、 整體設(shè)計(jì)思想按照系統(tǒng)設(shè)計(jì)功能的要求,初步確定設(shè)計(jì)系統(tǒng)由顯示模塊(數(shù)碼管模塊)、數(shù)碼管驅(qū)動(dòng)模塊、主控

3、模塊、時(shí)鐘模塊、溫度光強(qiáng)采集模塊(A/D)、蜂鳴器和按鍵模塊共6個(gè)模塊組成。主控芯片使用51系列AT89C51單片機(jī);時(shí)鐘芯片使用DS1302,是一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘芯片;溫度光強(qiáng)采集使用TLC1543,十位串行(A/D);顯示使用共陽+5V可調(diào)數(shù)碼管。主控模塊(89C51)數(shù)碼管顯示模塊DS1302時(shí)鐘電路數(shù)碼管驅(qū)動(dòng)模塊蜂鳴器和按鍵模塊溫度光強(qiáng)采集模塊2、 系統(tǒng)硬件電路設(shè)計(jì)1、 系統(tǒng)硬件電路圖2、 主控模塊主控模塊核心組成部分是AT89C51單片機(jī),承擔(dān)著所有操作任務(wù)的調(diào)控與分派工作。3、 DS1302時(shí)鐘模塊DS1302時(shí)鐘芯片是本系統(tǒng)實(shí)現(xiàn)高精度計(jì)時(shí)的關(guān)鍵。利用DS130

4、2時(shí)鐘芯片獨(dú)立于單片機(jī)來計(jì)時(shí),在提高計(jì)時(shí)進(jìn)度的同時(shí)也提高了整個(gè)系統(tǒng)的抗干擾能力。DS1302通過I/O、SCLK、RES端口和單片機(jī)AT89C51進(jìn)行通信。I/O接至P1.5用來傳送所有的數(shù)據(jù);SCLK接至單片機(jī)P1.6口,在讀寫操作時(shí)給DS1302提供相應(yīng)的時(shí)鐘脈沖;RES接至單片機(jī)P1.7上用來控制單片機(jī)與時(shí)鐘芯片間的數(shù)據(jù)傳送的開始于結(jié)束。4、 蜂鳴器和按鍵模塊系統(tǒng)有兩個(gè)獨(dú)立按鍵,獨(dú)立按鍵K1、K2分別接至單片機(jī)P2.4、P2.5口。 K1主要功能用來進(jìn)行加一操作。在有功能選擇的情況下,無論選中那一種功能操作,按下K1即進(jìn)行一次加一操作,在沒有功能選擇的情況下,系統(tǒng)不響應(yīng)此按鍵的任何操作。

5、K2用來功能選擇,其功能可以用按鍵次數(shù)N來表示:N=1:校準(zhǔn)鬧鐘的小時(shí)位 N=2:校準(zhǔn)鬧鐘的分鐘位N=3:校準(zhǔn)計(jì)時(shí)的小時(shí)位 N=4:校準(zhǔn)計(jì)時(shí)的分鐘位 N=5:退出5、 數(shù)碼管顯示模塊和驅(qū)動(dòng)模塊采用四個(gè)共陽+5V可調(diào)數(shù)碼管顯示,其中分鐘位的第一個(gè)數(shù)碼管使用倒碼,倒裝,提供秒鐘閃爍。DAC0808是8位數(shù)模轉(zhuǎn)換集成芯片,電流輸出,穩(wěn)定時(shí)間為150ns,驅(qū)動(dòng)電壓±5V,33mW。DAC0808可以直接和TTL,DTL和CMOS 邏輯電平相兼容。在按下K1或K2時(shí),單片機(jī)會向DAC0808芯片輸出0x000xff之間的不同數(shù)值,經(jīng)轉(zhuǎn)換后會輸出不同電壓,從而控制數(shù)碼管的顯示。6、溫度光強(qiáng)采集模

6、塊(A/D)TLC1543是一種開關(guān)電容結(jié)構(gòu)的逐次逼近式A/D轉(zhuǎn)換器,片內(nèi)提供轉(zhuǎn)換時(shí)鐘,十位串行數(shù)據(jù)輸出。可采集11路模擬輸入電壓,由片內(nèi)多路開關(guān)選通,并采樣保持。在本芯片工作溫度(0 C70 C)范圍內(nèi),A/D轉(zhuǎn)換時(shí)間10微秒,具有單+5V電源工作的一大優(yōu)點(diǎn)。89C51單片機(jī)的P1.1、P1.2與P1.3作輸出,其中P1.1輸出地址與控制信息,P1.2模擬片選,P1.3產(chǎn)生時(shí)鐘輸出。TLC2543C數(shù)據(jù)輸出寄存器中的數(shù)據(jù)通過P1.0輸入單片機(jī),轉(zhuǎn)換結(jié)束信號通過P1.4進(jìn)入單片機(jī)并被查詢。3、 系統(tǒng)軟件設(shè)計(jì)1、主程序流圖開始主程序及DS1302、TLC1543初始化定時(shí)器T

7、1,每500ms使小數(shù)點(diǎn)閃爍,每1s調(diào)節(jié)一次亮度Main調(diào)用鬧鐘或整點(diǎn)判別與處理函數(shù)main調(diào)用設(shè)置鍵掃描函數(shù)狀態(tài)4,51,2讀取時(shí)間在顯示溫度的秒數(shù)內(nèi)Main調(diào)用調(diào)整鬧鐘函數(shù)Main調(diào)用調(diào)整時(shí)間函數(shù) 顯示溫度Main調(diào)用正常顯示時(shí)間函數(shù) no yes2、源程序MAINCLOCK#include <reg52.h>#include "myds1302.h"#include "TLC1543.h"#include <math.h>#define NUM 3/控制數(shù)碼管掃描時(shí)間#define ADJUS_CLOCK 1#define

8、ADJUS_ALARM 0#define LED_ON 0#define LED_OFF 1#define BEEP_ON 0#define BEEP_OFF 1sbit BEEP =P26;/蜂嗚器sbit T_shi_s =P20;/數(shù)碼管sbit T_shi_g =P21;sbit T_feng_s =P22;sbit T_feng_g =P23;sbit set_key =P25;/設(shè)置鍵 sbit add_key =P24;/增值鍵/09共陽極字形碼(不帶點(diǎn)),減0x80對應(yīng)數(shù)值表示顯示小數(shù)點(diǎn)uchar code table0=0xC0, 0xF9, 0xA4, 0xB0, 0x99

9、, 0x92, 0x82, 0xF8, 0x80, 0x90;/09共陽極字形倒碼(不帶點(diǎn))uchar code table1=0xc0, 0xcf, 0xa4, 0x86, 0x8b, 0x92, 0x90, 0xc7, 0x80, 0x82, 0x70;/'*C'uchar alarm=0;/用于標(biāo)記鬧鐘是否在響(1-在響,0-沒響)uchar integral_point_flag =0;/1-整點(diǎn),0-鬧鐘uchar twinkle =1;/控制時(shí)間顯示時(shí)小數(shù)點(diǎn)的閃爍uchar state =0;/用于標(biāo)志當(dāng)前的狀態(tài): 0-時(shí)間顯示,1,2-調(diào)時(shí)間(時(shí),分) 3,4-調(diào)

10、鬧鐘(時(shí),分)uchar key_long_press =0;/鍵長按,用于記錄按鍵按下的時(shí)間/定義結(jié)構(gòu)體用于存放鬧鐘時(shí)間struct calendar Naozhong =0x06, 0x30, 0x00;uchar BCD_jiayi(uchar num, uchar jiexjian, uchar x);void shijian_xianshi(uchar shi, uchar fen);/功能:顯示時(shí)間void xianshi_shijian_adjust(uchar shi, uchar fen, uchar clock_alarm);/功能:顯示調(diào)整狀態(tài)時(shí)的數(shù)據(jù)void xians

11、hi_num(uint num);/xianshi_num(10)則顯示 1.0void inc(void);/將state 對應(yīng)的狀態(tài)加一void set_key_scan(void);/設(shè)置鍵掃描,獲取狀態(tài)state信息void tiaoshi(void);/設(shè)置要調(diào)整的時(shí)間void tiao_naozhong(void); /設(shè)置要調(diào)整的鬧鐘void function_key_scan(void);/時(shí)間還是溫度void beep_on(void);/打開蜂鳴器void beep_off(void);/蜂嗚器關(guān)void alarm_clock(void);/是否到了設(shè)定鬧鐘時(shí)間uint

12、temperature_convert(void);void brilliance_control(void);int main(void)uint temporary_temp=0;TMOD =0x11;/T0,T1均工作于方式1(16位定時(shí)/計(jì)數(shù)),軟件啟動(dòng)TH0 = (65535-50000)/256;/一次中斷時(shí)間為 50ms(12MHz下)TL0 = (65535-50000)%256;TH1 = (65535-50000)/256;/一次中斷時(shí)間為 50ms(12MHz下)TL1 = (65535-50000)%256;EA =1;/開總中斷ET0 =1;/開定定時(shí)器T0中斷ET1

13、 =1;/開定定時(shí)器T1中斷TR1=1;/打開定時(shí)器T1,隔一段時(shí)間調(diào)節(jié)一次亮度TLC1543_Init();/初始化TLC1543Read_Time();Write_Time();/設(shè)置初始時(shí)間brilliance_control();/亮度初始設(shè)置while(1)/whilealarm_clock();/鬧鐘判別,與撤消set_key_scan();/設(shè)置鍵掃描,獲取狀態(tài)state信息switch(state)case 0:/顯示時(shí)間Read_Time();/讀取時(shí)間信息,存放在全局 calendar結(jié)構(gòu)對象 Time中if(Time.DS1302_miao<0x25&&am

14、p;Time.DS1302_miao>=0x20) /20-25/45-50秒間顯示溫度| (Time.DS1302_miao<0x50&&Time.DS1302_miao>=0x45)temporary_temp =temperature_convert();/將TLC1543轉(zhuǎn)換的數(shù)字是轉(zhuǎn)換成對應(yīng)的溫度xianshi_num(temporary_temp);elseshijian_xianshi(Time.DS1302_shi, Time.DS1302_feng);/顯示時(shí)間break;case 1:/調(diào)整鬧鐘case 2:tiao_naozhong();

15、break;case 3:/調(diào)整時(shí)間case 4:tiaoshi();break;default : break;/endswitch/endwhilereturn 0;/將TLC1543轉(zhuǎn)換的數(shù)字是轉(zhuǎn)換成對應(yīng)的溫度/參數(shù):/返回:參數(shù)對應(yīng)的溫度uint temperature_convert(void)float temp_num=0;TR1 =0;temp_num =TLC1543_ReadADC(0x00);TR1 =1;/對采集到的數(shù)字量作處理temp_num =10*temp_num*5.0/1024;/10倍電壓/matlab polyfit最小二乘法曲線擬合(4階)temp_nu

16、m =0.000035*pow(temp_num,4) -0.005092*pow(temp_num,3)+ 0.262544*pow(temp_num,2) -7.884431*temp_num+ 123.031448;return (uint)(temp_num*10);/亮度控制/說明:調(diào)用TLC1543_ReadADC(1) 通道1獲取光敏電阻的AD轉(zhuǎn)換值,/TLC5615_WriteDAC(xxx)進(jìn)行DA轉(zhuǎn)換/參數(shù):無/返回:無void brilliance_control(void)uint temp=0;temp =TLC1543_ReadADC(0x01);/對獲取的AD值處

17、理temp = temp/4;/將10位數(shù)字量轉(zhuǎn)換為8位數(shù)字量temp =100*temp*5.0/256;/100倍采集到的電壓值if(temp >59)/弱光P3 =125;else if(temp >28)/一般光強(qiáng)P3 =175;elseP3 =255;P3 =(uchar)temp;/送到DAC0808轉(zhuǎn)換,控制亮度/key.cvoid Timer_T1(void) interrupt 3/T1中斷服務(wù)程序static uint num_time=0; /計(jì)數(shù)器TR1=0;TH1 = (65535-50000)/256;/一次中斷時(shí)間為 50ms(12MHz下)TL1 =

18、 (65535-50000)%256;num_time+;if(num_time%10 =0)/控制時(shí)間顯示時(shí)小數(shù)點(diǎn)的閃爍twinkle =!twinkle;if(num_time >=20)/中斷20次,每1s調(diào)節(jié)一次亮度num_time =0;brilliance_control();/亮度控制TR1 =1;/*/設(shè)置鍵掃描,獲取狀態(tài)state信息/說明:全局變量state 記錄狀態(tài)/參數(shù):無/返回:無void set_key_scan(void)key_long_press =0;/鍵按下的時(shí)間清零set_key =1;/將鍵值拉高if (0 = set_key)/設(shè)置鍵按下 /i

19、f0delay_ms(2);/延時(shí)消抖if (0 = set_key)/真的按下 /if1if(0 != alarm)/在鬧鐘響起后按功能鍵關(guān)閉鬧鐘alarm =0;/取消鬧鐘 beep_off();/關(guān)閉蜂鳴器/TR0 =0;/關(guān)閉定時(shí)器T0,(T0中斷用于控制蜂嗚器響<可控制整點(diǎn)報(bào)時(shí)響的次數(shù)>)else/在鬧鐘響時(shí)按功能鍵 state+;/下一個(gè)狀態(tài)if(state >4)state =0;while(!set_key)/等待按鍵釋放/顯示調(diào)整;這里放顯示函數(shù)是為了長按鍵時(shí)也有顯示信息if(state=3 | state=4)xianshi_shijian_adjust(

20、Time.DS1302_shi, Time.DS1302_feng, ADJUS_CLOCK);else if(state=1 | state=2)xianshi_shijian_adjust(Naozhong.DS1302_shi, Naozhong.DS1302_feng, ADJUS_ALARM); TR0 =1;/打開定時(shí)器T0;計(jì)算按鍵時(shí)間if(key_long_press >4)/發(fā)生設(shè)置鍵長按,直接返回顯示時(shí)間狀態(tài)key_long_press =0;state =0;TR0 =0;/按鍵已釋放,關(guān)閉定時(shí)器T0/endif1/endif0/*/增值鍵掃描,如果按下則根據(jù)參數(shù),

21、將相應(yīng)的值加1/說明:/參數(shù):/返回:無void add_key_scan(void)uchar record_key_long_press=0;/記錄按鍵時(shí)間,用于判斷下一個(gè)中斷和發(fā)生key_long_press =0;/鍵按下的時(shí)間清零add_key =1;/增值鍵拉高if (0 = add_key)/增值鍵按下delay_ms(2);/延時(shí)消抖if (0 = add_key)/真的按下/將state 對應(yīng)的狀態(tài)加一inc();while(!add_key)/等待按鍵釋放 /顯示調(diào)整;這里放顯示函數(shù)是為了長按鍵時(shí)也有顯示信息if(state=3|state=4)xianshi_shijia

22、n_adjust(Time.DS1302_shi, Time.DS1302_feng, ADJUS_CLOCK); elseif(state=1|state=2)xianshi_shijian_adjust(Naozhong.DS1302_shi, Naozhong.DS1302_feng, ADJUS_ALARM); TR0 =1;/打開定時(shí)器T0;計(jì)算按鍵時(shí)間/長按處理if(key_long_press >4 && record_key_long_press !=key_long_press)/發(fā)生長按 record_key_long_press =key_long_

23、press;/將state 對應(yīng)的狀態(tài)加一inc();TR0 =0;/按鍵已釋放,關(guān)閉定時(shí)器T0key_long_press=0;/*/設(shè)置要調(diào)整的時(shí)間/說明:把要設(shè)置的時(shí)間寫入結(jié)構(gòu)對象Time中,再調(diào)用DS1302Write(.)寫入DS1302中/參數(shù):無/返回:無void tiaoshi(void)uchar current_state =state;/記錄當(dāng)前狀態(tài)DS1302Write(WRITE_WP, WP_OFF);/關(guān)寫保護(hù),(否則不能寫入)DS1302Write(WRITE_Seconds, Time.DS1302_miao|DS1302_PAUSE);/暫停DS1302DS

24、1302Write(WRITE_WP, WP_ON);/開寫保護(hù)while(current_state = state)/當(dāng)前狀態(tài)調(diào)整完成add_key_scan();/增值鍵掃描set_key_scan();/設(shè)置鍵掃描,調(diào)整的對象是否改變xianshi_shijian_adjust(Time.DS1302_shi, Time.DS1302_feng, ADJUS_CLOCK);/顯示調(diào)整DS1302Write(WRITE_WP, WP_OFF);/關(guān)寫保護(hù),(否則不能寫入)Write_Time();/將要設(shè)置的時(shí)間寫入DS1302DS1302Write(WRITE_Seconds, Tim

25、e.DS1302_miao&(DS1302_PAUSE);/運(yùn)行DS1302DS1302Write(WRITE_WP, WP_ON);/開寫保護(hù)/*/設(shè)置要調(diào)整的鬧鐘/說明:把要設(shè)置的時(shí)間寫入結(jié)構(gòu)對象Naozhong中/參數(shù):無/返回:無void tiao_naozhong(void)uchar current_state =state;/記錄當(dāng)前狀態(tài)while(current_state = state)/當(dāng)前狀態(tài)調(diào)整完成set_key_scan();/設(shè)置鍵掃描add_key_scan();/增值鍵掃描xianshi_shijian_adjust(Naozhong.DS1302_s

26、hi, Naozhong.DS1302_feng, ADJUS_ALARM);/顯示調(diào)整/將8位BCD碼加一后 若越界(jiexjian為邊界)返回x 不越界返回加一后的值 如BCD_jiayi(0x59, 0x59, 0)返回0uchar BCD_jiayi(uchar num, uchar jiexjian, uchar x)num = (num=jiexjian) ? x :(num&0x09)=0x09 ? (num+0x10)&0xf0 : num+1);return num;/將state 對應(yīng)的狀態(tài)加一void inc(void)switch(state)/注意T

27、ime中的時(shí)間是以BCD碼方式存儲的/調(diào)整時(shí)間case 3:/秒數(shù)以BCD碼方式加1 (不調(diào)整秒)Time.DS1302_shi = BCD_jiayi(Time.DS1302_shi, 0x23, 0);break;case 4:Time.DS1302_feng =BCD_jiayi(Time.DS1302_feng, 0x59, 0);break;/調(diào)整鬧鐘case 1:Naozhong.DS1302_shi = BCD_jiayi(Naozhong.DS1302_shi, 0x23, 0); break;case 2:Naozhong.DS1302_feng = BCD_jiayi(Na

28、ozhong.DS1302_feng, 0x59, 0);break;default : break; /endswitch/*/功能顯示一位數(shù)據(jù)/參數(shù):uchar num 要顯示的數(shù)據(jù), uchar zf 是否帶點(diǎn)(0不帶,1帶)/ uchar liangdu 顯示時(shí)間用于控制亮度取(共NUM ms,顯示liangdu,滅 NUM-liangdu)/返回:無void xianshi_yiwei(uchar num, uchar zf, uchar liangdu)if (zf)/帶點(diǎn)顯示P0 = table0num - 0x80;else/不帶點(diǎn)顯示P0 = table0num;delay_

29、ms(liangdu);P0 = 0xff;/關(guān)閉顯示,消影delay_ms(NUM-liangdu);/*/功能顯示一位數(shù)據(jù)(用倒置的數(shù)碼管)/參數(shù):uchar num 要顯示的數(shù)據(jù), uchar zf 是否顯示點(diǎn)(0-不顯示,1-顯示),/ uchar liangdu 顯示時(shí)間用于控制亮度取(共NUM ms,顯示liangdu,滅 NUM-liangdu)/返回:無void xianshi_yiwei_dao(uchar num, uchar zf, uchar liangdu)if (zf !=0)/帶點(diǎn)顯示P0 = table1num - 0x80;else/不帶點(diǎn)顯示P0 = tab

30、le1num;delay_ms(liangdu);P0 = 0xff;/關(guān)閉顯示,消影delay_ms(NUM-liangdu);/*/功能:顯示時(shí)間/參數(shù):uchar shi 小時(shí), uchar fen 分鐘, uchar miao 秒/返回:無void shijian_xianshi(uchar shi, uchar fen)uchar temp=0;/分離個(gè)十位/顯示小時(shí)temp = shi/16;/十進(jìn)制轉(zhuǎn)換為BCD碼T_shi_s =LED_ON;xianshi_yiwei(temp, 0, NUM);T_shi_s =LED_OFF;T_shi_g =LED_ON;temp = s

31、hi%16;xianshi_yiwei(temp, twinkle, NUM);T_shi_g =LED_OFF;/顯示分鐘T_feng_s =LED_ON;temp = fen/16;xianshi_yiwei_dao(temp, twinkle, NUM);T_feng_s =LED_OFF;T_feng_g =LED_ON;temp = fen%16;xianshi_yiwei(temp, 0, NUM);T_feng_g =LED_OFF;/*/功能:顯示調(diào)整狀態(tài)時(shí)的時(shí)間 (要調(diào)的兩位閃爍-調(diào)時(shí),要調(diào)的一位閃爍-調(diào)鬧鐘)/參數(shù):uchar shi 小時(shí), uchar fen 分鐘, u

32、char miao 秒, uchar clock_alarm 調(diào)的是時(shí)間還是鬧鐘/返回:無void xianshi_shijian_adjust(uchar shi, uchar fen, uchar clock_alarm)static uchar frequency=0;/用于閃爍控制uchar temp=0;/分離個(gè)十位uchar liang_mie_shi =NUM;/默認(rèn)亮uchar liang_mie_feng =NUM;/默認(rèn)亮frequency+;if(frequency >40)/如果閃爍太快人眼可能看起來是一直亮的frequency=0;elseif(frequenc

33、y >25)/frequency不要用于控制秒閃爍,秒閃爍頻率小于點(diǎn)switch(state)case 1:/鬧鐘的小時(shí)case 3:/時(shí)間的小時(shí)liang_mie_shi = 0;break;case 2:/鬧鐘的分鐘case 4:/時(shí)間的分鐘liang_mie_feng = 0;break;default : break;/顯示小時(shí)temp = shi/16;/十進(jìn)制轉(zhuǎn)換為BCD碼T_shi_s =LED_ON;if(clock_alarm =ADJUS_CLOCK)xianshi_yiwei(temp, 0, liang_mie_shi);/調(diào)時(shí)間閃爍elseif(clock_al

34、arm =ADJUS_ALARM)/調(diào)鬧鐘不閃爍xianshi_yiwei(temp, 0, NUM);T_shi_s =LED_OFF;T_shi_g =LED_ON;temp = shi%16;xianshi_yiwei(temp, 1, liang_mie_shi);T_shi_g =LED_OFF;/顯示分鐘T_feng_s =LED_ON;temp = fen/16;if(clock_alarm =ADJUS_CLOCK)/調(diào)時(shí)間閃爍xianshi_yiwei_dao(temp, 1, liang_mie_feng);elseif(clock_alarm =ADJUS_ALARM)/

35、調(diào)鬧鐘不閃爍xianshi_yiwei_dao(temp, 1, NUM);T_feng_s =LED_OFF;T_feng_g =LED_ON;temp = fen%16;xianshi_yiwei(temp, 0, liang_mie_feng);T_feng_g =LED_OFF;/顯示帶一位小數(shù)的溫度/說明:xianshi_temperature(10)則顯示 10/參數(shù):uint num要顯示的數(shù)/返回:無void xianshi_num(uint num)uchar i=0;uchar j=0;/j=num%10;/num /=10;/顯示*C (溫度單位)T_feng_s = L

36、ED_ON;xianshi_yiwei_dao(10, 0, NUM);/10-*CT_feng_s = LED_OFF;/低位 至 高位i =num%10;T_shi_g = LED_ON;xianshi_yiwei(i, 0, NUM);T_shi_g = LED_OFF;num /=10;if(num >0)i =num%10;T_shi_s = LED_ON;xianshi_yiwei(i, 0, NUM);T_shi_s = LED_OFF;T_feng_g = LED_ON;/xianshi_yiwei(j, 0, NUM);/T_feng_g = LED_OFF;/蜂嗚器響

37、void beep_on(void)BEEP =BEEP_ON; /打開蜂鳴器/蜂嗚器關(guān)void beep_off(void)BEEP =BEEP_OFF; /關(guān)閉蜂鳴器/*/是否到了設(shè)定鬧鐘時(shí)間void alarm_clock(void)if(Time.DS1302_shi >=0x06 && Time.DS1302_shi <=0x19 && 0= Time.DS1302_feng && 0= Time.DS1302_miao)/整點(diǎn)報(bào)時(shí)integral_point_flag =1;TR0 =1;/打開T0定時(shí)器可用于控制整點(diǎn)報(bào)時(shí)

38、響的次數(shù)/鬧鐘;鬧鐘響一段時(shí)間自動(dòng)關(guān)閉或者鬧鐘響后手動(dòng)關(guān)閉if(Time.DS1302_shi=Naozhong.DS1302_shi && Time.DS1302_feng=Naozhong.DS1302_feng&&Time.DS1302_miao=Naozhong.DS1302_miao)integral_point_flag =0;alarm =1;/鬧鐘時(shí)間到beep_on();/打開蜂嗚器 ;在按鍵掃描中關(guān)閉TR0 =1;/打開T0定時(shí)器可用于控制鬧鐘響的時(shí)間void Timer_T0(void) interrupt 1/T0中斷服務(wù)程序,用于鬧鐘報(bào)

39、時(shí) static uchar numx=0; /整點(diǎn)報(bào)時(shí)計(jì)數(shù)器static uint num_niao=0; /鬧鐘計(jì)數(shù)器static uchar hour=0;/小時(shí)數(shù)static num=0; /計(jì)數(shù)器,增值鍵和設(shè)置鍵被按下的時(shí)間TR0 =0; TH0 = (65535-50000)/256;/一次中斷時(shí)間為 50ms(12MHz下)TL0 = (65535-50000)%256;if(state!=0)/設(shè)置狀態(tài)下,計(jì)算增值鍵和設(shè)置鍵被按下的時(shí)間num+;if(num >=2)/發(fā)生2次中斷 num =0;key_long_press+;/增值鍵按下時(shí)間增加elseif( inte

40、gral_point_flag=0)/鬧鐘狀態(tài)num_niao+;if(num_niao>1200)/鬧鐘響了一分鐘則關(guān)閉integral_point_flag=2;/報(bào)時(shí)標(biāo)志置于空閑num_niao=0;/計(jì)數(shù)器清零alarm =0; /取消鬧鐘 TR0 =0; /關(guān)閉定時(shí)器T0BEEP =BEEP_OFF; /關(guān)鬧鐘elseif(integral_point_flag=1)/整點(diǎn)報(bào)時(shí)狀態(tài)numx+;if(numx%10 =0)BEEP = BEEP;if(Time.DS1302_shi >0x12) hour = Time.DS1302_shi -0x12;/13點(diǎn)換成一點(diǎn).(

41、不然響13下。呵呵)elsehour = Time.DS1302_shi;hour = 10*(hour/16) + hour%16;/BCD碼表示的時(shí)間轉(zhuǎn)換為10進(jìn)制時(shí)間if(numx > 20*hour)TR0 =0;/關(guān)閉定時(shí)器T0BEEP =BEEP_OFF; /關(guān)閉蜂鳴器integral_point_flag=2; /報(bào)時(shí)標(biāo)志置于空閑numx =0;/計(jì)數(shù)器清零TR0 =1;DS1302#include "myds1302.h"sbit SDA = P15;/DS1302雙向數(shù)據(jù)線sbit SCLK = P16;/時(shí)鐘線sbit RST = P17;/控制線

42、/以BCD碼存放時(shí)間信息struct calendar Time =0x05, 0x59, 0x50;/*/從DS1302讀出一個(gè)字節(jié)/參數(shù):無/返回:讀取的字節(jié)uchar DS1302ReadByte(void)uchar i=0;uchar date=0;/讀取的字節(jié)_nop_();for (i=0; i<8; i+)date = date >>1;/從低位至高位讀入if (SDA)/讀出1date |=0x80;SCLK =1;/產(chǎn)生上升沿_nop_();SCLK =0;_nop_();return date;/*/向DS1302寫入一個(gè)字節(jié)/參數(shù):uchar dat

43、要寫入的字節(jié)/返回:無void DS1302WriteByte(uchar dat)uchar i=0;SCLK =0;_nop_();for (i=0; i<8; i+)SDA =dat&0x01;/DS1302數(shù)據(jù)是從低位開始傳輸?shù)腳nop_();SCLK =1;/產(chǎn)生上升沿_nop_();SCLK =0;dat =dat>>1;/將高位移至低位/*/從DS1302讀數(shù)據(jù)/說明:先寫要讀數(shù)據(jù)地址,再讀數(shù)據(jù)/參數(shù):uchar cmd 要寫入的控制字(數(shù)據(jù)所在的地址)/返回:讀取的數(shù)據(jù)uchar DS1302Read(uchar cmd)uchar dat=0;RST

44、 =0;/初始CE線置為0SCLK =0;/時(shí)鐘拉低_nop_();RST =1;/CE線拉高,開始傳輸DS1302WriteByte(cmd);/傳輸命令字,要操作的時(shí)間/日歷的地址dat =DS1302ReadByte();/讀取數(shù)據(jù)SCLK =1;RST =0;/讀取結(jié)束,CE置為0,結(jié)束數(shù)據(jù)傳輸return dat;/*/向DS1302寫數(shù)據(jù)/說明:先寫地址,再寫數(shù)據(jù)/參數(shù):uchar cmd 要寫入的控制字, uchar dat 要寫入的數(shù)據(jù) /返回:無void DS1302Write(uchar cmd, uchar dat)RST =0;/初始CE線置為0SCLK =0;/時(shí)鐘拉

45、低_nop_();RST =1;/CE線拉高,開始傳輸DS1302WriteByte(cmd);/傳輸命令字,要寫入的時(shí)間/日歷的地址DS1302WriteByte(dat);/要寫入的日期/時(shí)間SCLK =1;/時(shí)鐘拉高RST =0;/讀取結(jié)束,CE置為0,結(jié)束數(shù)據(jù)傳輸/從DS1302讀出時(shí)間參量/說明:全局結(jié)構(gòu)體變量Time用于存放時(shí)間參量/參數(shù):無/返回:無void Read_Time(void)Time.DS1302_shi = DS1302Read(READ_Hour);/讀取小時(shí)Time.DS1302_feng = DS1302Read(READ_Minutes);/讀取分鐘Tim

46、e.DS1302_miao = DS1302Read(READ_Seconds);/讀取秒數(shù)/對讀取的時(shí)間進(jìn)行有效處理(去除掉與時(shí)間信息無關(guān)的位的影響)if(Time.DS1302_shi>0x23) Time.DS1302_shi =0;/如果使用12小時(shí)制,則需要對讀取的時(shí)間進(jìn)行處理if(Time.DS1302_feng>0x59) Time.DS1302_feng =0;if(Time.DS1302_miao>0x59) Time.DS1302_miao -=0x80;/暫停模式下秒的最高位為 1/將Time結(jié)構(gòu)中的時(shí)間參量寫入DS1302/說明:全局結(jié)構(gòu)體變量Time

47、用于存放時(shí)間參量/參數(shù):無/返回:無void Write_Time(void)if(Time.DS1302_shi>0x23) Time.DS1302_shi =0;if(Time.DS1302_feng>0x59) Time.DS1302_feng =0;if(Time.DS1302_miao>0x59) Time.DS1302_miao =0;DS1302Write(WRITE_WP, WP_OFF);/寫保護(hù)關(guān),(否則不能寫入)DS1302Write(WRITE_Hour, Hour_24(Time.DS1302_shi);/設(shè)置小時(shí)DS1302Write(WRITE_Minu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論