




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、單片機(jī)課程設(shè)計(jì)報(bào)告萬年歷的設(shè)計(jì)姓 名:施韌學(xué) 號(hào): 0915321028班 級(jí): 09自動(dòng)化指導(dǎo)教師:晏來成基于51單片機(jī)的萬年歷摘要:電子萬年歷是一種非常廣泛日常計(jì)時(shí)工具,對(duì)現(xiàn)代社會(huì)越來越流行。它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),使用壽命長(zhǎng),誤差小。對(duì)于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時(shí)顯示年、月、日、周日、時(shí)、分、秒和溫度等信息,還具有時(shí)間校準(zhǔn)等功能。該電路采用AT89S52單片機(jī)作為核心,功耗小,能在3V的低壓工作,電壓可選用35V電壓供電。本設(shè)計(jì)是基于51系列的單片機(jī)進(jìn)行的電子萬年歷設(shè)計(jì),可以顯示年月日時(shí)分秒及周信息,具有可調(diào)整日期和時(shí)間功能。在設(shè)計(jì)的同時(shí)對(duì)單片機(jī)的理
2、論基礎(chǔ)和外圍擴(kuò)展知識(shí)進(jìn)行了比較全面準(zhǔn)備。萬年歷的設(shè)計(jì)過程在硬件與軟件方面進(jìn)行同步設(shè)計(jì)。硬件部分主要由AT89C52單片機(jī),LCD顯示電路,以及調(diào)時(shí)按鍵電路等組成。在單片機(jī)的選擇上本人使用了AT89C52單片機(jī),該單片機(jī)適合于許多較為復(fù)雜控制應(yīng)用場(chǎng)合。顯示器使用了1602液晶顯示,并且使用蜂鳴器實(shí)現(xiàn)了整點(diǎn)報(bào)警的功能,溫度測(cè)試的功能實(shí)現(xiàn)使用了DS18B20,并實(shí)現(xiàn)了溫度過高或過低時(shí)的溫度報(bào)警。軟件方面主要包括日歷程序、時(shí)間調(diào)整程序,顯示程序等。程序采用C語言編寫。所有程序編寫完成后,在KeilC51軟件中進(jìn)行調(diào)試,確定沒有問題后,在Proteus軟件中嵌入單片機(jī)內(nèi)進(jìn)行仿真,并最終實(shí)現(xiàn)基本要求。綜上
3、所述此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡(jiǎn)潔、成本低廉等諸多優(yōu)點(diǎn),符合電子儀器儀表的發(fā)展趨勢(shì),具有廣闊的市場(chǎng)前景。一、設(shè)計(jì)要求基本要求:1,8 個(gè)數(shù)碼管上顯示,顯示時(shí)間的格式為(假如當(dāng)前時(shí)間是19:32:20)“19-32-20”;2,具有日歷功能;時(shí)間可以通過按鍵調(diào)整。發(fā)揮部分:具有鬧鐘功能(可以設(shè)定多個(gè))。二:總體設(shè)計(jì)電路設(shè)計(jì)框圖LCD液晶顯示模塊鍵盤模塊AT89S52主控制模 塊時(shí)鐘模塊溫度采集模塊鈴聲報(bào)點(diǎn)模塊系統(tǒng)硬件概述本電路是由AT89S52單片機(jī)為控制核心,具有在線編程功能,低功耗,能在3V超低壓工作;時(shí)鐘電路由單片機(jī)定時(shí)功能提供;溫度的采集由DS18B20構(gòu)成,它具有獨(dú)
4、特的單線接口方式,DS18B20在與微處理器連接時(shí)僅需要一條口線即可實(shí)現(xiàn)微處理器與DS18B20的雙向通訊,使用時(shí)不需要額外的外圍電路。并且,其測(cè)溫范圍 55+125,固有測(cè)溫分辨率0.5;顯示部份使用1602液晶顯示,可完美地顯示年、月、日、周日、時(shí)、分、秒,且在整點(diǎn)時(shí)刻通過蜂鳴器實(shí)現(xiàn)響鈴。還可以實(shí)現(xiàn)溫度顯示,且當(dāng)判斷得溫度過高或過低時(shí),通過液晶顯示及LED發(fā)光二極管完成報(bào)警。單片機(jī)主控制模塊的設(shè)計(jì) AT89S52單片機(jī)為40引腳雙列直插芯片,有四個(gè)I/O口P0,P1,P2,P3, MCS-51單片機(jī)共有4個(gè)8位的I/O口(P0、P1、P2、P3),每一條I/O線都能獨(dú)立地作輸出或輸入。單片
5、機(jī)的最小系統(tǒng)如下圖所示,18引腳和19引腳接時(shí)鐘電路,XTAL1接外部晶振和微調(diào)電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,XTAL2接外部晶振和微調(diào)電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出.第9引腳為復(fù)位輸入端,接上電容,電阻及開關(guān)后夠上電復(fù)位電路,20引腳為接地端,40引腳為電源端. 液晶顯示模塊的設(shè)計(jì) LCD1602有16個(gè)引腳,其中VCC、VSS分別為電源正負(fù)極;VO為液晶偏壓信號(hào)輸入端,圖中W1可調(diào)節(jié)液晶明亮度; DB0DB7 8位數(shù)據(jù)段;BLA、BLK背光源正負(fù)極;RS數(shù)據(jù)/命令選擇端;R/W讀寫選擇端;E使能端溫度采集模塊設(shè)計(jì)采用數(shù)字式溫度傳感器DS18B20,它是數(shù)字式
6、溫度傳感器,具有測(cè)量精度高,電路連接簡(jiǎn)單特點(diǎn),此類傳感器僅需要一條數(shù)據(jù)線進(jìn)行數(shù)據(jù)傳輸,使用0.7與DS18B20的I/O口連接加一個(gè)上拉電阻,Vcc接電源,Vss接地。PCB圖三電子時(shí)鐘的軟件設(shè)計(jì)系統(tǒng)軟件按鍵檢測(cè)流程圖Y+是否按下M是否按下Y開始檢測(cè)NN相應(yīng)項(xiàng)加一是否按下相應(yīng)項(xiàng)減一YN 系統(tǒng)軟件定時(shí)器程序流程圖開始一秒到時(shí)秒加1時(shí)60秒到時(shí)分加1秒清零時(shí)固定日到時(shí)月加1日清零零時(shí)12月到時(shí)年加1月清零時(shí)24時(shí)到時(shí)日加1時(shí)清零,蜂鳴器響,星期加一時(shí)60分到時(shí)加1分清零時(shí)液 晶 顯 示子程序的設(shè)計(jì) DS18B20溫度子程序 void write_temp(uchar add,uchar dat)/
7、向LCD寫溫度數(shù)據(jù),并指定顯示位置uchar gw,sw,bw;if(dat>=0&&dat<=128)gw=dat%10;/取得個(gè)位數(shù)字sw=dat%100/10;/取得十位數(shù)字bw=dat/100;/取得百位數(shù)字elsedat=256-dat;gw=dat%10;/取得個(gè)位數(shù)字sw=dat%100/10;/取得十位數(shù)字bw=-3; /0x30-3表示為負(fù)號(hào)write_1602com(er+add);/er是頭文件規(guī)定的值0x80+0x40write_1602dat(0x30+bw);/數(shù)字+30得到該數(shù)字的LCD1602顯示碼write_1602dat(0x30
8、+sw);/數(shù)字+30得到該數(shù)字的LCD1602顯示碼write_1602dat(0x30+gw);/數(shù)字+30得到該數(shù)字的LCD1602顯示碼 write_1602dat(0xdf);/顯示溫度的小圓圈符號(hào),0xdf是液晶屏字符庫的該符號(hào)地址碼 write_1602dat(0x43);/顯示"C"符號(hào),0x43是液晶屏字符庫里大寫C的地址碼1602子程序void write_byte(uchar dat)/寫一個(gè)字節(jié)ACC=dat;RST=1;for(a=8;a>0;a-)IO=ACC0;SCLK=0;SCLK=1;ACC=ACC>>1;uchar re
9、ad_byte()/讀一個(gè)字節(jié)RST=1;for(a=8;a>0;a-)ACC7=IO;SCLK=1;SCLK=0;ACC=ACC>>1;return (ACC);/-void write_1302(uchar add,uchar dat)/向1302芯片寫函數(shù),指定寫入地址,數(shù)據(jù)RST=0;SCLK=0;RST=1;write_byte(add);write_byte(dat);SCLK=1;RST=0;uchar read_1302(uchar add)/從1302讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來源地址uchar temp;RST=0;SCLK=0;RST=1;write_by
10、te(add);temp=read_byte();SCLK=1;RST=0;return(temp);uchar BCD_Decimal(uchar bcd)/BCD碼轉(zhuǎn)十進(jìn)制函數(shù),輸入BCD,返回十進(jìn)制 uchar Decimal; Decimal=bcd>>4; return(Decimal=Decimal*10+(bcd&=0x0F);/-void ds1302_init() /1302芯片初始化子函數(shù)(2010-01-07,12:00:00,week4)RST=0;SCLK=0;write_1302(0x8e,0x00); /允許寫,禁止寫保護(hù) write_1302
11、(0x80,0x00); /向DS1302內(nèi)寫秒寄存器80H寫入初始秒數(shù)據(jù)00write_1302(0x82,0x00);/向DS1302內(nèi)寫分寄存器82H寫入初始分?jǐn)?shù)據(jù)00write_1302(0x84,0x12);/向DS1302內(nèi)寫小時(shí)寄存器84H寫入初始小時(shí)數(shù)據(jù)12write_1302(0x8a,0x01);/向DS1302內(nèi)寫周寄存器8aH寫入初始周數(shù)據(jù)4write_1302(0x86,0x08);/向DS1302內(nèi)寫日期寄存器86H寫入初始日期數(shù)據(jù)07write_1302(0x88,0x07);/向DS1302內(nèi)寫月份寄存器88H寫入初始月份數(shù)據(jù)01write_1302(0x8c,
12、0x10);/向DS1302內(nèi)寫年份寄存器8cH寫入初始年份數(shù)據(jù)10write_1302(0x8e,0x80); /打開寫保護(hù)時(shí)分秒顯示子函數(shù)void write_sfm(uchar add,uchar dat)/向LCD寫時(shí)分秒,有顯示位置加、現(xiàn)示數(shù)據(jù),兩個(gè)參數(shù)uchar gw,sw;gw=dat%10;/取得個(gè)位數(shù)字sw=dat/10;/取得十位數(shù)字write_1602com(er+add);/er是頭文件規(guī)定的值0x80+0x40write_1602dat(0x30+sw);/數(shù)字+30得到該數(shù)字的LCD1602顯示碼write_1602dat(0x30+gw);/數(shù)字+30得到該數(shù)字的
13、LCD1602顯示碼/-/年月日顯示子函數(shù)void write_nyr(uchar add,uchar dat)/向LCD寫年月日,有顯示位置加數(shù)、顯示數(shù)據(jù),兩個(gè)參數(shù)uchar gw,sw;gw=dat%10;/取得個(gè)位數(shù)字sw=dat/10;/取得十位數(shù)字write_1602com(yh+add);/設(shè)定顯示位置為第一個(gè)位置+addwrite_1602dat(0x30+sw);/數(shù)字+30得到該數(shù)字的LCD1602顯示碼write_1602dat(0x30+gw);/數(shù)字+30得到該數(shù)字的LCD1602顯示碼/-void write_week(uchar week)/寫星期函數(shù)write_1
14、602com(yh+0x0c);/星期字符的顯示位置switch(week)case 1:write_1602dat('M');/星期數(shù)為1時(shí),顯示 write_1602dat('O'); write_1602dat('N'); break;case 2:write_1602dat('T');/星期數(shù)據(jù)為2時(shí)顯示 write_1602dat('U'); write_1602dat('E'); break;case 3:write_1602dat('W');/星期數(shù)據(jù)為3時(shí)顯示 wri
15、te_1602dat('E'); write_1602dat('D'); break;case 4:write_1602dat('T');/星期數(shù)據(jù)為4是顯示 write_1602dat('H'); write_1602dat('U'); break;case 5:write_1602dat('F');/星期數(shù)據(jù)為5時(shí)顯示 write_1602dat('R'); write_1602dat('I'); break;case 6:write_1602dat('S
16、');/星期數(shù)據(jù)為6時(shí)顯示 write_1602dat('T'); write_1602dat('A'); break;case 7:write_1602dat('S');/星期數(shù)據(jù)為7時(shí)顯示 write_1602dat('U'); write_1602dat('N'); break;定時(shí)器0初始化程序void init() /定時(shí)器、計(jì)數(shù)器設(shè)置函數(shù)TMOD=0x11; /指定定時(shí)/計(jì)數(shù)器的工作方式為1TH0=0; /定時(shí)器T0的高四位=0TL0=0; /定時(shí)器T0的低四位=0EA=1; /系統(tǒng)允許有開放的
17、中斷ET0=1; /允許T0中斷TR0=1; /開啟中斷,啟動(dòng)定時(shí)器/*鍵盤掃描有關(guān)函數(shù)*void keyscan()if(key1=0)/-key1為功能鍵(設(shè)置鍵)-delay(9);/延時(shí),用于消抖動(dòng)if(key1=0)/延時(shí)后再次確認(rèn)按鍵按下 buzzer=0;/蜂鳴器短響一次 delay(20); buzzer=1;while(!key1);key1n+;if(key1n=12)key1n=1;/設(shè)置按鍵共有秒、分、時(shí)、星期、日、月、年、返回,8個(gè)功能循環(huán)switch(key1n)case 1: TR0=0;/關(guān)閉定時(shí)器/TR1=0;write_1602com(er+0x09);/設(shè)
18、置按鍵按動(dòng)一次,秒位置顯示光標(biāo) write_1602com(0x0f);/設(shè)置光標(biāo)為閃爍 temp=(miao)/10*16+(miao)%10;/秒數(shù)據(jù)寫入DS1302 write_1302(0x8e,0x00); write_1302(0x80,0x80|temp);/miao write_1302(0x8e,0x80); break;case 2: write_1602com(er+6);/按2次fen位置顯示光標(biāo) /write_1602com(0x0f);break;case 3: write_1602com(er+3);/按動(dòng)3次,shi /write_1602com(0x0f);b
19、reak;case 4: write_1602com(yh+0x0e);/按動(dòng)4次,week /write_1602com(0x0f);break;case 5: write_1602com(yh+0x0a);/按動(dòng)5次,ri /write_1602com(0x0f);break;case 6: write_1602com(yh+0x07);/按動(dòng)6次,yue /write_1602com(0x0f);break;case 7: write_1602com(yh+0x04);/按動(dòng)7次,nian /write_1602com(0x0f);break;case 8: write_1602com(
20、er+1); write_1602dat(0x4d);write_1602com(er+1); break;case 9: write_1602com(er+1); write_1602dat(0x46);write_1602com(er+1); break;case 10:write_1602com(er+1); write_1602dat(0x53);write_1602com(er+1);break;case 11: write_1602com(er+1); write_1602dat(0x20);write_1602com(0x0c);/按動(dòng)到第8次,設(shè)置光標(biāo)不閃爍TR0=1;/打開定
21、時(shí)器 temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,0x00|temp);/miao數(shù)據(jù)寫入DS1302 write_1302(0x8e,0x80); break; /-加鍵key2-if(key1n!=0)/當(dāng)key1按下以下。再按以下鍵才有效(按鍵次數(shù)不等于零)if(key2=0) /上調(diào)鍵delay(10);if(key2=0) buzzer=0;/蜂鳴器短響一次 delay(20); buzzer=1;while(!key2);switch(key1n)case 1:miao+;/設(shè)置鍵按動(dòng)1次,
22、調(diào)秒if(miao=60)miao=0;/秒超過59,再加1,就歸零write_sfm(0x08,miao);/令LCD在正確位置顯示"加"設(shè)定好的秒數(shù)temp=(miao)/10*16+(miao)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00); /允許寫,禁止寫保護(hù) write_1302(0x80,temp); /向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼 write_1302(0x8e,0x80); /打開寫保護(hù)write_1602com(er+0x09);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,光標(biāo)自動(dòng)右移,所
23、以要指定返回/write_1602com(0x0b);break;case 2:fen+;if(fen=60)fen=0;write_sfm(0x05,fen);/令LCD在正確位置顯示"加"設(shè)定好的分?jǐn)?shù)據(jù)temp=(fen)/10*16+(fen)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x82,temp);/向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分?jǐn)?shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù)write_1602com(er+6);/因?yàn)樵O(shè)置液
24、晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置break;case 3:shi+;if(shi=24)shi=0;write_sfm(2,shi);/令LCD在正確的位置顯示"加"設(shè)定好的小時(shí)數(shù)據(jù)temp=(shi)/10*16+(shi)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x84,temp);/向DS1302內(nèi)寫小時(shí)寄存器84H寫入調(diào)整后的小時(shí)數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù)write_1602com(er+3);/因?yàn)?/p>
25、設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位break;case 4:week+;if(week=8)week=1; write_1602com(yh+0x0C);/指定'加'后的周數(shù)據(jù)顯示位置write_week(week);/指定周數(shù)據(jù)顯示內(nèi)容 temp=(week)/10*16+(week)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x8a,temp);/向DS1302內(nèi)寫周寄存器8aH寫入調(diào)整后的周數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開
26、寫保護(hù) write_1602com(yh+0x0e);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位break;case 5:ri+;switch(yue) case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(ri>31) ri=1; break; case 2: if(nian%4=0|nian%400=0) if(ri>29) ri=1; else if(ri>28) ri=1; break; case 4:case 6:case 9:case 11:ri+; if(ri>30) ri=1;
27、break; write_nyr(9,ri);/令LCD在正確的位置顯示"加"設(shè)定好的日期數(shù)據(jù)temp=(ri)/10*16+(ri)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x86,temp);/向DS1302內(nèi)寫日期寄存器86H寫入調(diào)整后的日期數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù)write_1602com(yh+10);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位break;case 6:yue+;if(yue=13)y
28、ue=1;write_nyr(6,yue);/令LCD在正確的位置顯示"加"設(shè)定好的月份數(shù)據(jù)temp=(yue)/10*16+(yue)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x88,temp);/向DS1302內(nèi)寫月份寄存器88H寫入調(diào)整后的月份數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù)write_1602com(yh+7);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位break;case 7:nian+; if(nian=1
29、00)nian=0;write_nyr(3,nian);/令LCD在正確的位置顯示"加"設(shè)定好的年份數(shù)據(jù) temp=(nian)/10*16+(nian)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x8c,temp);/向DS1302內(nèi)寫年份寄存器8cH寫入調(diào)整后的年份數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù)write_1602com(yh+4);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位break;case 8:write_1
30、602com(er+9); /設(shè)置鬧鐘的秒定時(shí) miao1+;if(miao1=60) miao1=0;write_sfm(0x08,miao1);/令LCD在正確位置顯示"加"設(shè)定好秒的數(shù)據(jù)write_1602com(er+9);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置break;case 9:write_1602com(er+6); /設(shè)置鬧鐘的分鐘定時(shí) fen1+; if(fen1=60)fen1=0;write_sfm(0x05,fen1);/令LCD在正確位置顯示"加"設(shè)定好的分?jǐn)?shù)據(jù)write_1602com(er
31、+6);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置break;case 10:write_1602com(er+3); /設(shè)置鬧鐘的小時(shí)定時(shí) shi1+; if(shi1=24)shi1=0;write_sfm(0x02,shi1);/令LCD在正確的位置顯示"加"設(shè)定好的小時(shí)數(shù)據(jù)write_1602com(er+3);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位break;/-減鍵key3,各句功能參照'加鍵'注釋-if(key3=0)delay(10);/調(diào)延時(shí),消抖動(dòng)if(key3=0) buzzer=0
32、;/蜂鳴器短響一次 delay(20); buzzer=1;while(!key3);switch(key1n)case 1:miao-;if(miao=-1)miao=59;/秒數(shù)據(jù)減到-1時(shí)自動(dòng)變成59write_sfm(0x08,miao);/在LCD的正確位置顯示改變后新的秒數(shù) temp=(miao)/10*16+(miao)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00); /允許寫,禁止寫保護(hù) write_1302(0x80,temp); /向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼 write_1302(0x8e,0x8
33、0); /打開寫保護(hù)write_1602com(er+0x09);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置/write_1602com(0x0b);break;case 2:fen-;if(fen=-1)fen=59;write_sfm(5,fen);temp=(fen)/10*16+(fen)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x82,temp);/向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分?jǐn)?shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫
34、保護(hù)write_1602com(er+6);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置break;case 3:shi-; if(shi=-1)shi=23;write_sfm(2,shi);temp=(shi)/10*16+(shi)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x84,temp);/向DS1302內(nèi)寫小時(shí)寄存器84H寫入調(diào)整后的小時(shí)數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù)write_1602com(er+3);/因?yàn)樵O(shè)置液晶
35、的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位break;case 4:week-;if(week=0)week=7; write_1602com(yh+0x0C);/指定'加'后的周數(shù)據(jù)顯示位置write_week(week);/指定周數(shù)據(jù)顯示內(nèi)容 temp=(week)/10*16+(week)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x8a,temp);/向DS1302內(nèi)寫周寄存器8aH寫入調(diào)整后的周數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù)
36、write_1602com(yh+0x0e);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位break;case 5:ri-;switch(yue) case 1:case 3:case 5:case 7:case 8:case 10:case 12: if(ri=0) ri=31; break; case 2: if(nian%4=0|nian%400=0) if(ri=0) ri=29; else if(ri=0) ri=28; break; case 4:case 6:case 9:case 11: if(ri=0) ri=30; break; write_nyr(9,
37、ri);temp=(ri)/10*16+(ri)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x86,temp);/向DS1302內(nèi)寫日期寄存器86H寫入調(diào)整后的日期數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù)write_1602com(yh+10);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位break;case 6:yue-;if(yue=0)yue=12;write_nyr(6,yue);temp=(yue)/10*16+(yue)%10;/十進(jìn)制轉(zhuǎn)
38、換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x88,temp);/向DS1302內(nèi)寫月份寄存器88H寫入調(diào)整后的月份數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù)write_1602com(yh+7);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位break;case 7:nian-; if(nian=-1)nian=99;write_nyr(3,nian); temp=(nian)/10*16+(nian)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_130
39、2(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x8c,temp);/向DS1302內(nèi)寫年份寄存器8cH寫入調(diào)整后的年份數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù)write_1602com(yh+4);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位break;case 8:write_1602com(er+9); /設(shè)置鬧鐘的秒定時(shí) miao1-;if(miao1=-1) miao1=59;write_sfm(0x08,miao1);/令LCD在正確位置顯示"加"設(shè)定好秒的數(shù)據(jù)write_1602com(
40、er+9);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置break;case 9:write_1602com(er+6); /設(shè)置鬧鐘的分鐘定時(shí) fen1-; if(fen1=-1)fen1=59;write_sfm(0x05,fen1);/令LCD在正確位置顯示"加"設(shè)定好的分?jǐn)?shù)據(jù)write_1602com(er+6);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置break; case 10:write_1602com(er+3); /設(shè)置鬧鐘的小時(shí)定時(shí) shi1-; if(shi1=-1)shi1=23;write_s
41、fm(0x02,shi1);/令LCD在正確的位置顯示"加"設(shè)定好的小時(shí)數(shù)據(jù)write_1602com(er+3);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位break;/*主函數(shù)*/*void main()lcd_init(); /調(diào)用液晶屏初始化子函數(shù)ds1302_init(); /調(diào)用DS1302時(shí)鐘的初始化子函數(shù)init(); /調(diào)用定時(shí)計(jì)數(shù)器的設(shè)置子函數(shù)led=0; /打開LCD的背光電源 buzzer=0;/蜂鳴器長(zhǎng)響一次 delay(80); buzzer=1;while(1) /無限循環(huán)下面的語句: keyscan(); /調(diào)用鍵盤掃描子函數(shù) /*通過定時(shí)中斷實(shí)現(xiàn)定是獨(dú)處并顯示數(shù)據(jù)*/void timer0() interrupt 1 /取得并顯示日歷和時(shí)間 /Init_DS18B20();/溫度傳感器DS18b2初始化子函數(shù),在頭文件中 flag=ReadTemperature();/將18b2頭文件運(yùn)行返回的函數(shù)結(jié)果送到變量FLAG中,用于顯示 /讀取秒時(shí)分周日月年七個(gè)數(shù)據(jù)(DS1302的讀寄存器與寫寄存器不一樣): miao = BCD_Decimal(read_1302(0x81);
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中提前考試數(shù)學(xué)試卷
- 福建省質(zhì)檢卷數(shù)學(xué)試卷
- 高一年泉州統(tǒng)考數(shù)學(xué)試卷
- 福州初中五月數(shù)學(xué)試卷
- 甘肅15高考數(shù)學(xué)試卷
- 教師課件的制作培訓(xùn)
- 2025年浙江醫(yī)療衛(wèi)生招聘金華義烏市中醫(yī)醫(yī)院招聘4人筆試歷年專業(yè)考點(diǎn)(難、易錯(cuò)點(diǎn))附帶答案詳解
- 2025年年唐都醫(yī)院住培醫(yī)師招錄筆試歷年專業(yè)考點(diǎn)(難、易錯(cuò)點(diǎn))附帶答案詳解
- 2025至2030城市建設(shè)規(guī)劃發(fā)展趨勢(shì)分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 二一年高考數(shù)學(xué)試卷
- 醫(yī)療器械行業(yè)市場(chǎng)部人員崗位職責(zé)
- 旅行社導(dǎo)游帶團(tuán)操作流程
- 部編版小學(xué)道德與法治三年級(jí)下冊(cè)期末質(zhì)量檢測(cè)試卷【含答案】5套
- 怎樣當(dāng)好一名師長(zhǎng)
- DB21T 3354-2020 遼寧省綠色建筑設(shè)計(jì)標(biāo)準(zhǔn)
- 新生兒復(fù)蘇解析課件
- (完整版)重大危險(xiǎn)源清單及辨識(shí)表
- ABI7500熒光定量PCR儀標(biāo)準(zhǔn)操作規(guī)程
- 語言領(lǐng)域核心經(jīng)驗(yàn)《學(xué)前兒童語言學(xué)習(xí)與發(fā)展核心經(jīng)驗(yàn)》
- DB51T 5036-2017 四川省屋面工程施工工藝規(guī)程
- 11級(jí)設(shè)計(jì)題目寶豐紅四煤礦
評(píng)論
0/150
提交評(píng)論