九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

基于51單片機的萬年歷的設(shè)計.doc

  • 資源ID:6682727       資源大?。?span id="24d9guoke414" class="font-tahoma">242KB        全文頁數(shù):27頁
  • 資源格式: DOC        下載積分:9.9積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要9.9積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復(fù)下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

基于51單片機的萬年歷的設(shè)計.doc

單片機課程實訓(xùn)SCM PRACTICAL TRAINING實訓(xùn)設(shè)計題目Title Of Training 萬年歷的設(shè)計 分院(系別)Department 專業(yè)Speciality 班 級Class 設(shè)計作者Author 完成日期Date 組 別Team 指導(dǎo)教師Advisor 目 錄第一部分 課程設(shè)計任務(wù)書1一、課程設(shè)計題目1二、課程設(shè)計時間1三、實訓(xùn)提交方式1四、設(shè)計要求1第二部分 課程設(shè)計報告2一、單片機發(fā)展概況2二、MCS-51單片機系統(tǒng)簡介2三、設(shè)計思想3四、硬件電路設(shè)計31. 總體設(shè)計32. 晶振電路43. 復(fù)位電路44. DS1302時鐘電路55. 溫度采集系統(tǒng)電路56. 按鍵調(diào)整電路67. 鬧鐘提示電路6五、軟件設(shè)計框圖7六、程序源代碼81. 主程序82. 溫度控制程序113. 日歷設(shè)置程序134. 時鐘控制程序185. 顯示設(shè)置程序20七、結(jié)束語23八、課程設(shè)計小組分工24九、參考文獻24第一部分 課程設(shè)計任務(wù)書一、課程設(shè)計題目用中小規(guī)模集成芯片設(shè)計制作萬年歷。二、課程設(shè)計時間五天三、實訓(xùn)提交方式提交實訓(xùn)設(shè)計報告電子版與紙質(zhì)版四、設(shè)計要求(1)顯示年、月、日、時、分、秒和星期,并有相應(yīng)的農(nóng)歷顯示。(2)可通過鍵盤自動調(diào)整時間。 (3)具有鬧鐘功能。 (4)能夠顯示環(huán)境溫度,誤差小于1 (5)計時精度:月誤差小于20秒。 第二部分 課程設(shè)計報告一、單片機發(fā)展概況單片機誕生于20世紀70年代末,它的發(fā)展史大致可分為三個階段: 第一階段(1976-1978):初級單片機微處理階段。該時期的單片機具有 8 位CPU,并行 I/O 端口、8 位時序同步計數(shù)器,尋址范圍 4KB,但是沒有串行口。 第二階段(1978-1982):高性能單片機微機處理階段,該時期的單片機具有I/O 串行端口,有多級中斷處理系統(tǒng),15 位時序同步技術(shù)器,RAM、ROM 容量加大,尋址范圍可達 64KB。 第三階段(1982-至今)位單片機微處理改良型及 16 位單片機微處理階段民用電子產(chǎn)品、計算機系統(tǒng)中的部件控制器、智能儀器儀表、工業(yè)測控、網(wǎng)絡(luò)與通信的職能接口、軍工領(lǐng)域、辦公自動化、集散控制系統(tǒng)、并行多機處理系統(tǒng)和局域網(wǎng)絡(luò)系統(tǒng)。 二、MCS-51單片機系統(tǒng)簡介 MCS-51系列單片機產(chǎn)品都是以Intel公司最早的典型產(chǎn)品8051為核心構(gòu)成的。MCS-51單片機由CPU 、RAM 、ROM 、I/O接口、定時器/計數(shù)器、中斷系統(tǒng)、內(nèi)部總線等部件組成。8051單片機的基本性能有:u 8位CPU;u 布爾代數(shù)處理器,具有位尋址能力;u 128B內(nèi)部RAM,21個專用寄存器;u 4KB內(nèi)部掩膜ROM;u 2個16位可編程二進制加1定時器/計數(shù)器;u 32個(48位)雙向可獨立尋址的I/O口;u 1個全雙工UART(異步串行通信口);u 5個中斷源,兩級中斷結(jié)構(gòu) ;u 片內(nèi)振蕩器及時鐘電路 ,晶振頻率為1.2MHz12MHz;u 外部程序/數(shù)據(jù)存儲器尋址空間均為64KB;u 111條指令,大部分為單字節(jié)指令;u 單一+5V電源供電,雙列直插40引腳DIP封裝。三、設(shè)計思想 整體設(shè)計以單片機技術(shù)為核心,采用C語言進行軟件設(shè)計,增加了程序的可讀性和可移植性,為了便于擴展和更改,軟件的設(shè)計采用模塊化結(jié)構(gòu)。程序先向LCD更新時鐘芯片的時間與溫度傳感器的時間,然后進行初始化工作。程序由一個主函數(shù),兩個定時器中斷程序,一個時鐘設(shè)置子程序,一個農(nóng)歷設(shè)置子程序,一個溫度設(shè)置子程序,一個延時子程序,一個調(diào)時子程序,一個顯示子程序構(gòu)成。程序通過按鍵掃描程序來確定是否調(diào)用中斷程序來對時間進行調(diào)整。用一子程序完成時分的調(diào)整,通過循環(huán)掃描四個按鍵的電平變化來判斷對應(yīng)按鍵是否按下,并帶有去抖動功能,四個按鍵分別有增加,減小,退出與功能選擇的作用。通過功能選擇時鐘設(shè)置與鬧鐘設(shè)置,使用加或減按鍵進行預(yù)置,完成后可點退出鍵完成操作??煞譃橐韵聨讉€功能模塊:1)主程序:定時器中斷初始化、時鐘與溫度更新程序與鍵盤監(jiān)控。2)計時:為定時器中斷服務(wù)子程序,完成刷新計時緩沖區(qū)的功能。3)農(nóng)歷:由陰歷換算對照表得出陽歷并顯示。4)鬧鐘:采用定時器中斷方式實現(xiàn)鬧鐘與整點報時。5) 溫度:由溫度傳感器將溫度傳送到LCD顯示。6)設(shè)置:由按鍵設(shè)置鬧鐘時間或時鐘時間。7)鍵盤掃描:判斷是否有鍵按下,并確定鍵號。 8)LCD顯示:完成8位動態(tài)顯示。四、硬件電路設(shè)計1. 總體設(shè)計 系統(tǒng)包括單片機主控模塊,溫度傳感器采集模塊,日歷時鐘模塊,按鍵調(diào)整模塊,蜂鳴器模塊,鬧鐘模塊。如圖1所示為系統(tǒng)設(shè)計圖。 日歷時鐘芯片 DS1302 按鍵調(diào)整 電路 AT89C51 單片機溫度傳感器 DS18B20LCD12864蜂鳴器鬧鐘圖1 系統(tǒng)設(shè)計圖如圖2所示為系統(tǒng)仿真圖。圖2 系統(tǒng)仿真圖2. 晶振電路 如圖3所示,51單片機的內(nèi)部有一個用于構(gòu)成振蕩器的高增益反相放大器,它的輸入端為XTAL1引腳,輸出端為XTAL2引腳,兩個跨接石英晶體及兩個電容就可以構(gòu)成穩(wěn)定的自激振蕩器。電容器通常取30pF左右。 圖3 晶振電路 圖4 復(fù)位電路3. 復(fù)位電路 往單片機的復(fù)位引腳上輸入24個時鐘周期以上的高電平,即執(zhí)行復(fù)位操作。按鍵復(fù)位是指系統(tǒng)在運行時,按下一個開關(guān),就能在RST引腳產(chǎn)生一段時間的高電平,使系統(tǒng)復(fù)位,常見的按鍵復(fù)位電路如圖4所示。對12MHz晶振頻率而言,電路中C取10pF,R取1K。4. DS1302時鐘電路DS1302是一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、 時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個318的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產(chǎn)品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時提供了對后背電源進行涓細電流充電的能力。圖5示出DS1302的引腳排列,其中Vcc1為后備電源,Vcc2為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。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進行操作。如果在傳送過程中RSTS置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電動行時,在Vcc大于等于2.5V之前,RST必須保持低電平。中有在SCLK為低電平時,才能將RST置為高電平,I/O為串行數(shù)據(jù)輸入端(雙向)。SCLK始終是輸入端。 圖5 DS1302時鐘芯片 圖6 溫度采集系統(tǒng)電路5. 溫度采集系統(tǒng)電路 在本萬年歷當(dāng)中溫度的采集采用數(shù)字溫度傳感器DS18B20。它屬于單總線器件,具有線路簡單,體積小的特點。因此用它來組成一個測溫系統(tǒng),具有線路簡單,在一根通信線,可以掛很多這樣的數(shù)字溫度計,十分方便。 具有如下的經(jīng)濟特點:(1)只要求一個端口即可實現(xiàn)通信。(2)在DS18B20中的每個器件上都有獨一無二的序列號。(3)實際應(yīng)用中不需要外部任何元器件即可實現(xiàn)測溫。(4)測量溫度范圍在55。C到125。C之間。(5)數(shù)字溫度計的分辨率用戶可以從9位到12位選擇。(6)內(nèi)部有溫度上、下限告警設(shè)置。如圖6所示。6. 按鍵調(diào)整電路 按鍵采用4個獨立的按鍵,一個功能鍵、一個退出鍵、一個加按鍵、一個減按鍵通過這四個按鍵可以來合理的設(shè)置時鐘的調(diào)整和鬧鈴的設(shè)置等。如圖7所示與51單片機的P0.0P0.3的連接示意圖。圖7 按鍵調(diào)整電路7. 鬧鐘提示電路 當(dāng)?shù)竭_整點時或者當(dāng)前的時間等于51單片機中設(shè)置鬧鐘時間時蜂鳴器便會發(fā)出聲音進行提示。與單片機P0.5引腳的連接電路如圖8所示。 圖8 鬧鐘提示電路 圖9 LCD顯示電路8. LCD顯示電路 在本萬年歷當(dāng)中12864液晶顯示當(dāng)前的實時時間重要的陰陽歷節(jié)日等功能。12864液晶具有如下的特性: 1)提供8位,4位并行接口及串行接口可選2)并行接口適配M6800時序3)自動電源啟動復(fù)位功能4)內(nèi)部自建振蕩源 6416位字符顯示RAM(DDRAM最多16字符4行,LCD顯示范圍162行)(改為半角輸入) 2M位中文字型ROM(CGROM),總共提供8192個中文字型(1616點陣)16K位半寬字型ROM(HCGROM),總共提供126個西文字型(168點陣)6416位字符產(chǎn)生RAM(CGRAM) 1516位總共240點的ICONRAM(ICONRAM)其與單片機的連接電路如圖9所示。五、軟件設(shè)計框圖1. 主程序流程圖:2. 陰陽歷轉(zhuǎn)換流程圖:六、程序源代碼1. 主程序#include < reg52.h >#include < nongli.h >#include < lcd.h >#include < shezhi.h >#include < time.h>#include < wendu.h >#include < key.h >#define uchar unsigned char#define uint unsigned int/*sbit bell = P2 0; /定義蜂鳴器端口/* 定時器設(shè)置整點報時*/void Timer0_Service() interrupt 1 static uchar count = 0; static uchar flag = 0; /記錄鳴叫的次數(shù) count = 0; TR0 = 0; /關(guān)閉Timer0 TH0 = 0x3c; TL0 = 0XB0; /延時 50 ms TR0 = 1 ; /啟動Timer0 count +; if( count = 20 ) /鳴叫 1 秒 bell = bell; count = 0; flag +; if( flag = 6 ) flag = 0; TR0 = 0; /關(guān)閉Timer0 /* 中斷服務(wù)程序 整點報時 一分鐘*/uchar HexNum_Convert(uchar HexNum)/將16進制數(shù)轉(zhuǎn)換成十進制數(shù)uchar Numtemp;Numtemp=(HexNum>>4)*10+(HexNum&0X0F);return Numtemp;/* 函數(shù)名稱:main()* 功 能:* 入口參數(shù):* 出口參數(shù):*/void main( void ) uchar clock_time6 = 0X00,0X59,0X23,0X09,0X04,0X11; /定義時間變量 秒 分 時 日 月 年uchar alarm_time2 = 10, 06; /鬧鐘設(shè)置 alarm_time0: 分鐘 alarm_time1 :小時uchar temperature2; /定義溫度變量 temperature0 低8位 temperature1 高8位 Lcd_Initial(); /LCD初始化Clock_Fresh( clock_time ); /時間刷新Clock_Initial( clock_time ); /時鐘初試化 /*中斷初始化*/ EA = 1; /開總中斷 ET0 = 1; /Timer0 開中斷ET2 = 1; /Timer2 開中斷 TMOD = 0x01 ; /Timer0 工作方式 1RCAP2H = 0x3c; RCAP2L = 0xb0; /Timer2 延時 50 ms while( 1 ) switch( Key_Scan() )/按鍵掃描 case up_array: Key_Idle(); /檢測按鍵松開 break; case down_array: Key_Idle(); /檢測按鍵松開 break; case clear_array: Key_Idle(); /檢測按鍵松開 break; case function_array: Key_Function( clock_time, alarm_time ); case null: Clock_Fresh( clock_time ); /時間刷新 Lcd_Clock( clock_time ); /時間顯示 Sensor_Fresh( temperature ); /溫度更新 Lcd_Temperture( temperature ); /溫度顯示 Calendar_Convert( 0 , clock_time ); Week_Convert( 0, clock_time ); /整點報時if( ( * clock_time = 0x59 ) && ( * ( clock_time + 1 ) = 0x59 ) ) bell = 0; TR2 = 1; /啟動Timer2 /鬧鐘報警if( * alarm_time = HexNum_Convert(* ( clock_time + 1 ) )/分鐘相吻if( * ( alarm_time + 1 ) = HexNum_Convert(*( clock_time + 2 ) ) /小時相吻合 bell = 0;TR2 = 1; /啟動Timer2 break; 2. 溫度控制程序#ifndef _SENSOR#define _SENSOR#define uchar unsigned char#define uint unsigned int/*DS18B20管腳配置*/sbit dq = P2 1; /*DS18B20軟件延時專用*/void Sensor_Delay(uchar count)/延時函數(shù) while(count-);/*從DS18B20讀一個字節(jié)*/uchar Sensor_Read_Byte(void) uchar i = 0; uchar temp = 0; for(i=8;i>0;i-) dq = 0; / 給脈沖信號 temp >>= 1; dq = 1; / 給脈沖信號 if(dq) temp |= 0x80; Sensor_Delay(20); return (temp);/*向DS18B20寫一個字節(jié)*/void Sensor_Write_Byte(uchar temp) uchar i = 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; / DQ復(fù)位 Sensor_Delay(1); / 稍做延時 dq = 0; / 單片機將DQ拉低 Sensor_Delay(100); / 精確延時,大于480us dq = 1; / 拉高總線 Sensor_Delay(6); / 稍做延時后 i = dq; / 若x=0則初始化成功,若x=1則初始化失敗 Sensor_Delay(130); return (i);/*讀取并顯示溫度*/void Sensor_Fresh(uchar * temperature ) Sensor_Initial(); Sensor_Write_Byte( 0xCC ); / 跳過讀序號列號的操作 Sensor_Write_Byte( 0x44 ); / 啟動溫度轉(zhuǎn)換 Sensor_Initial(); Sensor_Write_Byte( 0xCC ); / 跳過讀序號列號的操作 Sensor_Write_Byte( 0xBE ); / 讀取溫度寄存器 temperature 0 = Sensor_Read_Byte();/低位 temperature 1 = Sensor_Read_Byte(); /高位#endif3. 日歷設(shè)置程序#ifndef _SUN_MOON#define _SUN_MOON/*/#define uchar unsigned char#define uint unsigned int#include < shezhi.h >#include < lcd.h >/* 功能: 讀取數(shù)據(jù)表中農(nóng)歷的大月或小月 ,如果大月返回1, 小月返回0*/bit get_moon_day( uchar month_p,uint calendar_address ) uchar temp,temp1;temp1=(month_p+3)/8;temp=0x80>>(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:陽歷的世紀標志 clock_time: 時鐘地址* 說明: c_flag = 0 :21世紀 c_flag = 1 :19世紀 */void Calendar_Convert( uchar c_flag, uchar * clock_time ) bit flag_month, flag_year; uchar year, month, day, month_point; /定義 年 月 天 uchar temp1, temp2, temp3; uint calendar_address; /定義農(nóng)歷地址 uint day_number; uchar clock_moon3; /定義陰歷 clock_time += 3; /指向日 day = ( * clock_time >> 4 ) * 10 + ( *clock_time & 0x0f ); /BCD轉(zhuǎn)換十進制 clock_time +; /指向月 month = ( * clock_time >> 4 ) * 10 + ( * clock_time & 0x0f ); /BCD轉(zhuǎn)換十進制 clock_time +; /指向年 year = ( * clock_time >> 4 ) * 10 + ( * clock_time & 0x0f ); /BCD轉(zhuǎn)換十進制 /定位日歷地址 if( c_flag = 0 ) calendar_address = ( year + 99 ) * 3; else calendar_address = ( year - 1 ) * 3; /春節(jié)(正月初一)所在的陽歷月份 temp1 = year_code calendar_address + 2 & 0x60; /Bit6Bit5:春節(jié)所在的陽歷月份 temp1 >>= 5 ; /春節(jié)(正月初一)所在的陽歷日期 temp2 = year_code calendar_address + 2 & 0x1f; /Bit4Bit0:春節(jié)所在的陽歷日期 /計算春節(jié)(正月初一)離當(dāng)年元旦 1月1日(陽歷) 的天數(shù);春節(jié)只會在陽歷的1月 或 2月 /*if( temp1 = 1 ) temp3 = temp2 - 1; else temp3 = temp2 + 31 - 1; */temp3=temp2-1;if(temp1!=1) temp3+=0x1f; /計算陽歷月離當(dāng)年元旦 1月1日(陽歷) 的天數(shù) if( month < 10 ) day_number = day_code1 month - 1 + day ; else day_number = day_code2 month - 10 + day ; /如果陽歷的月大于2 且該年的2月為閏月,天數(shù)加1 /閏年指的就是陽歷有閏日或陰歷有閏月的一年; /陽歷四年一閏,在二月加一天,這一天叫做閏日: /農(nóng)歷三年一閏,五年兩閏,十九年七閏,每逢閏年所加的一個月叫做閏月。 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_address ); /檢查該陰歷月的大小 大月返回1 小月返回0 flag_year = 0; /* if( flag_month ) temp1 = 30; /大月30天 else temp1 = 29; /小月29天 */ if (flag_month=0) temp1=29; elsetemp1=30; /閏月所在的月分 temp2 = year_code calendar_address & 0xf0; temp2 >>= 4; /提取高四位 假如是0 表示沒有閏月 while( day_number >= temp1 ) day_number -= temp1; month_point +; if( month = temp2 ) flag_year = flag_year; if( flag_year = 0 ) month +=1; else month + ; flag_month = get_moon_day( month_point, calendar_address ); if( flag_month ) temp1 = 30; else temp1 = 29; day = day_number + 1; else /陽歷在春節(jié)之前使用以下代碼進行運算 temp3 -= day_number; if( year = 0 ) year = 0xe3; c_flag = 1; else year -= 1; calendar_address -= 3; month = 0xc; temp2 = year_code calendar_address & 0xf0; temp2 >>= 4; /提取高4位 flag_year=0; if( temp2 = 0 ) month_point = 12; else month_point = 13; /flag_year = 0; flag_month = get_moon_day( month_point, calendar_address ); if( flag_month ) temp1 = 30; else temp1 = 29; while( temp3 > temp1 ) temp3 -= temp1; month_point -; if( flag_year = 0 ) month -=1; if( month = temp2 ) flag_year = flag_year; flag_month = get_moon_day( month_point, calendar_address ); if( flag_month ) temp1 = 0x1e; else temp1 = 0x1d; day = temp1 - temp3 + 1; /HEX->BCD ,運算結(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 % 10 ); Lcd_Lunar_Calendar( clock_moon );/*算法: ( 日期 + 年份 + 所過閏年 + 月校正 ) / 7 的余數(shù)就是星期 如果是閏年又不到 3 月份上述之和 要減一天 再*/void Week_Convert( bit c, uchar * clock_time ) uchar year, month, day; /定義 年 月 天 uchar temp; clock_time += 3; /指向日 day = ( * clock_time >> 4 ) * 10 + ( *clock_time & 0x0f ); /BCD轉(zhuǎn)換十進制 clock_time +; /指向月 month = ( * clock_time >> 4 ) * 10 + ( * clock_time & 0x0f ); clock_time +; /指向年 year = ( * clock_time >> 4 ) * 10 + ( * clock_time & 0x0f ); if( c = 0 ) /如果為21世紀,年份數(shù)加100 year += 100; temp = year / 4; /所過閏年數(shù)只算1900年之后的 temp = year + temp; temp = temp % 0x07; /為節(jié)省資源,先進行一次取余,避免數(shù)大于0xff,避免使用整型數(shù)據(jù) temp = temp + day + table_week month - 1 ; if( ( year % 4 = 0 ) && ( month <3 ) ) temp -=1; Lcd_Week( temp % 7 );/*/#endif4. 時鐘控制程序#ifndef _REAL_TIMER_DS1302#define _REAL_TIMER_DS1302/*預(yù)定義*/#define uchar unsigned char#define uint unsigned int/*DS1302管腳配置*/sbit clock_rst = P24;sbit clock_io = P23; sbit clock_sclk= P22;/*為了編程方便定義的位變量*/sbit ACC0 = ACC 0;sbit ACC7 = ACC 7;#define second_address0x80#define minute_address0x82#define hour_address0x84 #define day_address 0x86#define month_address0x88#define year_address0x8C/* 功 能:向時鐘DS1302寫入一個字節(jié)*/void Clock_Write_Byte(uchar temp) uchar i; ACC=temp; for(i=8; i>0; i-) clock_io = ACC0; /相當(dāng)于匯編中的 RRC clock_sclk = 1; clock_sclk = 0; ACC = ACC >> 1; /* 功 能:從時鐘DS1302讀取一個字節(jié)*/uchar Clock_Read_Byte(void)uchar i; for(i=8; i>0; i-) ACC = ACC >>1; /相當(dāng)于匯編中的 RRC ACC7= clock_io;clock_sclk = 1; clock_sclk = 0; return(ACC);/* 功 能:向時鐘DS1302寫入一個時間*/void Clock_Write_Time(uchar address, uchar temp)clock_sclk=0;clock_rst=0;clock_rst=1;Clock_Write_Byte(address);Clock_Write_Byte(temp);clock_rst=0;clock_sclk=1;/* 功 能:從時鐘DS1302讀出一個時間*/uchar Clock_Read_Time(uchar address)uchar temp=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);/* 功 能:時鐘初始化*/void Clock_Initial(uchar *clock_time ) Clock_Write_Time(0x8e,0x00); /WP=0 寫操作 *clock_time &= 0x7f; /最高位為 0 時鐘芯片工作Clock_Write_Time( second_address, * clock_time ); /秒 clock_time +; Clock_Write_Time( minute_address, * clock_time ); /分 clock_time +; Clock_Write_Time( hour_address, * clock_time ); /時 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_time ); /年 Clock_Write_Time( 0x8e,0x80); /WP=1 寫保護/* 功 能:從時鐘DS1302讀出時間*/void Clock_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 ); /讀時 clock_time +; * clock_time = Clock_Read_Time( day_address ); /讀日clock_time +; * clock_time = Clock_Read_Time( month_address ); /讀月clock_time +;*clock_time = Clock_Read_Time( year_address ); /讀年#endif5. 顯示設(shè)置程序#ifndef _LCD_12864#define _LCD_12864/*預(yù)定義*/#define uchar unsigned char#define uint unsigned int/*12864管腳配置*/#define

注意事項

本文(基于51單片機的萬年歷的設(shè)計.doc)為本站會員(xin****828)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!