![單片機(jī)萬年歷程序(帶鬧鐘)_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-5/6/f56681e2-f23f-4241-ae2f-383e07463ba7/f56681e2-f23f-4241-ae2f-383e07463ba71.gif)
![單片機(jī)萬年歷程序(帶鬧鐘)_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-5/6/f56681e2-f23f-4241-ae2f-383e07463ba7/f56681e2-f23f-4241-ae2f-383e07463ba72.gif)
![單片機(jī)萬年歷程序(帶鬧鐘)_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-5/6/f56681e2-f23f-4241-ae2f-383e07463ba7/f56681e2-f23f-4241-ae2f-383e07463ba73.gif)
![單片機(jī)萬年歷程序(帶鬧鐘)_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-5/6/f56681e2-f23f-4241-ae2f-383e07463ba7/f56681e2-f23f-4241-ae2f-383e07463ba74.gif)
![單片機(jī)萬年歷程序(帶鬧鐘)_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-5/6/f56681e2-f23f-4241-ae2f-383e07463ba7/f56681e2-f23f-4241-ae2f-383e07463ba75.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第一章 設(shè)計(jì)方案1.1.硬件設(shè)計(jì)1.1.1設(shè)計(jì)要求實(shí)現(xiàn)年月日、時分秒、星期的顯示功能,用兩個按鍵來實(shí)現(xiàn)日期和時間的調(diào)整功能,調(diào)整要求星期能自動更新,且能實(shí)現(xiàn)位調(diào)。顯示格式:四位年,兩位月,兩位日,星期字母前三位,兩位時,兩位分,兩位秒。比如:yyyy-mm-dd weekhh:mm:ss1.1.2硬件框圖控制芯片顯示器按鍵調(diào)整圖 1-1-硬件框圖日期時間由硬件軟件結(jié)合產(chǎn)生;按鍵之間相互配合完成當(dāng)前日期時間的調(diào)整功能。過程與結(jié)果由控制芯片分別輸出到顯示器上。本設(shè)計(jì)附加了播放音樂的功能。音樂從蜂鳴器產(chǎn)生。1.1.3硬件選擇1).顯示模塊本設(shè)計(jì)具體選用與實(shí)際應(yīng)用與消耗資源相關(guān)。萬年歷用到的地方大多都
2、在室內(nèi)?,F(xiàn)市場上與許多顯示器,在日常生活中最常見的有數(shù)碼管,led點(diǎn)陣屏,lcd液晶顯示器等。八段數(shù)碼管的優(yōu)點(diǎn):亮度高,顯示大。驅(qū)動部份的軟件簡單;缺點(diǎn):與液晶相比,耗電及體積大。數(shù)碼管只能單純的顯示數(shù)字,不能生動的表達(dá)各個參數(shù)的信息,消耗電力也比led液晶顯示器大。lcd液晶顯示器它是一種專門用來顯示字母、數(shù)字、符號等的點(diǎn)陣型液晶模塊,在單片機(jī)系統(tǒng)中應(yīng)用晶液顯示器作為輸出器件有以下幾個優(yōu)點(diǎn):顯示質(zhì)量高,由于液晶顯示器每一個點(diǎn)在收到信號后就一直保持那種色彩和亮度,恒定發(fā)光,而不像陰極射線管顯示器(crt)那樣需要不斷刷新新亮點(diǎn)。因此,液晶顯示器畫質(zhì)高且不會閃爍。數(shù)字式接口,液晶顯示器都是數(shù)字式
3、的,和單片機(jī)系統(tǒng)的接口更加簡單可靠,操作更加方便。體積小、重量輕,液晶顯示器通過顯示屏上的電極控制液晶分子狀態(tài)來達(dá)到顯示的目的,在重量上比相同顯示面積的傳統(tǒng)顯示器要輕得多。功耗低,相對而言,液晶顯示器的功耗主要消耗在其內(nèi)部的電極和驅(qū)動ic上,因而耗電量比其它顯示器要少得多。lcd液晶能一屏把本設(shè)計(jì)所要顯示的信息表達(dá)完整。而且lcd耗電小,體積小很適合與室內(nèi)使用。本設(shè)計(jì)的要求日期時間以數(shù)字表示、星期用3位英文字符表示共21個字符,lcd1602能顯示32個字符,足以完成顯示功能。lcd1602有16個引腳,各個引腳功能見下表:引腳號引腳名電平輸入/輸出作用1vss電源地2vddvcc電源(+5v
4、)3vee對比調(diào)整電壓4rs0/1輸入0=輸入指令,1=輸入數(shù)據(jù)5r/w0/1輸入0=向lcd寫入數(shù)據(jù)或指令1=從lcd讀取數(shù)據(jù)6e1,1-0輸入使能信號,1=讀取信息1-0(下降沿)執(zhí)行指令7db00/1輸入/輸出數(shù)據(jù)總線line08db10/1輸入/輸出數(shù)據(jù)總線line19db20/1輸入/輸出數(shù)據(jù)總線line210db30/1輸入/輸出數(shù)據(jù)總線line311db40/1輸入/輸出數(shù)據(jù)總線line412db50/1輸入/輸出數(shù)據(jù)總線line513db60/1輸入/輸出數(shù)據(jù)總線line614db70/1輸入/輸出數(shù)據(jù)總線line715avcclcd背光正極14klcd背光負(fù)極表 1-1 lc
5、d1602引腳及功能2).按鍵與蜂鳴器本設(shè)計(jì)選用輕觸按鈕,型號為xdjt1102s。選用壓電式蜂鳴器型號pt-1540p rohs。3).控制芯片根據(jù)lcd1602液晶顯示器與按鍵的引腳i/o數(shù)量以及擴(kuò)展功能的要求,所選控制芯片至少需要三組i/o口,本設(shè)計(jì)功能簡單,所以程序量較小,at89c51是一種帶4k字節(jié)閃存只讀存儲器的低電壓、高性能cmos 8位微處理器。at89c51是51系列基本的控制芯片,能滿足本設(shè)計(jì)的要求,性價比也要低于51系列其他的芯片。4).日期時間生成模塊為了減少成本,使用51的內(nèi)部定時器中斷再配合軟件計(jì)數(shù)的方式來生成一秒的時間。1.2軟件設(shè)計(jì)1.2.1編程環(huán)境及語言:主
6、函數(shù)time0中斷與軟件計(jì)數(shù)產(chǎn)生1秒的時間,并實(shí)現(xiàn)日期時間更新按鍵1按下int0中斷響應(yīng)按鍵2按下int1中斷響應(yīng)液晶顯示本設(shè)計(jì)的原理圖實(shí)現(xiàn)是在proteus中實(shí)現(xiàn)的,本設(shè)計(jì)的程序在keil uvision4環(huán)境中進(jìn)行編程與調(diào)試的,keil uvision4與proteus聯(lián)調(diào)能有效的對各個設(shè)計(jì)進(jìn)行測試。編程語言51c。1.2.2程序框圖圖1-2 程序框圖1).time0中斷用于生成時間,具體由程序和硬件共同產(chǎn)生1秒的時間。2).兩個外部中斷能進(jìn)行時間日期的切換,和對時間日期進(jìn)行調(diào)整,播放音樂,能滿足對按鍵設(shè)置的要求。3).主函數(shù)能及時在液晶屏上顯示默認(rèn)的時間和調(diào)整后的時間。第二章 系統(tǒng)設(shè)計(jì)2
7、.1硬件設(shè)計(jì)2.1.1振蕩電路本設(shè)計(jì)51芯片選用內(nèi)部振蕩器方式。由于本設(shè)計(jì)的時間由內(nèi)部定時器中斷與軟件計(jì)數(shù)相結(jié)合產(chǎn)生的,所以從計(jì)算方便以及系統(tǒng)的效率上考慮,本設(shè)計(jì)選用12mhz頻率的晶振,電路原理圖如下:圖2-1 at89c51的振蕩電路經(jīng)廠家推薦穩(wěn)定電路的電容c1,c2=30pf+-10p(附錄資料at89c51.pdf 第4-32頁)。2.1.2復(fù)位電路本設(shè)計(jì)使用上電復(fù)位電路。單片機(jī)晶振為12mhz,起振時間將近1ms,單片機(jī)1個機(jī)器周期的時間為1us。單片機(jī)每次上電復(fù)位所需的最短延時應(yīng)該不小于treset。這里,treset等于上電延時與起振延時之和。從實(shí)際上講,延遲一個treset往往
8、還不夠,不能夠保障單片機(jī)有一個良好的工作開端。復(fù)位電路把單片機(jī)鎖定在復(fù)位狀態(tài)上并且維持一個延時(記作trst),以便給予電源電壓從上升到穩(wěn)定的一個等待時間;在電源電壓穩(wěn)定之后,再插入一個延時,給予時鐘振蕩器從起振到穩(wěn)定的一個等待時間;在單片機(jī)開始進(jìn)入運(yùn)行狀態(tài)之前,還要至少推遲2個機(jī)器周期的延時間。單片機(jī)是高電平的時候復(fù)位,一般是用電阻和電容組成的,電容充電的時rst復(fù)位端為高電平,此時單片機(jī)開始復(fù)位.電容充電完成,此時單片機(jī)復(fù)位完成。由此電容值可取22uf,電阻值取10k。詳細(xì)見附錄文件(電容充電時間的計(jì)算方法.pdf)圖2-2 at89c51上電復(fù)位電路2.1.3按鍵選用兩個輕觸按鍵與單片機(jī)
9、p32(int0)、p33(int1)兩個引腳相接組成的獨(dú)立按鍵。2.1.4 lcd顯示電路1).lcd的選用本設(shè)計(jì)選用型號為lcd-016m002l顯示器。具體資料見附錄文件lcd-016m002l.pdf。2).lcd與51引腳的連接lcd1602引腳at89c51引腳lcd1602引腳at89c51引腳rsp20db3p03r/wp21db4p04ep22db5p05db0p00db6p06db1p01db7p07db2p02表2-1 lcd1602與51的連接vee為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10k的電
10、位器調(diào)整對比度。圖2-3 1602液晶與單片機(jī)接口電路2.1.5音樂播放電路此模塊采用蜂鳴器實(shí)現(xiàn),蜂鳴器驅(qū)動電流為20ma,單片機(jī)的p1口輸出電流為26ma能夠直接驅(qū)動蜂鳴器。只要編寫相應(yīng)的程序即可實(shí)現(xiàn)發(fā)出不同頻率的聲音,蜂鳴器與單片機(jī)的接口電路,蜂鳴器接線與單片機(jī)p17引腳相連。圖2-5 蜂鳴器電路2.1.6 p0上拉電阻計(jì)算由于lcd數(shù)據(jù)口是與51的p0口連接的,在p0口做一般i/o使用時要外接上拉電阻。根據(jù)lcd-016m002l顯示器的伏安特性,要保證上拉電阻明顯小于lcd的阻抗,以使高電平時輸出有效lcd工作電壓:+5vlcd工作電流:20malcd阻抗=5v/20ma=2.5k。上
11、拉電阻值可以取2.2k(詳細(xì)見附錄資料上拉電阻下拉電阻的總結(jié).doc),由于需要八個相同的上拉電阻如圖2-6所示,也可用一個排阻。具體型號見附錄表。圖2-6 上拉電阻2.2軟件設(shè)計(jì)開始賦計(jì)數(shù)初值判斷是否計(jì)滿一秒時間更新返回是否開始初始化將數(shù)據(jù)寫入緩沖區(qū)顯示緩沖區(qū)內(nèi)容2.2.1程序流程圖判斷是否在調(diào)整狀態(tài)調(diào)整當(dāng)前指針號的值播放音樂開始返回圖2-6主函數(shù)流程圖2-7 time0中斷服務(wù)程序流程是否圖2-8 int1中斷服務(wù)流程開始定時器停止工作,調(diào)整指針加1。調(diào)狀態(tài)標(biāo)志置1,秒清零。等待按鍵松開。判斷調(diào)整指針是否增到上限值(即調(diào)整完畢)指針復(fù)位。調(diào)整狀態(tài)標(biāo)志清零,定時器開始工作。返回是否圖2-9
12、int0中斷服務(wù)流程2.2.2流程的各個模塊設(shè)計(jì)全局變量datetime數(shù)組保存日期時間星期的容器。min2,hour2,day2,mon2,year4;調(diào)整時候使用的中間變量。buffer_date16,buffer_time16顯示緩沖區(qū)。1).定時器中斷服務(wù)程序定時器1計(jì)時一秒。計(jì)數(shù)初值的計(jì)算方法如下:設(shè)晶振頻率為f,則定時/計(jì)數(shù)器計(jì)數(shù)頻率為f/12, 定時/計(jì)數(shù)器的計(jì)數(shù)總次數(shù)t_all在方式1為216=65536,定時間隔為t,計(jì)數(shù)初值為a,則有a=-tf/12將計(jì)數(shù)初值a分別賦給加1計(jì)數(shù)器th0、tl0:th0=(t_all-a)/256;tl0=(t_all-a)%256;本設(shè)計(jì)晶
13、振頻率為12mhz,定時間隔為50ms,所以a=-0.05*12000000/12a=50000th0=(65536-50000)/256tl0=(65536-50000)%2561s就要計(jì)20次,中斷服務(wù)程序如下:void time0() interrupt 1 using 3th0=(65536-50000)/256;tl0=(65536-50000)%256;if(+count=20)/計(jì)時一秒count=0;datatime();/按實(shí)際規(guī)則日期時間更新2).int0中斷服務(wù)程序按鍵1接在了int0對應(yīng)的引腳p32。按鍵2接在了int1對應(yīng)的引腳p33。int0為電平觸發(fā)方式,int1
14、為邊沿觸發(fā)方式。由于按鍵2是一鍵多功能,具體功能由狀態(tài)標(biāo)志flag表明。所以在int0中斷服務(wù)程序中要有對flag標(biāo)志的置位及清位的操作。在調(diào)整期間為了時間準(zhǔn)確定時器不能工作,為了對日期時間的各位值進(jìn)行循環(huán)調(diào)整,設(shè)置了一個計(jì)數(shù)器,它的值表明要調(diào)整的是哪位。終端服務(wù)程序如下:void int0_k1() interrupt 0 tr0=0;/定時器停止cnum+;/計(jì)數(shù)器加1flag=1;/標(biāo)志位置位datetime0=0;while(k1=0);/等待按鍵松開if(cnum12)/調(diào)整結(jié)束,各個狀態(tài)還原tr0=1;cnum=-1;flag=0;3).int1中斷服務(wù)程序int1只要判斷標(biāo)志位執(zhí)
15、行任務(wù)就行了,中斷服務(wù)程序如下:void int1_k2() interrupt 2if(flag=1)/調(diào)整狀態(tài)下則位對應(yīng)調(diào)整位的增值,正常狀態(tài)則播放音樂edit_datetime(cnum);/按計(jì)數(shù)器的值調(diào)整對應(yīng)位elseshowstring(0x00,0, );/播放音樂是屏幕上的字幕showstring(0x00,1,happy);music();delayms(500);4).主函數(shù)程序主函數(shù)對各個中斷及l(fā)cd1602初始化后,就一直進(jìn)行顯示工作了,顯示的時候判斷標(biāo)志flag以區(qū)別是正常顯示還是閃爍顯示。主程序如下:void main()ie=0x87;/開中斷 ea=1,et0=
16、1,et1=1,ex0=1tcon=0x04;/it1為邊沿觸發(fā),it0電平觸發(fā)ip=0x0a;/定時器0,1為高優(yōu)先級tmod=0x01;/設(shè)置定時器0方式1th0=(65536-50000)/256;tl0=(65536-50000)%256;initialize_lcd();/初始化lcdtr0=1;while(1)buffer_value();/設(shè)置顯示緩存區(qū)的內(nèi)容if(flag)/調(diào)整時對應(yīng)調(diào)整位置閃爍if(+refresh=5)refresh=0;flash(cnum);dis_buffer();/將顯示緩沖區(qū)的內(nèi)容輸出到lcd上5).星期在調(diào)整是是自動更新的,這要?dú)w功于蔡勒公式。
17、算法如下(c51表示):unsigned char week()unsigned int y,m,c,s;y=datetime5%100;c=datetime5/100;if(datetime4=1)m=13;y-;if(datetime4=2)m=14;y-; s=y+y/4+c/4-2*c+26*(m+1)/10+datetime3-1;/蔡勒公式s=s%7;return s;函數(shù)返回值:0-星期日,1-星期一6-星期六6).閏年是自動判斷的,算法:(year%4=0)&(year%100!=0)|year%400=0函數(shù)代碼如下:unsigned char ynian(unsigned
18、char year)if( (year%400=0|year%4=0) & (year%100!=0) )return 1;elsereturn 0;是閏年返回1,否則返回07).月的天數(shù)判斷,由于1,3,5,7,8,10,12每月有31天;4,6,9,11每月有30天;2月閏年29天,平年28天。所以只要判斷月號是哪一類的,就返回那類的值,2月用閏年判斷算法判斷。函數(shù)代碼如下:unsigned char mon(unsigned char month)switch(month)case 1:case 3:case 5:case 7:case 8:case 10:case 12: return
19、 31;case 4:case 6:case 9:case 11: return 30;default:if(ynian(datetime5)/二月特殊,閏年判斷return 29;elsereturn 28;返回各月的天數(shù)上限。8).日期時間更新按照實(shí)際規(guī)則更新,60秒一分,60分一時,24小時一日,30日或31日或28日或29日一月,12月一年。函數(shù)代碼如下:void datatime()datetime0+;if(datetime059) /秒判斷datetime0=0;datetime1+;if(datetime159)/分datetime1=0;datetime2+; if(date
20、time223)/時datetime2=0;datetime3+;if(datetime3mon(datetime4)/日datetime3=1;datetime4+; if(datetime412) /月datetime4=1;datetime5+; /年/時刻為進(jìn)入調(diào)整狀態(tài)作準(zhǔn)備,將當(dāng)前日期時間值賦給調(diào)整時的變量datetime6=week();min0=datetime1%10;min1=datetime1/10;hour0=datetime2%10;hour1=datetime2/10;day0=datetime3%10;day1=datetime3/10;mon0=datetime4
21、%10;mon1=datetime4/10;year0=datetime5%10,year1=datetime5%100/10;year2=datetime5%1000/100,year3=datetime5/1000;9).調(diào)整日期時間函數(shù),利用cnum計(jì)數(shù)器指定當(dāng)前的調(diào)整屬性,函數(shù)源代碼如下:void edit_datetime(char cnum)switch(cnum)case 0: min0+;if(min09) /分低位調(diào)整限制 min0=0;break;case 1:min1+;if(min15) /分高調(diào)整限制min1=0;break;case 2:hour0+;if(hour
22、09)/時低位調(diào)整限制hour0=0;break;case 3:hour1+;if(hour12)/時高位調(diào)整限制hour1=0;break;case 4:day0+; if(day09) /日低位調(diào)整限制day0=0;break;case 5:day1+;if(day13)/日高位調(diào)整限制day1=0;break;case 6:mon0+;if(mon09)/月低位調(diào)整限制mon0=0;break;case 7:mon1+;if(mon11)/月高位調(diào)整限制mon1=0;break;case 8:year0+; /年調(diào)整if(year09)year0=0;break;case 9:year1
23、+;if(year19)year1=0;break;case 10:year2+;if(year29)year2=0;break;case 11:year3+;if(year39)year3=0;break;datetime1=min0+min1*10; /調(diào)整后將datetime實(shí)時更新datetime2=hour0+hour1*10;datetime3=day0+day1*10;datetime4=mon0+mon1*10;datetime5=year0+year1*10+year2*100+year3*1000;調(diào)整后能及時讓datetime更新。10).將datetime的日期時間星期
24、按照格式放到緩沖區(qū)上,格式為:yyyy-mm-dd weekhh:mm:ss函數(shù)源代碼如下:void buffer_value()format_datetime(datetime0,buffer_time+6);/將年月日時分秒星期,format_datetime(datetime1,buffer_time+3);/放到對應(yīng)緩沖區(qū)的位置上format_datetime(datetime2,buffer_time+0);/以待顯示format_datetime(datetime3,buffer_date+8);format_datetime(datetime4,buffer_date+5);fo
25、rmat_datetime(datetime5%100,buffer_date+2);format_datetime(datetime5/100,buffer_date+0);buffer_date13=week1week();buffer_date14=week2week();buffer_date15=week3week();lcd1602顯示的是字符,所以用函數(shù)轉(zhuǎn)換。format_datetime(數(shù)組1,數(shù)組2)功能:將數(shù)組1的數(shù)值轉(zhuǎn)換為字符放到數(shù)組2。11).閃爍顯示,在主函數(shù)顯示配合延時清空,寫入緩沖區(qū)的內(nèi)容,達(dá)到閃爍效果。具體哪位閃爍還是有cnum決定。函數(shù)源代碼如下:void
26、flash(char n)switch(n)case 0:buffer_clr(0,4); /對應(yīng)分低位置,清空break;case 1:buffer_clr(0,3);break;case 2:buffer_clr(0,1);break;case 3:buffer_clr(0,0);break;case 4:buffer_clr(1,9);break;case 5:buffer_clr(1,8);break;case 6:buffer_clr(1,6);break;case 7:buffer_clr(1,5);break;case 8:buffer_clr(1,3);break;case 9
27、:buffer_clr(1,2);break;case 10:buffer_clr(1,1);break;case 11:buffer_clr(1,0);break;case 12:write_lcd_command(0xc0 |12);/第2行12列后顯示overwrite_lcd_data(o);write_lcd_data(v);write_lcd_data(e);write_lcd_data(r);break;12).顯示緩沖區(qū)。源代碼如下:void dis_buffer()showstring(0x00,0,buffer_date);/輸出緩沖區(qū)的內(nèi)容showstring(0x00,
28、1,buffer_time);showstring是lcd的驅(qū)動函數(shù)。其他的驅(qū)動函數(shù)見下。13).lcd1602的驅(qū)動程序lcd1602與單片機(jī)引腳的連接前面已將過了。下面是各個對lcd1602的操作。具體細(xì)節(jié)可看lcd1602的資料。/*-函數(shù)名:busy_check功能:讀取lcd忙標(biāo)志輸入?yún)?shù):無輸出參數(shù):返回讀取的數(shù)據(jù)版本號:1.1.0修改日期:2010-06-01-*/unsigned char busy_check()unsigned char lcd_status;rs = 0; /寄存器選擇rw = 1; /讀狀態(tài)寄存器en = 1; /開始讀delayms(1);lcd_st
29、atus = p0;en = 0;return lcd_status;/*-函數(shù)名:write_lcd_command功能:向lcd寫指令輸入?yún)?shù):cmd-指令輸出參數(shù):無版本號:1.1.0修改日期:2010-06-01-*/void write_lcd_command(unsigned char cmd)while(busy_check()&0x80)=0x80);/忙等待rs = 0; /選擇命令寄存器rw = 0; /寫en = 0;p0 = cmd;en = 1;delayms(1);en = 0;/*-函數(shù)名:write_lcd_data功能:向lcd發(fā)送數(shù)據(jù)輸入?yún)?shù):dat-數(shù)據(jù)輸
30、出參數(shù):無版本號:1.1.0修改日期:2010-06-01-*/void write_lcd_data(unsigned char dat)while(busy_check()&0x80)=0x80);/忙等待rs = 1;rw = 0;en = 0;p0 = dat;en = 1;delayms(1);en = 0;/*-函數(shù)名:initialize_lcd功能:對lcd初始化輸入?yún)?shù):無輸出參數(shù):無版本號:1.1.0修改日期:2010-06-01-*/void initialize_lcd()write_lcd_command(0x38);/8位,2行,5x7點(diǎn)陣delayms(1);wr
31、ite_lcd_command(0x01);/清屏delayms(1);write_lcd_command(0x06);/字符進(jìn)入模式,屏幕不動,字符后移delayms(1);write_lcd_command(0x0c);/顯示開,關(guān)光標(biāo)delayms(1);/*-函數(shù)名:showstring功能:顯示字符串輸入?yún)?shù):x-列 y-行 str字符串輸出參數(shù):無版本號:1.1.0修改日期:2010-06-01-*/void showstring(unsigned char x,unsigned char y,unsigned char *str) unsigned char i = 0;/設(shè)置顯
32、示起始位置if(y = 0)write_lcd_command(0x80 | x);if(y = 1)write_lcd_command(0xc0 | x); /輸出字符串for(i=0;i16;i+) write_lcd_data(stri);心得體會單片機(jī)的學(xué)習(xí)已告一段落,我對自己的專業(yè)有了更深的體會。非常感謝錢老師的辛勤教導(dǎo),以企業(yè)的要求對我們進(jìn)行培訓(xùn),開拓我們的思維,改變我們的思維方式,讓我們自主發(fā)揮,讓我們在以后工作中少走很多彎路,并在此過程中讓我們自己找到了自身的種種缺點(diǎn),讓我們受益非淺。也許現(xiàn)階段的學(xué)習(xí)還存在諸多不足,在以后的學(xué)習(xí)中,會勤于總結(jié),認(rèn)真學(xué)好自己的專業(yè)課程。附錄 1.
33、 元器件表序號代號名稱型號、規(guī)格數(shù)量備注1u1單片機(jī)at89c5112k1,k2按鈕xdjt1102s23c1,c2電容0805 30pf2貼片4c3電解電容csr13 22uf15x1晶振ptvc 75114 12mhz16lcd液晶顯示器lcd-016m002l17r1電阻rj47 10k 0.5w18r2電位器wx2 27-15k 1w19rp1排阻a09-103j 2.2k8 1w1貼片10s1蜂鳴器pt-1540p rohs1壓電式11vcc電源+5v1附錄 2.程序源代碼321602.c文件/*-項(xiàng)目名稱:萬年歷制作:韓強(qiáng)王先忠王子房楊振偉版本號:1.1.2修改日期:2010-06
34、-04-*/#include#include#includesbit k1=p32;sbit k2=p33;unsigned char count,refresh;char cnum=-1;/日期時間的指針unsigned char flag=0;/調(diào)整標(biāo)志flag=1則是調(diào)整狀態(tài)unsigned char happy16=happy birthday;void main()ie=0x87;/開中斷tcon=0x04;/it1為邊沿觸發(fā),it0電平觸發(fā)ip=0x0a; /定時器0,1為高優(yōu)先級tmod=0x01;/設(shè)置定時器0方式1th0=(65536-50000)/256;tl0=(6553
35、6-50000)%256;initialize_lcd();/初始化lcdtr0=1;while(1)buffer_value();/設(shè)置顯示緩存區(qū)的內(nèi)容if(flag) /調(diào)整時對應(yīng)調(diào)整位置閃爍if(+refresh=5)refresh=0;flash(cnum);dis_buffer();/將顯示緩沖區(qū)的內(nèi)容輸出到lcd上void time0() interrupt 1 using 3th0=(65536-50000)/256;tl0=(65536-50000)%256;if(+count=20)/計(jì)時一秒count=0;datatime();/日期時間生成void int0_k1() i
36、nterrupt 0 tr0=0;cnum+;flag=1;/標(biāo)志位置位datetime0=0;while(k1=0);if(cnum12)/調(diào)整結(jié)束,各個狀態(tài)還原tr0=1;cnum=-1;flag=0;void int1_k2() interrupt 2if(flag=1)/調(diào)整狀態(tài)下則位對應(yīng)調(diào)整位的增值,正常狀態(tài)則播放音樂edit_datetime(cnum);else showstring(0x00,0, );showstring(0x00,1,happy);music();delayms(500);clock.h文件#ifndef _clock_#define _clock_unsi
37、gned int datetime7=0,59,0,1,6,2010,2;/秒,分,時,日,月,年,星期unsigned char code week17=smtwtfs;/組成星期前三個字母unsigned char code week27=uouehra;unsigned char code week37=nneduit;unsignedchar min2,hour2,day2,mon2,year4;unsigned char buffer_date16=2010-06-01 2;unsigned char buffer_time16=00:00:00 ;/*-函數(shù)名:ynian功能:判斷
38、年份是否為閏年輸入?yún)?shù):year一個有效的年份輸出參數(shù):是閏年輸出1,否則輸出0版本號:1.1.0制作人:韓強(qiáng)修改日期:2010-06-01-*/unsigned char ynian(unsigned char year)if( (year%400=0|year%4=0) & (year%100!=0) )return 1;elsereturn 0;/*-函數(shù)名:mon功能:判斷某一月分的天數(shù)上限輸入?yún)?shù):month一個有效的月份輸出參數(shù):返回該月份的上限值版本號:1.1.0制作人:韓強(qiáng)修改日期:2010-06-01-*/unsigned char mon(unsigned char mon
39、th)switch(month)case 1:case 3:case 5:case 7:case 8:case 10:case 12: return 31;case 4:case 6:case 9:case 11: return 30;default:if(ynian(datetime5)/二月特殊return 29;elsereturn 28;/*-函數(shù)名:week功能:實(shí)現(xiàn)星期的更新輸入?yún)?shù):無輸出參數(shù):星期值,0-星期日,1-星期一6-星期六版本號:1.1.0修改日期:2010-06-01-*/unsigned char week()unsigned int y,m,c,s;y=date
40、time5%100;c=datetime5/100;if(datetime4=1)m=13;y-;if(datetime4=2)m=14;y-; s=y+y/4+c/4-2*c+26*(m+1)/10+datetime3-1;/蔡勒公式s=s%7;return s;/*-函數(shù)名:datatime功能:實(shí)現(xiàn)時間日期的更新輸入?yún)?shù):無輸出參數(shù):無版本號:1.1.1修改日期:2010-06-02-*/void datatime()datetime0+;if(datetime059) /秒datetime0=0;datetime1+;if(datetime159)/分datetime1=0;datet
41、ime2+; if(datetime223)/時datetime2=0;datetime3+;if(datetime3mon(datetime4)/日datetime3=1;datetime4+; if(datetime412)/月datetime4=1;datetime5+; /年datetime6=week();/時刻為進(jìn)入調(diào)整狀態(tài)作準(zhǔn)備min0=datetime1%10;min1=datetime1/10;hour0=datetime2%10;hour1=datetime2/10;day0=datetime3%10;day1=datetime3/10;mon0=datetime4%10;
42、mon1=datetime4/10; year0=datetime5%10,year1=datetime5%100/10;year2=datetime5%1000/100,year3=datetime5/1000;/*-函數(shù)名:format_datetime功能:日期時間轉(zhuǎn)換為數(shù)字字符輸入?yún)?shù):d-數(shù)據(jù) a-指向存放轉(zhuǎn)換結(jié)果的數(shù)組輸出參數(shù):無版本號:1.1.0修改日期:2010-06-01-*/void format_datetime(unsigned int d,unsigned char *a ) a0=d/10+0; a1=d%10+0;/*-函數(shù)名:edit_datetime功能:實(shí)現(xiàn)對日期時間的調(diào)整(包括鬧鐘調(diào)整)輸入?yún)?shù):cnum是表指示前調(diào)整的值-1,不調(diào)整,013分別是分年的各位,14-保存調(diào)整結(jié)果輸出參數(shù):無版本號:1.1.2修改日期:2010-06-05-*/void edit_datetime(char cnum)switch(cnum)case 0: min0+;if(min09) /分低位調(diào)整限制 min0=0;break;case 1:min1+;if(min15) /分高調(diào)整
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年CDMA第三代蜂窩移動通信系統(tǒng)合作協(xié)議書
- 2025年光纖用GECL4合作協(xié)議書
- 2025年中學(xué)教師勞動合同樣本(2篇)
- 2025年九年級班主任個人年終教學(xué)工作總結(jié)范文(二篇)
- 2025年個人投資公司協(xié)議標(biāo)準(zhǔn)范文(2篇)
- 2025年二手摩托車轉(zhuǎn)讓協(xié)議標(biāo)準(zhǔn)范文(2篇)
- 2025年個人終止合同申請(五篇)
- 2025年二次消防改造工程合同協(xié)議(2篇)
- 2025年個人房屋借款合同標(biāo)準(zhǔn)版本(三篇)
- 2025年五年級英語教師工作總結(jié)樣本(四篇)
- 遼寧省沈陽市第七中學(xué)2023-2024學(xué)年七年級下學(xué)期期末數(shù)學(xué)試題
- 2024年湖南工業(yè)職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫附答案
- 快速入門穿越機(jī)-讓你迅速懂穿越機(jī)
- 水利安全生產(chǎn)風(fēng)險(xiǎn)防控“六項(xiàng)機(jī)制”右江模式經(jīng)驗(yàn)分享
- 2024年四川省成都市高新區(qū)中考數(shù)學(xué)二診試卷
- 幼兒園衛(wèi)生保健開學(xué)培訓(xùn)
- 食材配送服務(wù)售后服務(wù)方案
- 礦井主要災(zāi)害事故防治應(yīng)急避災(zāi)知識培訓(xùn)課件
- 不老莓行業(yè)分析
- STARCCM基礎(chǔ)培訓(xùn)教程
- 2016-2023年婁底職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
評論
0/150
提交評論