基于51單片機(jī)的萬年歷的設(shè)計(jì)_第1頁
基于51單片機(jī)的萬年歷的設(shè)計(jì)_第2頁
基于51單片機(jī)的萬年歷的設(shè)計(jì)_第3頁
基于51單片機(jī)的萬年歷的設(shè)計(jì)_第4頁
基于51單片機(jī)的萬年歷的設(shè)計(jì)_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、單片機(jī)課程實(shí)訓(xùn)SCMPRACTICALTRAINING實(shí)訓(xùn)設(shè)計(jì)題目TitleOfTraining萬年歷的設(shè)計(jì)分院(系別)Department專業(yè)Speciality設(shè)計(jì)作者Author組別Team班級(jí)Class完成日期Date指導(dǎo)教師Advisor第一部分課程設(shè)計(jì)任務(wù)書0一、課程設(shè)計(jì)題目0二、課程設(shè)計(jì)時(shí)間0三、實(shí)訓(xùn)提交方式0四、設(shè)計(jì)要求0第二部分課程設(shè)計(jì)報(bào)告1一、單片機(jī)發(fā)展概況1二、MCS-51單片機(jī)系統(tǒng)簡(jiǎn)介.1231. 總體設(shè)計(jì)32. 晶振電路33. 復(fù)位電路44. DS1302時(shí)鐘電路45. 溫度采集系統(tǒng)電路56. 按鍵調(diào)整電路67. 鬧鐘提示電路6五、軟件設(shè)計(jì)框圖7六、程序源代碼91.

2、主程序92. 溫度控制程序153. 日歷設(shè)置程序184. 時(shí)鐘控制程序275. 顯示設(shè)置程序32七、結(jié)束語38八、課程設(shè)計(jì)小組分工38九、參考文獻(xiàn)38第一部分課程設(shè)計(jì)任務(wù)書一、課程設(shè)計(jì)題目用中小規(guī)模集成芯片設(shè)計(jì)制作萬年歷。二、課程設(shè)計(jì)時(shí)間五天三、實(shí)訓(xùn)提交方式提交實(shí)訓(xùn)設(shè)計(jì)報(bào)告電子版與紙質(zhì)版四、設(shè)計(jì)要求( 1)顯示年、月、日、時(shí)、分、秒和星期,并有相應(yīng)的農(nóng)歷顯示。( 2)可通過鍵盤自動(dòng)調(diào)整時(shí)間。( 3)具有鬧鐘功能。( 4)能夠顯示環(huán)境溫度,誤差小于±15)計(jì)時(shí)精度:月誤差小于20秒。第二部分課程設(shè)計(jì)報(bào)告一、單片機(jī)發(fā)展概況單片機(jī)誕生于20世紀(jì)70年代末,它的發(fā)展史大致可分為三個(gè)階段:第一

3、階段(1976-1978):初級(jí)單片機(jī)微處理階段。該時(shí)期的單片機(jī)具有8位CPU,并行I/O端口、8位時(shí)序同步計(jì)數(shù)器,尋址范圍4KB,但是沒有串行口。第二階段(1978-1982):高性能單片機(jī)微機(jī)處理階段,該時(shí)期的單片機(jī)具有I/O串行端口,有多級(jí)中斷處理系統(tǒng),15位時(shí)序同步技術(shù)器,RAM、ROM容量加大,尋址范圍可達(dá)64KB。第三階段(1982-至今)位單片機(jī)微處理改良型及16位單片機(jī)微處理階段民用電子產(chǎn)品、計(jì)算機(jī)系統(tǒng)中的部件控制器、智能儀器儀表、工業(yè)測(cè)控、網(wǎng)絡(luò)與通信的職能接口、軍工領(lǐng)域、辦公自動(dòng)化、集散控制系統(tǒng)、并行多機(jī)處理系統(tǒng)和局域網(wǎng)絡(luò)系統(tǒng)。二、MCS-51單片機(jī)系統(tǒng)簡(jiǎn)介MCS-51系列單

4、片機(jī)產(chǎn)品都是以Intel公司最早的典型產(chǎn)品8051為核心構(gòu)成的。MCS-51單片機(jī)由CPU、RAM、ROM、I/O接口、定時(shí)器/計(jì)數(shù)器、中斷系統(tǒng)、內(nèi)部總線等部件組成。8051單片機(jī)的基本性能有:8 位CPU;布爾代數(shù)處理器,具有位尋址能力;128B內(nèi)部RAM,21個(gè)專用寄存器;4KB內(nèi)部掩膜ROM;2個(gè)16位可編程二進(jìn)制加1定時(shí)器/計(jì)數(shù)器;32個(gè)(4X8位)雙向可獨(dú)立尋址的I/O口;1個(gè)全雙工UART(異步串行通信口);9 個(gè)中斷源,兩級(jí)中斷結(jié)構(gòu);片內(nèi)振蕩器及時(shí)鐘電路,晶振頻率為1.2MHz12MHz;外部程序/數(shù)據(jù)存儲(chǔ)器尋址空間均為64KB;111條指令,大部分為單字節(jié)指令;單一+5V電源供

5、電,雙列直插40引腳DIP封裝。三、設(shè)計(jì)思想整體設(shè)計(jì)以單片機(jī)技術(shù)為核心,采用C語言進(jìn)行軟件設(shè)計(jì),增加了程序的可讀性和可移植性,為了便于擴(kuò)展和更改,軟件的設(shè)計(jì)采用模塊化結(jié)構(gòu)。程序先向LCD更新時(shí)鐘芯片的時(shí)間與溫度傳感器的時(shí)間,然后進(jìn)行初始化工作。程序由一個(gè)主函數(shù),兩個(gè)定時(shí)器中斷程序,一個(gè)時(shí)鐘設(shè)置子程序,一個(gè)農(nóng)歷設(shè)置子程序,一個(gè)溫度設(shè)置子程序,一個(gè)延時(shí)子程序,一個(gè)調(diào)時(shí)子程序,一個(gè)顯示子程序構(gòu)成。程序通過按鍵掃描程序來確定是否調(diào)用中斷程序來對(duì)時(shí)間進(jìn)行調(diào)整。用一子程序完成時(shí)分的調(diào)整,通過循環(huán)掃描四個(gè)按鍵的電平變化來判斷對(duì)應(yīng)按鍵是否按下,并帶有去抖動(dòng)功能,四個(gè)按鍵分別有增加,減小,退出與功能選擇的作用。

6、通過功能選擇時(shí)鐘設(shè)置與鬧鐘設(shè)置,使用加或減按鍵進(jìn)行預(yù)置,完成后可點(diǎn)退出鍵完成操作??煞譃橐韵聨讉€(gè)功能模塊:1)主程序:定時(shí)器中斷初始化、時(shí)鐘與溫度更新程序與鍵盤監(jiān)控。2)計(jì)時(shí):為定時(shí)器中斷服務(wù)子程序,完成刷新計(jì)時(shí)緩沖區(qū)的功能。3)農(nóng)歷:由陰歷換算對(duì)照表得出陽歷并顯示。4)鬧鐘:采用定時(shí)器中斷方式實(shí)現(xiàn)鬧鐘與整點(diǎn)報(bào)時(shí)。5) 溫度:由溫度傳感器將溫度傳送到LCD顯示。6)設(shè)置:由按鍵設(shè)置鬧鐘時(shí)間或時(shí)鐘時(shí)間。7)鍵盤掃描:判斷是否有鍵按下,并確定鍵號(hào)。8)LCD顯示:完成8位動(dòng)態(tài)顯示。編輯版 word四、硬件電路設(shè)計(jì)1.總體設(shè)計(jì)系統(tǒng)包括單片機(jī)主控模塊,溫度傳感器采集模塊,日歷時(shí)鐘模塊,按鍵調(diào)整模塊,蜂

7、鳴器模塊,鬧鐘模塊。如圖1所示為系統(tǒng)設(shè)計(jì)圖。日歷時(shí)鐘芯片DS1302溫度傳感器DS18B20AT89C單片才51幾按鍵調(diào)整電路蜂鳴器鬧鐘LCD12864圖1系統(tǒng)設(shè)計(jì)圖71*如圖2所示為系統(tǒng)仿真圖。圖2系統(tǒng)仿真圖2.晶振電路如圖3所示,51單片機(jī)的內(nèi)部有一個(gè)用于構(gòu)成振蕩器的高增益反相放大器,它的輸入端為XTAL1引腳,輸出端為XTAL2引腳,兩個(gè)跨接石英晶體及兩個(gè)電編輯版word容就可以構(gòu)成穩(wěn)定的自激振蕩器。電容器通常取30pF左右圖4復(fù)位電路3 .復(fù)位電路往單片機(jī)的復(fù)位引腳上輸入24個(gè)時(shí)鐘周期以上的高電平,即執(zhí)行復(fù)位操作。按鍵復(fù)位是指系統(tǒng)在運(yùn)行時(shí),按下一個(gè)開關(guān),就能在RST引腳產(chǎn)生一段時(shí)間的高

8、電平,使系統(tǒng)復(fù)位,常見的按鍵復(fù)位電路如圖4所示。對(duì)12MHz晶振頻率而言,電路中C取10pF,R取1KQ。4 .DS1302時(shí)鐘電路DS1302是一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘電路,它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.5V5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。DS1302內(nèi)部有一個(gè)31X8的用于臨時(shí)性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級(jí)產(chǎn)品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時(shí)提供了對(duì)后背電源進(jìn)行涓細(xì)電流充電的能力。圖5示出DS1302的引

9、腳排列,其中Vcc1為后備電源,Vcc2為主電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時(shí),Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時(shí),DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768KHz晶振。RST是復(fù)位/片選線,通過把RST輸入驅(qū)動(dòng)置高電平來啟動(dòng)所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)行操作。如果在傳送

10、過程中RSTS置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電動(dòng)行時(shí),在Vcc大于等于2.5V之前,RST必須保持低電平。中有在SCLK為低電平時(shí),才能將RST置為高電平,I/O為串行數(shù)據(jù)輸入端(雙向)。SCLK始終是輸入端。圖5DS1302時(shí)鐘芯片5.溫度采集系統(tǒng)電路在本萬年歷當(dāng)中溫度的采集采用數(shù)字溫度傳感器DS18B2Q它屬于單總線器件,具有線路簡(jiǎn)單,體積小的特點(diǎn)。因此用它來組成一個(gè)測(cè)溫系統(tǒng),具有線路簡(jiǎn)單,在一根通信線,可以掛很多這樣的數(shù)字溫度計(jì),十分方便。具有如下的經(jīng)濟(jì)特點(diǎn):(1)只要求一個(gè)端口即可實(shí)現(xiàn)通信。(2)在DS18B20中的每個(gè)器件上都有獨(dú)一無二的序列號(hào)。(3)實(shí)際

11、應(yīng)用中不需要外部任何元器件即可實(shí)現(xiàn)測(cè)溫。(4)測(cè)量溫度范圍在55。C到+12SC之間。(5)數(shù)字溫度計(jì)的分辨率用戶可以從9位到12位選擇。(6)內(nèi)部有溫度上、下限告警設(shè)置。如圖6所示cBUZ6.按鍵調(diào)整電路按鍵采用4個(gè)獨(dú)立的按鍵,一個(gè)功能鍵、一個(gè)退出鍵、一個(gè)加按鍵、一個(gè)減按鍵通過這四個(gè)按鍵可以來合理的設(shè)置時(shí)鐘的調(diào)整和鬧鈴的設(shè)置等。如圖7所示與51單片機(jī)的P0.0P0.3的連接示意圖圖7按鍵調(diào)整電路7.鬧鐘提示電路當(dāng)?shù)竭_(dá)整點(diǎn)時(shí)或者當(dāng)前的時(shí)間等于51單片機(jī)中設(shè)置鬧鐘時(shí)間時(shí)蜂鳴器便會(huì)發(fā)出聲音進(jìn)行提示。與單片機(jī) P0.5引腳的連接電路如圖8所示8. LCD顯示電路在本萬年歷當(dāng)中12864液晶顯示當(dāng)前的

12、實(shí)時(shí)時(shí)間重要的陰陽歷節(jié)日等功能12864液晶具有如下的特性:LCD1圖8鬧鐘提示電路圖9 LCD顯示電路3/Arin T 4ZAI>4 .E>/AUS .B/ADG.rv< QiIk PNF1)提供8位,4位并行接口及串行接口可選2)并行接口適配M6800時(shí)序3)自動(dòng)電源啟動(dòng)復(fù)位功能4)內(nèi)部自建振蕩源64X16位字符顯示RAM(DDRAM最多16字符X4行,LCD顯示范圍16X2行)(改為半角輸入)2M位中文字型ROM(CGROM),總共提供8192個(gè)中文字型(16X16點(diǎn)陣)16K位半寬字型ROM(HCGROM),總共提供126個(gè)西文字型(16X8點(diǎn)陣)64X16位字符產(chǎn)生

13、RAM(CGRAM)15X16位總共240點(diǎn)的ICONRAM(ICONRAM)其與單片機(jī)的連接電路如圖9所示。五、軟件設(shè)計(jì)框圖1.主程序流程圖:編輯版 word編輯版word2.陰陽歷轉(zhuǎn)換流程圖:+置陽歷忠天數(shù)六、程序源代碼1.主程序#include<reg52.h>#include<nongli.h>#include<Icd.h>#include<shezhi.h>#include<time.h>#include<wendu.h>#include<key.h>#defineucharunsignedchar#

14、defineuintunsignedint/*sbitbell=P2A0;/定義蜂鳴器端口/*定時(shí)器設(shè)置整點(diǎn)報(bào)時(shí)*/voidTimer0_Service()interrupt1staticucharcount=0;staticucharflag=0;/記錄鳴叫的次數(shù)count=0;TR0=0;/關(guān)閉Timer0TH0=0x3c;TL0=0XB0;/延時(shí)50msTR0=1;/啟動(dòng)Timer0count+;if(count=20)/鳴叫1秒bell=bell;count=0;flag+;編輯版 wordif(flag=6)flag=0;TR0=0;/關(guān)閉Timer0/*整點(diǎn)報(bào)時(shí)一分鐘*/uchar

15、HexNum_Convert(ucharHexNum)將16進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)ucharNumtemp;Numtemp=(HexNum>>4)*10+(HexNum&0X0F);returnNumtemp;/*函數(shù)名稱:main()功能:入口參數(shù):出口參數(shù):*/voidmain(void)/ 定義時(shí)ucharclock_time6=0X00,0X59,0X23,0X09,0X04,0X11;間變量秒分時(shí)日月年ucharalarm_time2=10,06;/鬧鐘設(shè)置alarm_time0:分鐘alarm_time1小時(shí):uchartemperature2;/定義溫度變量te

16、mperature0低8位temperature1高8位Lcd_Initial();/LCD初始化Clock_Fresh(clock_time);/時(shí)間刷新Clock_Initial(clock_time);/時(shí)鐘初試化/*中斷初始化*/EA=1;/開總中斷ET0=1;/Timer0開中斷ET2=1;/Timer2開中斷TMOD=0x01;/Timer0工作方式1RCAP2H=0x3c;RCAP2L=0xb0;/Timer2延時(shí)50mswhile(1)switch(Key_Scan()/按鍵掃描caseup_array:Key_Idle();/檢測(cè)按鍵松開break;casedown_arra

17、y:Key_Idle();/檢測(cè)按鍵松開break;caseclear_array:Key_Idle();/檢測(cè)按鍵松開break;casefunction_array:Key_Function(clock_time,alarm_time);casenull:Clock_Fresh(clock_time);/時(shí)間刷新Lcd_Clock(clock_time);/時(shí)間顯示Sensor_Fresh(temperature);溫度更新/Lcd_Temperture(temperature);/溫度顯示Calendar_Convert(0,clock_time);Week_Convert(0,cloc

18、k_time);/整點(diǎn)報(bào)時(shí)if(*clock_time=0x59)&&(*(clock_time+1)=0x59)bell=0;TR2=1;/啟動(dòng)Timer2/鬧鐘報(bào)警if(*alarm_time=HexNum_Convert(*(clock_time+1)/分鐘相吻if(*(alarm_time+1)=HexNum_Convert(*(clock_time+2)/小時(shí)相吻合bell=0;TR2=1;/啟動(dòng)Timer2break;2.溫度控制程序#ifndef_SENSOR#define_SENSOR#defineucharunsignedchar#defineuintunsi

19、gnedint/*DS18B20管腳配置*/sbitdq=P2A1;/*DS18B20件延時(shí)專用*/voidSensor_Delay(ucharcount)施時(shí)函數(shù)while(count-);/*從DS18B20讀一個(gè)字節(jié)*/ucharSensor_Read_Byte(void)uchari=0;uchartemp=0;for(i=8;i>0;i-)dq=0;/給脈沖信號(hào)temp>>=1;dq=1;/給脈沖信號(hào)if(dq)temp|=0x80;Sensor_Delay(20);return(temp);DS18B20/*寫一個(gè)字節(jié)*/voidSensor_Write_Byte

20、(uchartemp)uchari=0;for(i=8;i>0;i-)dq=0;dq=temp&0x01;Sensor_Delay(20);dq=1;temp>>=1;/*DS18B20初始化*/uchar Sensor_Initial(void)uchar i = 0;dq = 1;Sensor_Delay(1);dq = 0;Sensor_Delay(100);dq = 1;Sensor_Delay(6);i = dq;若 x=1 則初始化失敗Sensor_Delay(130);return (i);/ DQ 復(fù)位/ 稍做延時(shí)/ 單片機(jī)將 DQ 拉低/ 精確延時(shí),

21、大于480us/ 拉高總線/ 稍做延時(shí)后/ 若 x=0 則初始化成功,*/*讀取并顯示溫度*voidSensor_Fresh(uchar*temperature)Sensor_Initial();/ 跳過讀序號(hào)列號(hào)的操作/ 啟動(dòng)溫度轉(zhuǎn)換/ 跳過讀序號(hào)列號(hào)的操作/ 讀取溫度寄存器/ 低位/ 高位Sensor_Write_Byte(0xCC);Sensor_Write_Byte(0x44);Sensor_Initial();Sensor_Write_Byte(0xCC);Sensor_Write_Byte(0xBE);temperature0=Sensor_Read_Byte();temperat

22、ure1=Sensor_Read_Byte();#endif3. 日歷設(shè)置程序#ifndef_SUN_MOON#define_SUN_MOON/*/#defineucharunsignedchar#defineuintunsignedint#include<shezhi.h>#include<lcd.h>/* 功能:讀取數(shù)據(jù)表中農(nóng)歷的大月或小月,如果大月返回1,小月返回0*bitget_moon_day(ucharmonth_p,uintcalendar_address)uchartemp,temp1;temp1=(month_p+3)/8;temp=0x80>&

23、gt;(month_p+3)%8);temp=year_codecalendar_address+temp1&temp;if(temp=0)return(0);elsereturn(1);/* 功能:輸入BCD的陽歷數(shù)據(jù),輸出BCD陰歷數(shù)據(jù)(1901-2099)c_flag陽歷的世紀(jì)標(biāo)志clock_time:時(shí)鐘地址* 說明:c_flag=0:21世紀(jì)c_flag=1:19世紀(jì)*/voidCalendar_Convert(ucharc_flag,uchar*clock_time)bitflag_month,flag_year;ucharyear,month,day,month_poin

24、t;/定義/年月天uchartemp1,temp2,temp3;uintcalendar_address;/定義農(nóng)歷地址/uintday_number;ucharclock_moon3;/定義陰歷clock_time+=3;/指向日day=(*clock_time>>4)*10+(*clock_time&0x0f);/BCD轉(zhuǎn)換十進(jìn)制clock_time+;/指向月month=(*clock_time>>4)*10+(*clock_time&0x0f);/BCD轉(zhuǎn)換十進(jìn)制clock_time+;/指向年year=(*clock_time>>4

25、)*10+(*clock_time&0x0f);/BCD轉(zhuǎn)換十進(jìn)制/定位日歷地址if(c_flag=0)calendar_address=(year+99)*3;elsecalendar_address=(year-1)*3;/春節(jié)(正月初一)所在的陽歷月份temp1=year_codecalendar_address+2&0x60;/Bit6Bit5:春節(jié)所在的陽歷月份temp1>>=5;/春節(jié)(正月初一)所在的陽歷日期temp2=year_codecalendar_address+2&0x1f;/Bit4Bit0#節(jié)所在的陽歷日期/計(jì)算春節(jié)(正月初一)離

26、當(dāng)年元旦1月1日(陽歷)的天數(shù);春節(jié)只會(huì)在陽歷1月或2月/*if(temp1=1)temp3=temp2-1;elsetemp3=temp2+31-1;*/temp3=temp2-1;if(temp1!=1)temp3+=0x1f;/計(jì)算陽歷月離當(dāng)年元旦1月1日(陽歷)的天數(shù)if(month<10)day_number=day_code1month-1+day;elseday_number=day_code2month-10+day;/如果陽歷的月大于2且該年的2月為閏月,天數(shù)加1/閏年指的就是陽歷有閏日或陰歷有閏月的一年;/陽歷四年一閏,在二月加一天,這一天叫做閏日:/農(nóng)歷三年一閏,五

27、年兩閏,十九年七閏,每逢閏年所加的一個(gè)月叫做閏月。if(month<=2)|(year%0x04!=0)day_number-=1;/day_number+;/if(month<2)|(year%0x04!=0)/day_number-=1;/判斷陽歷日在春節(jié)(正月初一)之前還是之后if(day_number>=temp3)/陽歷在春節(jié)之后或者春節(jié)當(dāng)日day_number-=temp3;month=1;month_point=1;/month_point為月份指向,陽歷日在春季前就是春季flag_month=get_moon_day(month_point,calendar_

28、address);/檢查該陰歷月的大小大月返回1小月返回0flag_year=0;/*if(flag_month)temp1=30;/大月30天elsetemp1=29;/小月29天*/if(flag_month=0)temp1=29;elsetemp1=30;/閏月所在的月分temp2=year_codecalendar_address&0xf0;temp2>>=4;/提取高四位假如是0表示沒有閏月while(day_number>=temp1)day_number-=temp1;month_point+;if(month=temp2)flag_year=flag_

29、year;if(flag_year=0)month+=1;elsemonth+;flag_month=get_moon_day(month_point,calendar_address);if(flag_month)temp1=30;elsetemp1=29;day=day_number+1;else/陽歷在春節(jié)之前使用以下代碼進(jìn)行運(yùn)算temp3-=day_number;if(year=0)year=0xe3;c_flag=1;elseyear-=1;calendar_address-=3;month=0xc;temp2=year_codecalendar_address&0xf0;t

30、emp2>>=4;/提取高4位flag_year=0;if(temp2=0)month_point=12;elsemonth_point=13;/flag_year=0;flag_month=get_moon_day(month_point,calendar_address);if(flag_month)temp1=30;elsetemp1=29;while(temp3>temp1)temp3-=temp1;month_point-;if(flag_year=0)month-=1;if(month=temp2)flag_year=flag_year;flag_month=ge

31、t_moon_day(month_point,calendar_address);if(flag_month)temp1=0x1e;elsetemp1=0x1d;day=temp1-temp3+1;/HEX->BCD,運(yùn)算結(jié)束后,把數(shù)據(jù)轉(zhuǎn)換為BCD數(shù)據(jù)temp1=year/10;temp1<<=4;clock_moon2=temp1|(year%10);temp1=month/10;temp1<<=4;clock_moon1=temp1|(month%10);temp1=day/10;temp1<<=4;clock_moon0=temp1|(day%1

32、0);Lcd_Lunar_Calendar(clock_moon);/*算法:(日期+年份+所過閏年+月校正)/7的余數(shù)就是星期如果是閏年又不到3月份上述之和要減一天再*/voidWeek_Convert(bitc,uchar*clock_time)ucharyear,month,day;/定義/年月天uchartemp;clock_time+=3;/指向日day=(*clock_time>>4)*10+(*clock_time&0x0f);/BCD轉(zhuǎn)換十進(jìn)制clock_time+;/指向月month=(*clock_time>>4)*10+(*clock_ti

33、me&0x0f);clock_time+;/指向年year=(*clock_time>>4)*10+(*clock_time&0x0f);if(c=0)/如果為21世紀(jì),年份數(shù)加100year+=100;temp=year/4;/所過閏年數(shù)只算1900年之后的temp=year+temp;temp=temp%0x07;為節(jié)省資源,先進(jìn)行一次取余,避免數(shù)大于0xff,避免使用整型數(shù)據(jù)temp=temp+day+table_weekmonth-1;if(year%4=0)&&(month<3)temp-=1;Lcd_Week(temp%7);/*/

34、#endif4. 時(shí)鐘控制程序#ifndef_REAL_TIMER_DS1302#defineREALTIMERDS1302/*預(yù)定義*/#defineucharunsignedchar管腳配置#defineuintunsignedint/*DS1302*/sbitclock_rst=P2A4;sbitclock_io=P2A3;sbitclock_sclk=P2A2;/*為了編程方便定義的位變量*/sbitACC0=ACCA0;sbitACC7=ACCA7;#definesecondaddress0x80#defineminute_address0x82#definehour_address

35、0x84#defineday_address0x86#definemonth_address0x88#defineyear_address0x8C/* 功能:向時(shí)鐘DS1302寫入一個(gè)字節(jié)*/voidClock_Write_Byte(uchartemp)uchari;ACC=temp;for(i=8;i>0;i-)clock_io=ACC0;/相當(dāng)于匯編中的RRCclock_sclk=1;clock_sclk=0;ACC=ACC>>1;/* 功能:從時(shí)鐘DS1302讀取一個(gè)字節(jié)*ucharClock_Read_Byte(void)uchari;for(i=8;i>0;i

36、-)ACC = ACC >>1;/ 相當(dāng)于匯編中的 RRCACC7=clock_io;clock_sclk=1;clock_sclk=0;return(ACC);/* 功能:向時(shí)鐘DS1302寫入一個(gè)時(shí)間*/voidClock_Write_Time(ucharaddress,uchartemp)clock_sclk=0;clock_rst=0;clock_rst=1;Clock_Write_Byte(address);Clock_Write_Byte(temp);clock_rst=0;clock_sclk=1;*功能:從時(shí)鐘DS1302讀出一個(gè)時(shí)間*ucharClock_Read

37、_Time(ucharaddress)uchartemp=0;clock_sclk=0;clock_rst=0;clock_rst=1;Clock_Write_Byte(address|0x01);temp=Clock_Read_Byte();clock_rst=0;clock_sclk=1;return(temp);*功能:時(shí)鐘初始化*voidClock_Initial(uchar*clock_time)Clock_Write_Time(0x8e,0x00);/WP=0寫操作*clock_time&=0x7f;/最高位為0時(shí)鐘芯片工作Clock_Write_Time(second_a

38、ddress,*clock_time);/秒clock_time+;Clock_Write_Time(minute_address,*clock_time);/分clock_time+;Clock_Write_Time(hour_address,*clock_time);/時(shí)clock_time+;Clock_Write_Time(day_address,*clock_time);/日clock_time+;Clock_Write_Time(month_address,*clock_time);/月clock_time+;Clock_Write_Time(year_address,*clock

39、_time);/年Clock_Write_Time(0x8e,0x80);/WP=1寫保護(hù)/*能:從時(shí)鐘DS1302讀出時(shí)間*/*voidClock_Fresh(uchar*clock_time)* clock_time=Clock_Read_Time(second_address)/;/讀秒clock_time+;* clock_time=Clock_Read_Time(minute_address);讀分/clock_time+;* clock_time=Clock_Read_Time(hour_address);讀時(shí)/clock_time+;* clock_time=Clock_Read_Time(day_address);讀日/clock_time+;* clock_time=Clock_Read_Time(month_address);/讀月/clock_time+;*cloc

溫馨提示

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

評(píng)論

0/150

提交評(píng)論