




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精選優質文檔-傾情為你奉上 基于單片機的萬年歷設計 二、實驗要求設計一個萬年歷,將時鐘顯示在LCD1602的顯示屏上并且可以進行年、月、日以及時、分、秒的設置。此外還可以通過按鍵進行鬧鐘設置以及事件提醒功能,用蜂鳴器進行鬧鈴提醒。最后附加一個溫濕度檢測的功能,用溫濕度傳感器檢測室內的溫濕度并將溫濕度數據在顯示屏上顯示出來。三、實驗設備和儀器1.用 STC89C52芯片作為系統板的主控芯片2.DHT11溫濕度傳感器3.DS1302時鐘芯片4.LCD1602顯示屏四、實驗各模塊原理介紹4.1 STC89C52單片機STC89C52是STC公司生產的一種低功耗、高性能CMOS8位微控制器,具有8K字
2、節系統可編程Flash存儲器。STC89C52使用經典的MCS-51內核,具有傳統51單片機不具備的功能。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得STC89C52為眾多嵌入式控制應用系統提供高靈活、超有效的解決方案。(1)主要特性8K字節程序存儲空間;512字節數據存儲空間;內帶4K字節EEPROM存儲空間;可直接使用串口下載;(2)器件參數1. 增強型8051單片機,6時鐘/機器周期和12時鐘/機器周期可以任意選擇,指令代碼完全兼容傳統8051。2. 工作電壓:5.5V3.3V(5V單片機)/3.8V2.0V(3V 單片機)3.工作頻率范圍:040MHz,相當于普通
3、8051的080MHz,實際工作頻率可達48MHz4. 用戶應用程序空間為8K字節5. 片上集成512字節RAM6. 通用I/O 口(32個),復位后為:P1/P2/P3 是準雙向口/弱上拉,P0口是漏極開路輸出,作為總線擴展用時,不用加上拉電阻,作為I/O口用時,需加上拉電阻。7. ISP(在系統可編程)/IAP(在應用可編程),無需專用編程器,無需專用仿真器,可通過串口(RXD/P3.0,TXD/P3.1)直接下載用戶程序,數秒即可完成一片。8. 具有EEPROM 功能9. 共3個16位定時器/計數器。即定時器T0、T1、T2。10.外部中斷4 路,下降沿中斷或低電平觸發電路,Power
4、Down 模式可由外部中斷低電平觸發中斷方式喚醒。11. 通用異步串行口(UART),還可用定時器軟件實現多個UART。12. 工作溫度范圍:-40+85(工業級)/075(商業級)13. PDIP封裝1、STC89C52單片機引腳圖圖4.1 STC89C52單片機引腳圖 主電源引腳(2根)VCC(Pin40):電源輸入,接+5V電源GND(Pin20):接地線外接晶振引腳(2根)XTAL1(Pin19):片內振蕩電路的輸入端XTAL2(Pin20):片內振蕩電路的輸出端控制引腳(4根)RST/VPP(Pin9):復位引腳,引腳上出現2個機器周期的高電平將使單片機復位。ALE/PROG(Pin
5、30):地址鎖存允許信號PSEN(Pin29):外部存儲器讀選通信號EA/VPP(Pin31):程序存儲器的內外部選通,接低電平從外部程序存儲器讀指令,如果接高電平則從內部程序存儲器讀指令。可編程輸入/輸出引腳(32根)STC89C52單片機有4組8位的可編程I/O口,分別位P0、P1、P2、P3口,每個口有8位(8根引腳),共32根。PO口(Pin39Pin32):8位雙向I/O口線,名稱為P0.0P0.7 P1口(Pin1Pin8):8位準雙向I/O口線,名稱為P1.0P1.7 P2口(Pin21Pin28):8位準雙向I/O口線,名稱為P2.0P2.7 P3口(Pin10Pin17):8
6、位準雙向I/O口線,名稱為P3.0P3.7。2、STC89C52單片機最小系統STC89C52單片機最小系統主要由復位電路和時鐘電路組成。復位功能通過外部電路來實現,按下按鍵K1控制單片機的復位。時鐘電路主要通過晶振來實現,為單片機提供運行時鐘。根據不同的需求選用的晶振頻率會有差異,在本次課程設計中采用11.0592MHZ的晶振頻率。單片機復位電路如圖4.2所示,晶振電路如圖4.3所示。圖4.2 復位電路圖4.3晶振電路4.2 DS1302芯片DS1302是DALLAS公司出的一款實時時鐘芯片,它廣泛應用于電話、傳真、便攜式儀器等產品領域,主要性能指標如下:1、DS1302是一個實時時鐘芯片,
7、可以提供秒、分、小時、日期、月、年等信息,具有軟件自動調整的能力,可以通過配置AM/PM來決定采用24小時格式還是12小時格式。2、擁有31字節數據存儲RAM。3、串行I/O通信方式。4、DS1302的工作電壓比較寬,在2.0V5.5V范圍內均可正常工作。采用雙電源供電,當主電源比備用電源高0.2V時,由主電源供電,否則采用備用電源,一般是一個紐扣電池。5、DS1302實時時鐘芯片的功耗很低,當工作電壓為2.0V時,工作電流小于300nA。6、DS1302共有8個引腳,有兩種封裝形式,一種是DIP-8封裝,芯片寬度(不含引腳)是300mil,一種是SOP-8封裝,有兩種寬度,一種是150mil
8、,一種是208mil。(1) DS1302引腳及其功能圖 4.4 DS1302芯片引腳圖(1)Vcc2:主電源引腳,當Vcc2比Vcc1高0.2v以上時,DS1302由Vcc2供電,當Vcc2低于Vcc1時,由Vcc1供電。(2、3)X1、X2:這兩個引腳需要接一個32.768k的晶振,為了給DS1302提供一個基準。但是該晶振的引腳負載電容必須為6pF,若使用有源晶振,接到X1上即可,X2則懸空。(4)GND:接地(5)CE:DS1302的輸入引腳。該引腳內部有一個40k的下拉電阻,當該引腳為高電平,對DS1302進行讀寫。(6)I/O:該引腳是一個雙向通信引腳,且內部含有一個40k的下拉電
9、阻,可進行數據的讀寫。(7)SCLK:該引腳是輸入引腳,且內部含有一個40k的下拉電阻,作為通信的時鐘信號。 (8)Vcc1:備用電源引腳。(2) DS1302與單片機接線圖DS1302引腳與單片機接線圖如圖4.5所示,從圖4.5可看出,引腳X1與X2之間接一個32.768K的晶體正振蕩器,Vcc1通過一個紐扣能電池再接地。圖4.5 DS1302與單片機連接圖4.3 LCD1602液晶顯示屏LCD1602液晶屏能夠能夠同時顯示32個字符,價格便宜,編程簡單而且穩定可靠。LCD1602液晶屏是一種圖形點陣顯示器,顯示原理簡單易懂,都是液晶屏內部的液晶材料變化而顯示不同的字符,因為液晶是具有流動特
10、性的物質,所以只需外加很微小的力量即可使液晶分子運動。(1)LCD1602引腳1602LCD采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口圖如圖4.6所示:圖4.6 LCD1602引腳圖(a) 各個引腳說明1腳:VSS為地電源2腳:VDD接5V正電源 3腳:V0為液晶顯示器對比度調整端,接正電源時對比度最弱,接地時對比對比度過高時會產生“鬼影”,使用時可以通過一個10K的電位器調整。4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RSR/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電
11、平,R/W為高電平;RS為高電平,R/W為低電平時可以寫入數據。 6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。 714腳:D0D7為8位雙向數據線。 15腳:背光源正極16腳:背光源負極 (b)LCD1602主要技術參數:顯示容量:32個字符;芯片工作電壓:4.5-5.5V;工作電流:2.0mA(5.0V);模塊最佳工作電壓:5.0V;(2)LCD1602與單片機接線圖圖4.7 LCD1602與單片機接線圖LCD1602與單片機接線圖如4.7所示,背光源正極(5)與VDD(2)均接電源,將液晶顯示器接地保證對比度最強,可使用一個10K的電位器進行調整。4.4 溫濕度傳感
12、器DHT11DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它采用專用的數字模塊采集技術、溫濕度傳感技術,確保產品的可靠性、長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此,該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式儲存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則
13、。產品為4針單排引腳封裝,連接方便,特殊封裝形式可根據用戶需求而提供。(1)DHT11引腳及其功能DHT11的引腳圖如圖4.8所示,一般情況下它有四個引腳,分別為:VCC、DOUT、NC、GND。各引腳以及功能如表4-1所示。圖4.8 DHT11引腳圖表4-1 DHT11引腳及其功能pin名稱注釋1VDD供電3-5.5VDC2DATA串行數據,單總線3NC空腳,請懸空4GND接地,電源負極1.電源引腳DHT11的供電電壓為3-5.5V。傳感器上電后,要等待 1s 以越過不穩定狀態在此期間無需發送任何指令。電源引腳(VDD,GND)之間可增加一個100nF 的電容,作用在于去耦濾波。2.串行接口
14、(單線雙向)DATA是用于微處理器與DHT11之間的通信和同步的串行雙向接口,采用單總線數據格式。每次通信都是以高位先出的順序傳輸40位數據,用時約為4 ms。數據格式為:8位濕度整數數據+8位濕度小數數據+8位溫度整數數據+8位溫度小數數據+8位校驗和數據。數據分小數部分和整數部分,當前小數部分用于以后擴展,現讀出為零。數據傳送正確時,校驗和數據等于“8位濕度整數數據+8位濕度小數數據+8位溫度整數數據+8位溫度小數數據”所得結果的末8位。(2)DHT11與單片機接線圖DHT11與單片機的接線圖如圖4.9所示,由圖4.9中可看出,DHT11第三個引腳接單片機的P2.2引腳,第一個引腳接電阻和
15、發光二極管。圖4.9 DHT11與單片機接線圖4.5 蜂鳴器蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。蜂鳴器可分為無源蜂鳴器和有源蜂鳴器兩種,此處我們用到的是有源蜂鳴器。有源蜂鳴器工作的理想信號是直流電,通常標示為VDC、VDD等。因為蜂鳴器內部有一簡單的振蕩電路,能將恒定的直流電轉化成一定頻率的脈沖信號,從而帶動鉬片振動發音。有源蜂鳴器主要靠壓電效應的原理來發聲的,且內部帶有多諧振蕩器,可產生1.5-2.5kHZ 的電壓信號。由此有源蜂鳴器才能發聲。有源蜂鳴器在單片機中的電路圖
16、較為簡單,圖4.10為蜂鳴器與單片機的接線圖。圖4.10 蜂鳴器與單片機的接線圖有源蜂鳴器直接接上額定電源就可連續發聲,I/O口輸出后接一個1K的電阻,目的在于基極限流,以低電平方式,啟動蜂鳴器發聲。五、流程圖(1) 主程序流程圖圖5.1是系統主程序流程圖,系統開始時先進行初始化,然后再調整時間和鬧鐘,再通過串口屏將時間顯示出來。圖5.1 主程序流程圖(2)子程序流程圖系統從主程序開始執行,分別調用各個子程序,其中子程序包括DS1302子程序,DHT11子程序和LCD1602子程序等。(1)DS1302芯片子程序流程圖DS1302為實時時鐘芯片,可以提供秒、分、時、日、月、年及星期等信息,具有
17、軟件自動調整的能力,可以通過配置AM/PM來決定采用24小時格式還是12小時格式。從DS1302中可以讀出年、月、日、時、分、秒等信息。圖5.2為DS1302芯片的子程序流程圖:圖5.2 DS1302子程序流程圖(2)DHT11子程序流程圖DHT11為溫濕度傳感器,可以實時顯示環境中的溫濕度。其數據由8位濕度整數數據,8位濕度小數數據,8位溫度整數數據和8位溫度小數數據以及8位校驗和數據。DHT11子程序流程圖如5.3所示:圖5.3 DHT11子程序流程圖(3)LCD1602子程序流程圖LCD1602顯示時,也要先進行初始化,緊接著讀指令,讀完之后寫指令,再對數據進行讀寫,然后顯示出來,其流程
18、圖如圖5.4所示。圖5.4 LCD1602顯示屏子程序流程圖六、實驗目的1.學會并掌握可keil軟件的使用;2.學會并掌握Altium Designer軟件的使用;3.實現萬年歷的基本功能;4.通過實驗鞏固單片機相關知識和檢驗自身動手能力七、實驗內容本次實驗使用STC89C52單片機作為主控芯片,使用DS1302芯片作為時鐘芯片,在LCD1602顯示屏上顯示,并可以設置鬧鐘和事件提醒功能,此外還可以進行室內溫濕度的檢測和顯示,最終完成萬年歷的設計。八、實驗步驟1.查詢資料,確定主控芯片、溫濕度傳感器、時鐘芯片以及LCD1602顯示屏的使用說明。2.根據功能要求進行硬件電路的設計,使用Altiu
19、m Designer軟件設計電路。整個電路分為主控芯片控制模塊、LCD1602顯示模塊、按鍵設置模塊、蜂鳴器電路模塊以及DHT11溫濕度傳感器模塊。硬件電路圖如圖1所示:圖8.1:硬件電路圖3.根據電路圖編寫C語言代碼:代碼如下:#include #define uchar unsigned char#define uint unsigned int#define lcddata P0#define readalarmsecond 0xc7 /定義從 DS1302 中讀鬧鐘秒值的命令字節#define writealarmsecond 0xc6 /定義往 DS1302 中寫鬧鐘秒值的命令字節#
20、define readalarmminute 0xc5 /定義從 DS1302 中讀鬧鐘分值的命令字節#define writealarmminute 0xc4 /定義往 DS1302 中寫鬧鐘分值的命令字節#define readalarmhour 0xc3 /定義從 DS1302 中讀鬧鐘小時值命令字節#define writealarmhour 0xc2 /定義往 DS1302 中寫鬧鐘小時值命令字節#define readeventday 0xd7 /定義從 DS1302 中讀事件提醒日期值的命令字節#define writeeventday 0xd6 /定義往 DS1302 中寫事件
21、提醒日期值的命令字節#define readeventmonth 0xd5 /定義從 DS1302 中讀事件提醒月份值的命令字節#define writeeventmonth 0xd4 /定義往 DS1302 中寫事件提醒月份值的命令字節#define readeventyear 0xd3 /定義從 DS1302 中讀事件提醒年份值的命令字節#define writeeventyear 0xd2 /定義往 DS1302 中寫事件提醒年份值的命令字節sbit lcdrs=P27; /LCD 數據 /命令選擇端 (H/L)sbit lcdrw=P26; /LCD 讀/寫選擇端 (H/L)sbit
22、lcden=P25; /LCD 使能控制sbit beep=P13; /蜂鳴器控制端sbit DQ = P14; /溫濕度傳感器sbit kmenu=P32; /功能鍵sbit kup=P33; /增大鍵sbit kdown=P34; /減小鍵sbit kalarm=P35; /鬧鐘查看鍵 Ring: 顯示鬧鐘需要調到的時間sbit kevent=P36; /事件查看鍵 Ding: 顯示事件提醒需要調到的時間/sbit kmode=P37; /切換溫濕度顯示sbit dsclk=P22; /ds1302 的時鐘信號端sbit dsdata=P21; /ds1302 的數據 I/O 端sbit
23、dsrst=P20; /ds1302 的復位端sbit ACC7=ACC7; /定義累加器的最高和最低位。sbit ACC0=ACC0;bit flagalarm,flagseta,flagset; / 分別定義鬧鐘響標志位,鬧鐘設置標志位,時間設置標志位bit flagevent,flagsseta; / 分別定義事件提醒標志位,事件提醒設置標志位uchar FLAG,k;uchar temp;uchar T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;uchar T_data_H_temp,T_data_L_temp,RH_data_H_te
24、mp,RH_data_L_temp,checkdata_temp;uchar comdata;uchar kmenunum,s,m,h,dd,mm,yy; /功能鍵被按次數的計數器 .char second,minute,hour,year,month,day,week;uchar inittime7=0x59,0x59,0x11,0x05,0x07,0x04,0x18; /初始化后設置為:/2018 年 7 月 5 日 星期四, 11 點 59 分 59 秒,/從左往右的數據依次是,秒,分,時,日,月,星期,年。/ 年月日星期: 2018-07-05 THU/ 時間: 11:59:59uch
25、ar code t1= - - ; /液晶固定顯示部分。uchar code t2= : : ;/各函數聲明void delay(uint z); /毫秒級延時函數。void di(); /蜂鳴器發聲函數。void writecom(uchar com); /液晶寫命令函數。void writedata(uchar dat); /液晶寫數據函數。void writetime(uchar add,uchar dat); / 液晶刷新時分秒。void writenyr(uchar add,uchar dat); / 液晶刷新日期。void writeweek(uchar week); / 液晶星期
26、幾顯示函數。void keyscan(); / 鍵盤掃描函數。void dswritebyte(uchar d);/ 往 DS1302 寫入一個字節。uchar dsreadbyte(); /從 DS1302 讀出一個字節。void dswrite(uchar add, uchar dat); / 向 DS1302 的指定地址寫入一個字節uchar dsread(uchar add); /從 DS1302 的指定地址讀出一個字節void init1302time(uchar *pClock); /DS1302 時間初始化函數void init(); /初始化函數void Delay_100us
27、(uint j);/延時100usvoid Delay_10us(void);/延時10usvoid COM(void);void Read_DHT11(void);void delay(uint z) /毫秒級延時函數。uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void di() /蜂鳴器發聲函數。beep=0;delay(100);beep=1;void writecom(uchar com) /液晶寫命令函數。lcdrs=0;/ 置為寫入命令lcddata=com;/ 送入數據delay(1);lcden=1;/ 拉高使能端delay(1);lcde
28、n=0;/ 完成高脈沖void writedata(uchar dat) /液晶寫數據函數。lcdrs=1;/ 置為寫入數據lcddata=dat;/ 送入數據delay(1);lcden=1;delay(1);lcden=0;void writetime(uchar add,uchar dat) / 液晶刷新時分秒。 /3為時的開始位置,6 為分, 9 為秒。uchar shi,ge;shi=dat/10;ge=dat%10;writecom(0x80+0x40+add);writedata(0x30+shi);writedata(0x30+ge);void writenyr(uchar a
29、dd,uchar dat) / 液晶刷新日期。 /0 為年, 3 為月, 6 為日。uchar shi,ge;shi=dat/10;ge=dat%10;writecom(0x80+add);writedata(0x30+shi);writedata(0x30+ge);void writeweek(uchar week) / 液晶星期幾顯示函數。writecom(0x80+9); /從第一行隔十三個字符后開始寫星期switch(week)case 1: writedata(M);writedata(O);writedata(N);break;case 2: writedata(T);writed
30、ata(U);writedata(E);break;case 3: writedata(W);writedata(E);writedata(D);break;case 4: writedata(T);writedata(H);writedata(U);break;case 5: writedata(F);writedata(R);writedata(I);break;case 6: writedata(S);writedata(A);writedata(T);break;case 7: writedata(S);writedata(U);writedata(N);break;void keys
31、can() / 鍵盤掃描函數。if(flagalarm=1)|(flagevent=1) / 如果鬧鐘在響或者有事件提醒,任意鍵停止鬧鐘響或者取消事件提醒if(kmenu=0)|(kup=0)|(kdown=0)|(kalarm=0)|(kevent=0)delay(5);if(kmenu=0)|(kup=0)|(kdown=0)|(kalarm=0)|(kevent=0)while(!(kmenu&kup&kdown&kalarm&kevent);di();flagalarm=0; / 清除鬧鐘標志。flagevent=0; / 清除事件提醒標志。if(kmenu=0) /檢測功能鍵。del
32、ay(5);if(kmenu=0)kmenunum+; / 記錄功能鍵按下次數。if(flagseta=1) / 檢測是否在進行鬧鐘設置。if(kmenunum=4) kmenunum=1; / 因為進行鬧鐘設置時,只調節時分秒,所以, kmenunum 只能等于 1,2,3。if(flagsseta=1) / 檢測是否在進行事件提醒設置。 if(kmenunum=8) kmenunum=5; / 因為進行事件提醒設置時,只調節年月日,所以, kmenunum 只能等于 5,6,7flagset=1; / 設置標志位,表示在進行各種時間設置。while(!kmenu);di();switch(
33、kmenunum) /定位光標閃爍點。case 1: writecom(0x80+0x40+10); / 秒閃爍。writecom(0x0f); / 開光標閃爍。break;case 2: writecom(0x80+0x40+7); / 分閃爍。break;case 3: writecom(0x80+0x40+4); / 時閃爍。break;case 4: writecom(0x80+10); /星期閃爍 .break;case 5: writecom(0x80+7); /日閃爍 .break;case 6: writecom(0x80+4); /月閃爍 .break;case 7: wri
34、tecom(0x80+1); /年閃爍 .break;case 8: kmenunum=0;writecom(0x0c); / 取消光標閃爍。flagset=0; /取消時間調節標志。dswrite(0x8e,0x00); /* 允許寫操作 */dswrite(0x80,second/10*16+second%10); dswrite(0x82,minute/10*16+minute%10); dswrite(0x84,hour/10*16+hour%10);dswrite(0x8a,week/10*16+week%10);dswrite(0x86,day/10*16+day%10);dswr
35、ite(0x88,month/10*16+month%10);dswrite(0x8c,year/10*16+year%10);dswrite(0x8e,0x80); /* 禁止寫操作 */break;if(kmenunum!=0) /只有當功能鍵按下時 ,才檢測增大 ,減小鍵 .if(kup=0)delay(5);if(kup=0)while(!kup);di();switch(kmenunum) /根據功能鍵被按下的次數,調節相應數值。case 1: second+;if(second=60)second=0;writetime(9,second);writecom(0x80+0x40+1
36、0); / 因為,上面送液晶顯示break; /一次 ,光標后移一位 ,所以要將光標復位 .case 2: minute+;if(minute=60)minute=0;writetime(6,minute);writecom(0x80+0x40+7);break;case 3: hour+;if(hour=24)hour=0;writetime(3,hour);writecom(0x80+0x40+4);break;case 4: week+;if(week=8)week=1;writeweek(week);writecom(0x80+11);break;case 5: day+;if(day
37、=32)day=1;writenyr(6,day);writecom(0x80+7);break;case 6: month+;if(month=13)month=1;writenyr(3,month);writecom(0x80+4);break;case 7: year+;if(year=100)year=0;writenyr(0,year);writecom(0x80+1);break;if(kdown=0)delay(5);if(kdown=0)while(!kdown);di();switch(kmenunum) /根據功能鍵被按次數調節相應數值 .case 1: second-;i
38、f(second=-1)second=59;writetime(9,second);writecom(0x80+0x40+10);break;case 2: minute-;if(minute=-1)minute=59;writetime(6,minute);writecom(0x80+0x40+7);break;case 3: hour-;if(hour=-1)hour=23;writetime(3,hour);writecom(0x80+0x40+4);break;case 4: week-;if(week=0)week=7;writeweek(week);writecom(0x80+11
39、);break;case 5: day-;if(day=0)day=31;writenyr(6,day);writecom(0x80+7);break;case 6: month-;if(month=0)month=12;writenyr(3,month);writecom(0x80+4);break;case 7: year-;if(year=-1)year=99;writenyr(0,year);writecom(0x80+1);break;if(kalarm=0) / 檢測鬧鐘調節鍵是否按下,此條if 語句與 if(kmenunum!=0) / 在同一個層次。delay(5);if(ka
40、larm=0)flagseta=flagseta;while(!kalarm);di();if(flagseta=0) /此時,退出鬧鐘設置,保存各相關數值。flagset=0; /清除時間設置標志,在 if(kalarm=0) 這個 if 語句writecom(0x80+0x40)中,不用 flagset=1 這條語句來設置 /flagset 標志位,因為如果進行了鬧鐘時間的設置就會執行前面 if(kmenunum=0) 語句中的 flagset=1 這條語句。writedata( ); / 清除液晶上的 “ Ri鬧鐘調節標志。 ”writedata( );writecom(0x0c); /
41、取消光標閃爍dswrite(0x8e,0x00); /* 允許寫操作 */dswrite(writealarmsecond,second/10*16+second%10); / 往 DS1302 中保存鬧鐘的時分秒值。dswrite(writealarmminute,minute/10*16+minute%10);dswrite(writealarmhour,hour/10*16+hour%10);dswrite(0x8e,0x80); /* 禁止寫操作 */else /進入鬧鐘設置。s=dsread(readalarmsecond)/16*10+dsread(readalarmsecond)
42、%16; /* 讀取DS1302 中保存的鬧鐘時分秒原始值,轉化為十進制數存進 s,m,h 保存,用以后面判斷鬧鐘時間是否到達。*/m=dsread(readalarmminute)/16*10+dsread(readalarmminute)%16;h=dsread(readalarmhour)/16*10+dsread(readalarmhour)%16;second=s; /把鬧鐘時間的十進制數據傳送給變量 second,minute,hour,用以調節其值。minute=m;hour=h;writecom(0x80+0x40);writedata(R); / 液晶顯示鬧鐘調節標志。wri
43、tedata(i);writetime(3,hour); / 送液晶顯示鬧鐘時間。writetime(6,minute);writetime(9,second);if(kevent=0) / 檢測事件提醒調節鍵是否按下,此條 if 語句與 if(kmenunum!=0) / 在同一個層次。delay(5);if(kevent=0)flagsseta=flagsseta;while(!kevent);di();if(flagsseta=0) /此時,退出事件提醒設置,保存各相關數值。flagset=0; /清除時間設置標志,在 if(kevent=0) 這個 if 語句writecom(0x80
44、+9);/ 中,不用 flagset=1 這條語句來設置 /flagset 標志位,因為 ,如果進行了事件提醒時間的設置/,就會執行前面 if(kmenunum=0) 語句中的 flagset=1 這條語句。writedata( ); / 清除液晶上的 “ Ti 事件提醒調節標志。 ”writedata( );writedata( );writecom(0x0c); /取消光標閃爍dswrite(0x8e,0x00); /* 允許寫操作 */dswrite(writeeventyear,year/10*16+year%10); / 往 DS1302 中保存事件提醒的年月日值。dswrite(w
45、riteeventmonth,month/10*16+month%10);dswrite(writeeventday,day/10*16+day%10);dswrite(0x8e,0x80); /* 禁止寫操作 */else /進入事件提醒設置。yy=dsread(readeventyear)/16*10+dsread(readeventyear)%16; /* 讀取DS1302 中保存的事件提醒年月日原始值,轉化為十進制數存進 yy,mm,dd 保存,用以后面判斷事件提醒時間是否到達。*/mm=dsread(readeventmonth)/16*10+dsread(readeventmont
46、h)%16;dd=dsread(readeventday)/16*10+dsread(readeventday)%16;year=yy; /把事件提醒時間的十進制數據傳送給變量 hour,day,month,week用以調節其值。month=mm;day=dd;writecom(0x80+9);writedata(T); / 液晶顯示事件提醒設置標志。writedata(i);writedata( );writenyr(0,year);/ 送液晶顯示事件提醒時間。writenyr(3,month); writenyr(6,day);void dswritebyte(uchar d)/ 往 DS
47、1302 寫入一個字節。uchar i;ACC=d;for(i=8;i0;i-)dsdata=ACC0;dsclk=1; /*為什么這里時鐘先為 1 后為 0,因為 dsclk 初始化為 0,而,每次循環 最后 ,都將其置 0,這樣就形成一個從 0 開始的上升沿 ,恰好滿足 ds1302 寫數據在上升沿, 但是 , 時鐘必須從 0 開始的要求 */ dsclk=0; ACC=ACC1;uchar dsreadbyte() /從 DS1302 讀出一個字節。uchar i;for(i=8;i0;i-)ACC=ACC1;ACC7=dsdata;dsclk=1; / 讀數據也一樣 ,雖然是下降沿 ,但是 ,也要從 0 開始 .這樣設置 dsclk 剛好滿足要求。dsclk=0;return ACC;void dswrite(uchar add,uchar dat) / 向 DS1302 的指定地址寫入一個字節。dsrst=0;dsclk=0;dsrst=1;dswritebyte(add); /* 先寫入地址 ,命令字節 */dswritebyte(dat); /* 再寫 1Byte 數據 */dsclk=1;dsr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 信貸合同模版示例3篇
- 2025端午節主題活動總結參考(18篇)
- 各崗位競聘演講稿精彩開頭范文(5篇)
- 空調器余熱利用系統設計考核試卷
- 2024年合肥長豐縣北城世紀城第一小學招聘教師考試真題
- 防城港市文旅集團有限公司招聘筆試真題2024
- 2024年大連西太平洋石油化工有限公司高校畢業生招聘考試真題
- 羽絨加工中的微生物控制考核試卷
- 2025年辭職報告(20篇)
- 市場部業務員2025年工作總結(5篇)
- DB65-T 4765-2024 農牧區標準化羊場建設規范
- 管理評審報告(完整詳細版)
- 廚房燃料合同協議書
- 攝影攝像知識競賽考試題庫500題(含答案)
- YY-T 0950-2015 氣壓彈道式體外壓力波治療設備
- GB/T 44218-2024微型揚聲器測量方法
- (正式版)JB∕T 14666-2024 鋼質汽車轉向節臂鍛件 工藝規范
- AQ/T 9009-2015 生產安全事故應急演練評估規范(正式版)
- 《無人機測繪技能訓練模塊》課件-模塊7:無人機航測影像獲取
- 人工髖關節置換隨訪資料庫模板
- (完整版)12123交管學法減分考試題及答案
評論
0/150
提交評論