光控數(shù)字溫度時鐘設計_第1頁
光控數(shù)字溫度時鐘設計_第2頁
光控數(shù)字溫度時鐘設計_第3頁
光控數(shù)字溫度時鐘設計_第4頁
光控數(shù)字溫度時鐘設計_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

7、1,每500ms使小數(shù)點閃爍,每1s調節(jié)一次亮度Main調用鬧鐘或整點判別與處理函數(shù)main調用設置鍵掃描函數(shù)狀態(tài)4,51,2讀取時間在顯示溫度的秒數(shù)內Main調用調整鬧鐘函數(shù)Main調用調整時間函數(shù) 顯示溫度Main調用正常顯示時間函數(shù) no yes2、源程序MAINCLOCK#include <reg52.h>#include "myds1302.h"#include "TLC1543.h"#include <math.h>#define NUM 3/控制數(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;/設置鍵 sbit add_key =P24;/增值鍵/09共陽極字形碼(不帶點),減0x80對應數(shù)值表示顯示小數(shù)點uchar code table0=0xC0, 0xF9, 0xA4, 0xB0, 0x99

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

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

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

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

13、 =1;/開定定時器T1中斷TR1=1;/打開定時器T1,隔一段時間調節(jié)一次亮度TLC1543_Init();/初始化TLC1543Read_Time();Write_Time();/設置初始時間brilliance_control();/亮度初始設置while(1)/whilealarm_clock();/鬧鐘判別,與撤消set_key_scan();/設置鍵掃描,獲取狀態(tài)state信息switch(state)case 0:/顯示時間Read_Time();/讀取時間信息,存放在全局 calendar結構對象 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轉換的數(shù)字是轉換成對應的溫度xianshi_num(temporary_temp);elseshijian_xianshi(Time.DS1302_shi, Time.DS1302_feng);/顯示時間break;case 1:/調整鬧鐘case 2:tiao_naozhong();

15、break;case 3:/調整時間case 4:tiaoshi();break;default : break;/endswitch/endwhilereturn 0;/將TLC1543轉換的數(shù)字是轉換成對應的溫度/參數(shù):/返回:參數(shù)對應的溫度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);/亮度控制/說明:調用TLC1543_ReadADC(1) 通道1獲取光敏電阻的AD轉換值,/TLC5615_WriteDAC(xxx)進行DA轉換/參數(shù):無/返回:無void brilliance_control(void)uint temp=0;temp =TLC1543_ReadADC(0x01);/對獲取的AD值處

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

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

19、f0delay_ms(2);/延時消抖if (0 = set_key)/真的按下 /if1if(0 != alarm)/在鬧鐘響起后按功能鍵關閉鬧鐘alarm =0;/取消鬧鐘 beep_off();/關閉蜂鳴器/TR0 =0;/關閉定時器T0,(T0中斷用于控制蜂嗚器響<可控制整點報時響的次數(shù)>)else/在鬧鐘響時按功能鍵 state+;/下一個狀態(tài)if(state >4)state =0;while(!set_key)/等待按鍵釋放/顯示調整;這里放顯示函數(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;/打開定時器T0;計算按鍵時間if(key_long_press >4)/發(fā)生設置鍵長按,直接返回顯示時間狀態(tài)key_long_press =0;state =0;TR0 =0;/按鍵已釋放,關閉定時器T0/endif1/endif0/*/增值鍵掃描,如果按下則根據(jù)參數(shù),

21、將相應的值加1/說明:/參數(shù):/返回:無void add_key_scan(void)uchar record_key_long_press=0;/記錄按鍵時間,用于判斷下一個中斷和發(fā)生key_long_press =0;/鍵按下的時間清零add_key =1;/增值鍵拉高if (0 = add_key)/增值鍵按下delay_ms(2);/延時消抖if (0 = add_key)/真的按下/將state 對應的狀態(tài)加一inc();while(!add_key)/等待按鍵釋放 /顯示調整;這里放顯示函數(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;/打開定時器T0;計算按鍵時間/長按處理if(key_long_press >4 && record_key_long_press !=key_long_press)/發(fā)生長按 record_key_long_press =key_long_

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

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

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

26、hi, Naozhong.DS1302_feng, ADJUS_ALARM);/顯示調整/將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 對應的狀態(tài)加一void inc(void)switch(state)/注意T

27、ime中的時間是以BCD碼方式存儲的/調整時間case 3:/秒數(shù)以BCD碼方式加1 (不調整秒)Time.DS1302_shi = BCD_jiayi(Time.DS1302_shi, 0x23, 0);break;case 4:Time.DS1302_feng =BCD_jiayi(Time.DS1302_feng, 0x59, 0);break;/調整鬧鐘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 是否帶點(0不帶,1帶)/ uchar liangdu 顯示時間用于控制亮度取(共NUM ms,顯示liangdu,滅 NUM-liangdu)/返回:無void xianshi_yiwei(uchar num, uchar zf, uchar liangdu)if (zf)/帶點顯示P0 = table0num - 0x80;else/不帶點顯示P0 = table0num;delay_

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

30、le1num;delay_ms(liangdu);P0 = 0xff;/關閉顯示,消影delay_ms(NUM-liangdu);/*/功能:顯示時間/參數(shù):uchar shi 小時, uchar fen 分鐘, uchar miao 秒/返回:無void shijian_xianshi(uchar shi, uchar fen)uchar temp=0;/分離個十位/顯示小時temp = shi/16;/十進制轉換為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;/*/功能:顯示調整狀態(tài)時的時間 (要調的兩位閃爍-調時,要調的一位閃爍-調鬧鐘)/參數(shù):uchar shi 小時, uchar fen 分鐘, u

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

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

34、arm =ADJUS_ALARM)/調鬧鐘不閃爍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)/調時間閃爍xianshi_yiwei_dao(temp, 1, liang_mie_feng);elseif(clock_alarm =ADJUS_ALARM)/

35、調鬧鐘不閃爍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; /打開蜂鳴器/蜂嗚器關void beep_off(void)BEEP =BEEP_OFF; /關閉蜂鳴器/*/是否到了設定鬧鐘時間void alarm_clock(void)if(Time.DS1302_shi >=0x06 && Time.DS1302_shi <=0x19 && 0= Time.DS1302_feng && 0= Time.DS1302_miao)/整點報時integral_point_flag =1;TR0 =1;/打開T0定時器可用于控制整點報時

38、響的次數(shù)/鬧鐘;鬧鐘響一段時間自動關閉或者鬧鐘響后手動關閉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;/鬧鐘時間到beep_on();/打開蜂嗚器 ;在按鍵掃描中關閉TR0 =1;/打開T0定時器可用于控制鬧鐘響的時間void Timer_T0(void) interrupt 1/T0中斷服務程序,用于鬧鐘報

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

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

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

42、/以BCD碼存放時間信息struct calendar Time =0x05, 0x59, 0x50;/*/從DS1302讀出一個字節(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;/產生上升沿_nop_();SCLK =0;_nop_();return date;/*/向DS1302寫入一個字節(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;/產生上升沿_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;/時鐘拉低_nop_();RST =1;/CE線拉高,開始傳輸DS1302WriteByte(cmd);/傳輸命令字,要操作的時間/日歷的地址dat =DS1302ReadByte();/讀取數(shù)據(jù)SCLK =1;RST =0;/讀取結束,CE置為0,結束數(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;/時鐘拉

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

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

47、用于存放時間參量/參數(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);/寫保護關,(否則不能寫入)DS1302Write(WRITE_Hour, Hour_24(Time.DS1302_shi);/設置小時DS1302Write(WRITE_Minu

溫馨提示

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

評論

0/150

提交評論