高級單片機開發(fā)技術(shù)與應(yīng)用_第1頁
高級單片機開發(fā)技術(shù)與應(yīng)用_第2頁
高級單片機開發(fā)技術(shù)與應(yīng)用_第3頁
高級單片機開發(fā)技術(shù)與應(yīng)用_第4頁
高級單片機開發(fā)技術(shù)與應(yīng)用_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、單片機課程設(shè)計報告系 部: 自動控制系 專 業(yè): 工業(yè)電氣自動化 班 級: 自044 姓 名: 張元元 學(xué) 號: 0431437 日 期 : 2006年12月16日河南機電高等??茖W(xué)校封面一. 前言:二. 系統(tǒng)總體設(shè)計:三. 硬件設(shè)計:四. 軟件設(shè)計:五. 總結(jié)與展望:高級單片機項目開發(fā)總結(jié)一前言:項目的意義:隨著電子技術(shù)的迅速發(fā)展,特別是隨著大規(guī)模集成電路的出現(xiàn),給人類生活帶來了根本性的改變。尤其是高級單片機開發(fā)技術(shù)的應(yīng)用產(chǎn)品已經(jīng)走進了千家萬戶。電子萬年歷的出現(xiàn)給人們的生活帶來了諸多方便。該萬年歷具有時間定時,顯示年月日星期的功能。開機后可以設(shè)置年月日星期及顯示定時設(shè)置時間和鬧鐘是否開啟,若

2、開啟的話一旦時間到則發(fā)出一陣聲響。本系統(tǒng)以單片機的C語言進行軟件設(shè)計,高級單片機開發(fā)的萬年歷控制實現(xiàn)了對時間控制的智能化,擺脫了傳統(tǒng)中由人來控制時間長短的不便,實現(xiàn)了在生活中必不可少的設(shè)備。萬年歷能控制鬧鈴啟停的時間、能夠循環(huán)顯示家人的姓名、能夠隨意的調(diào)整時間且星期回隨著日期的變化而變化。使用液晶顯示器來顯示現(xiàn)在的時間,顯示格式為“年月日時分秒”,由LED閃動來作秒計數(shù)表示,具有4個按鍵來作功能設(shè)置,可以設(shè)增加了程序的可讀性和可移植性,為了便于擴展和更改,軟件的設(shè)計采用模塊化結(jié)構(gòu),使程序設(shè)計的邏輯關(guān)系更加簡潔明了。系統(tǒng)通過點陣式液晶為載體顯示數(shù)據(jù),所以具有人性化的操作和美觀的頁面效果??梢燥@示

3、時間、日期、星期和家人姓名,并有鬧鈴功能。 二系統(tǒng)總體設(shè)計:1.總體功能:多功能數(shù)字萬年歷可以顯示時間、年、日期、星期和家人姓名,并有鬧鈴功能。2.主要軟件設(shè)計:時鐘是通過單片機的時間中斷的應(yīng)用,從而得到一定的時基,然后通過一定的循環(huán)得到一秒,最后得到了一分鐘和一個小時,中間有運用了平、閏年的判斷及星期自動處理程序,自動對年月日的轉(zhuǎn)換。鬧鐘的開啟也是通過另一個中斷開啟的,鍵盤的輸入的同樣是通過外部中斷向程序輸入一定量的數(shù)據(jù)的。3.主要硬件設(shè)計:系統(tǒng)應(yīng)用一個單片機的最小系統(tǒng),加上一些外圍電路組成的,例如小鍵盤,蜂鳴器驅(qū)動電路,電源指示燈,還有一個重要的顯示模塊LCD液晶顯示等等。 三硬件設(shè)計:1

4、. 最小系統(tǒng):該最小系統(tǒng)的復(fù)位電路是上電復(fù)位,復(fù)位電路有一個10k的電阻,和一個10Uf的電解電容組成,晶振是11.0592m的,加上兩個30pf的電容,最后CPU選擇了AT89C51,它們在現(xiàn)實的應(yīng)用生活比較普遍,并且價格低,應(yīng)用環(huán)境也比較廣,優(yōu)點是很多的,它具有算術(shù)運算功能強,軟件編程靈活,自由度大,可用軟件編程實現(xiàn)各種算符合邏輯控制,并且由于其功耗低,體積小,技術(shù)成熟和成本低等優(yōu)點,使其在各個領(lǐng)域應(yīng)用廣泛,所以選擇這些阻件。2. 顯示部分:顯示部分我選擇了LCD1602液晶,它具有相對成本低,如果用數(shù)碼管的話成本要高點,它還具有輕薄短小,地耗電量,無輻射危險,平面直角顯示以及影像不閃爍等

5、優(yōu)勢可視面積大,畫面效果好,分辨率高,接線簡單,抗干擾強等等的優(yōu)點。這可是數(shù)碼管所不可比擬的,從現(xiàn)在看來,它(液晶顯示)可能成為以后主流的顯示設(shè)備。因此選擇了LCD1602液晶顯示,對我們以后掌握其他元件有很大的幫助。下面就是對其的介紹:這里介紹的字符型液晶模塊是一種用5x7點陣圖形來顯示字符的液晶顯示器,根據(jù)顯示的容量可以分為1行16個字、2行16個字、2行20個字等等,這里以常用的2行16個字的1602液晶模塊來介紹它的編程方法。  1602采用標(biāo)準(zhǔn)的16腳接口,其中:第1腳:VSS為地電源,第2腳:VDD接5V正電源,第3腳:V0為液晶顯示器對比度調(diào)整端,接正電源時對

6、比度最弱,接地使用時可以通過一電源時對比度最高,對比度過高時會產(chǎn)生“鬼影”,個10K的電位器調(diào)整對比度,第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。,第5腳:RW為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當(dāng)RS和RW共同為低電平時可以寫入指令或者顯示地址,當(dāng)RS為低電平RW為高電平時可以讀忙信號,當(dāng)RS為高電平RW為低電平時可以寫入數(shù)據(jù)。第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。第714腳:D0D7為8位雙向數(shù)據(jù)線。第1516腳:空腳1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點陣字符圖形,如表

7、1所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,     1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表2所示,    它的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實現(xiàn)的。(說明:1為高電平、0為低電平) ,指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置,指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H ,指令4:顯示開關(guān)控制。 D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示 C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo) B

8、:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍 ,指令5:光標(biāo)或顯示移位 S/C:高電平時移動顯示的文字,低電平時移動光標(biāo),指令6:功能設(shè)置命令 DL:高電平時為4位總線,低電平時為8位總線 N:低電平時為單行顯示,高電平時雙行顯示 F: 低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字符 (有些模塊是 DL:高電平時為8位總線,低電平時為4位總線),指令7:字符發(fā)生器RAM地址設(shè)置 指令8:DDRAM地址設(shè)置 ,指令9:讀忙信號和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。 指令10:寫數(shù)據(jù),指令11:讀數(shù)據(jù)。   

9、;  DM-162液晶顯示模塊可以和單片機AT89C51直接接口,電路如圖1所示。 液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,表3是DM-162的內(nèi)部顯示地址.M-162的內(nèi)部顯示地址.    比如第二行第一個字符的地址是40H,那么是否直接寫入40H就可以將光標(biāo)定位在第二行第一個字符的位置呢?這樣不行,因為寫入顯示地址時要求最高位D7恒定為高電平1所以實際寫入的數(shù)據(jù)應(yīng)該是01000000B(40H)+1

10、0000000B(80H)=11000000B(C0H)3. 驅(qū)動部分:驅(qū)動電壓我們應(yīng)用了比較容易從電腦USB接口采集的5伏電壓,其他部分沒有什么驅(qū)動芯片。4. 獨立式鍵盤:鍵盤使用,獨立式鍵盤是指直接用I/O 口線加上幾個上拉電阻構(gòu)成的單個按鍵電路。它的配置靈活,軟件結(jié)構(gòu)簡單。因此該萬年歷系統(tǒng)有結(jié)構(gòu)簡單,成本低,用廣的優(yōu)點。5. 原理圖:四軟件設(shè)計:#include <reg51.h>#include <intrins.h>unsigned char code dis_week="SUN,MON,TUE,WED,THU,FRI,SAT"unsign

11、ed char code para_month13=0,0,3,3,6,1,4,6,2,5,0,3,5; /星期月參變數(shù)unsigned char data dis_buf116; /lcd 上排顯示緩沖區(qū)unsigned char data dis_buf216; /lcd 下排顯示緩沖區(qū)unsigned char data year,month,date,week;/年、月、日、星期unsigned char data armhour,armmin,armsec;/鬧鐘時、分、秒unsigned char data hour,min,sec,sec100; /時、分、秒、百分之一秒unsi

12、gned char data flag,vkey,skey;/設(shè)置狀態(tài)計數(shù)標(biāo)志、按鍵先前值、按鍵當(dāng)前值unsigned int s=0;bit alarm; /標(biāo)識是否啟用鬧鐘,1-啟用,0-關(guān)閉sbit rs = P20; /LCD 數(shù)據(jù)/命令選擇端(H/L)sbit rw = P21; /LCD 讀/寫選擇端(H/L)sbit ep = P22; /LCD 使能控制sbit PRE = P11; /調(diào)整鍵(k3)sbit SET = P12; /調(diào)整鍵(k4)sbit SPK = P13;void delayms(unsigned char ms); /延時程序bit lcd_busy()

13、; /測試LCD 忙碌狀態(tài)程序void lcd_wcmd(char cmd); /寫入指令到LCD 程序void lcd_wdat(char dat); /寫入數(shù)據(jù)到LCD 程序void lcd_pos(char pos); /LCD 數(shù)據(jù)指針位置程序void lcd_init(); /LCD 初始化設(shè)定程序void pro_timedate(); /時間日期處理程序void pro_display(); /顯示處理程序void pro_key(); /按鍵處理程序void time_alarm(); /定時鬧鈴功能(鬧鐘)unsigned char scan_key(); /按鍵掃描程序un

14、signed char week_proc(); /星期自動計算與顯示函數(shù)bit leap_year(); /判斷是否為閏年void lcd_sef_chr(); /LCD 自定義字符程序void update_disbuf(unsigned char t1,unsigned char t2,unsigned char dis_h,unsigned char dis_m,unsigned char dis_s);/更新顯示緩沖區(qū)函數(shù)/ 延時程序void delay(unsigned char ms) while(ms-) unsigned char i;for(i = 0; i< 250

15、; i+)_nop_(); /執(zhí)行一條_nop_()指令為一個機器周期_nop_();_nop_();_nop_();/測試LCD 忙碌狀態(tài)bit lcd_busy()bit result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();_nop_();result =(bit)(P0&0x80); /LCD 的D0-D7 中,D7=1 為忙碌,D7=0 為空閑ep = 0;return result;/寫入指令到LCDvoid lcd_wcmd(char cmd)while(lcd_busy(); /當(dāng)lcd_busy為1 時,再次檢測LCD

16、忙碌狀態(tài),lcd-busy 為0 時,開始寫指令rs = 0;rw = 0;ep = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;/寫入數(shù)據(jù)到LCDvoid lcd_wdat(char dat)while(lcd_busy(); /當(dāng)lcd_busy為1 時,再次檢測LCD忙碌狀態(tài),lcd-busy 為0 時,開始寫數(shù)據(jù)rs = 1;rw = 0;ep = 0;P0 = dat;_nop_();_nop_();_nop_();_n

17、op_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;/LCD 數(shù)據(jù)指針位置程序void lcd_pos(char pos)lcd_wcmd(pos|0x80); /數(shù)據(jù)指針=80+地址碼(00H27H,40H67H)/設(shè)定二個自定義字符,(注意:LCD1602 中自定義字符的地址為0x00-0x07,即可定義8個字符)/這里我們設(shè)定把一個自定義字符放在0x00 位置(000),另一個放在0x01 位子(001)void lcd_sef_chr() /第一個自定義字符lcd_wcmd(0x40); /"01 000 000"

18、 第1 行地址(D7D6 為地址設(shè)定命令形式D5D4D3 為字符存放位置(0-7),D2D1D0 為字符行地址(0-7))lcd_wdat(0x1f); /"XXX 11111" 第1 行數(shù)據(jù)(D7D6D5為XXX,表示為任意數(shù)(一般用000),D4D3D2D1D0 為字符行數(shù)據(jù)(1-點亮,0-熄滅)lcd_wcmd(0x41); /"01 000 001" 第2行地址lcd_wdat(0x11); /"XXX 10001" 第2 行數(shù)據(jù)lcd_wcmd(0x42); /"01 000 010" 第3行地址lcd_

19、wdat(0x15); /"XXX 10101" 第3 行數(shù)據(jù)lcd_wcmd(0x43); /"01 000 011" 第4行地址lcd_wdat(0x11); /"XXX 10001" 第4 行數(shù)據(jù)lcd_wcmd(0x44); /"01 000 100" 第5行地址lcd_wdat(0x1f); /"XXX 11111" 第5 行數(shù)據(jù)lcd_wcmd(0x45); /"01 000 101" 第6行地址lcd_wdat(0x0a); /"XXX 01010&q

20、uot; 第6 行數(shù)據(jù)lcd_wcmd(0x46); /"01 000 110" 第7行地址lcd_wdat(0x1f); /"XXX 11111" 第7 行數(shù)據(jù)lcd_wcmd(0x47); /"01 000 111" 第8行地址lcd_wdat(0x00); /"XXX 00000" 第8 行數(shù)據(jù)/第二個自定義字符lcd_wcmd(0x48); /"01 001 000" 第1行地址lcd_wdat(0x01); /"XXX 00001" 第1 行數(shù)據(jù)lcd_wcmd(0

21、x49); /"01 001 001" 第2行地址lcd_wdat(0x1b); /"XXX 11011" 第2 行數(shù)據(jù)lcd_wcmd(0x4a); /"01 001 010" 第3行地址lcd_wdat(0x1d); /"XXX 11101" 第3 行數(shù)據(jù)lcd_wcmd(0x4b); /"01 001 011" 第4行地址lcd_wdat(0x19); /"XXX 11001" 第4 行數(shù)據(jù)lcd_wcmd(0x4c); /"01 001 100"

22、第5行地址lcd_wdat(0x1d); /"XXX 11101" 第5 行數(shù)據(jù)lcd_wcmd(0x4d); /"01 001 101" 第6行地址lcd_wdat(0x1b); /"XXX 11011" 第6 行數(shù)據(jù)lcd_wcmd(0x4e); /"01 001 110" 第7行地址lcd_wdat(0x01); /"XXX 00001" 第7 行數(shù)據(jù)lcd_wcmd(0x4f); /"01 001 111" 第8行地址lcd_wdat(0x00); /"XX

23、X 00000" 第8 行數(shù)據(jù)/LCD 初始化設(shè)定void lcd_init()lcd_wcmd(0x38); /設(shè)置LCD 為16X2 顯示,5X7 點陣,八位數(shù)據(jù)借口delay(1);lcd_wcmd(0x0c); /LCD 開顯示及光標(biāo)設(shè)置(光標(biāo)不閃爍,不顯示"-")delay(1);lcd_wcmd(0x06); /LCD 顯示光標(biāo)移動設(shè)置(光標(biāo)地址指針加1,整屏顯示不移動)delay(1);lcd_wcmd(0x01); /清除LCD 的顯示內(nèi)容delay(1);/閏年的計算bit leap_year()bit leap;if(year%4=0&

24、&year%100!=0)|year%400=0)/閏年的條件leap=1;elseleap=0;return leap;/星期的自動運算和處理unsigned char week_proc() unsigned char num_leap;unsigned char c;num_leap=year/4-year/100+year/400;/自00 年起到y(tǒng)ear 所經(jīng)歷的閏年數(shù)if( leap_year()&& month<=2 ) /既是閏年且是1 月和2月c=5;elsec=6;week=(year+para_monthmonth+date+num_leap

25、+c)%7;/計算對應(yīng)的星期return week;/更新顯示緩沖區(qū)void update_disbuf(unsigned char t1,unsigned char t2,unsigned char dis_h,unsigned char dis_m,unsigned char dis_s) dis_buf10=t1; /dis_buf11=0x20; /空格dis_buf12=50; /'2'dis_buf13=48; /'0'dis_buf14=year/10+48;dis_buf15=year%10+48;dis_buf16=0x2d;dis_buf17

26、=month/10+48;dis_buf18=month%10+48;dis_buf19=0x2d; /'-'dis_buf110=date/10+48;dis_buf111=date%10+48;dis_buf112=0x20;dis_buf113=dis_week4*week;dis_buf114=dis_week4*week+1;dis_buf115=dis_week4*week+2;dis_buf20=t20;dis_buf21=t21;dis_buf22=t22;dis_buf23=t23;dis_buf24=t24;dis_buf25=t25;dis_buf26=0

27、x20; /空格if (alarm)dis_buf27=0x01; /alarm=1,顯示鬧鐘啟用標(biāo)致(第二個自定義字符)elsedis_buf27=0x20; /alarm=0,不顯示鬧鐘啟用標(biāo)致dis_buf28=dis_h/10+48;dis_buf29=dis_h%10+48;dis_buf210=0x3a; /':'dis_buf211=dis_m/10+48;dis_buf212=dis_m%10+48;dis_buf213=0x3a;dis_buf214=dis_s/10+48;dis_buf215=dis_s%10+48;/時間和日期處理程序void pro_t

28、imedate()sec+;if(sec > 59)sec = 0;min+;if(min>59)min=0;hour+;if(hour>23)hour=0;date+;if (month=1|month=3|month=5|month=7|month=8|month=10|month=12)if (date>31) date=1;month+; /大月31 天if (month=4|month=6|month=9|month=11)if (date>30) date=1;month+; /小月30 天if (month=2)if( leap_year() /閏年

29、的條件if (date>29) date=1;month+; /閏年2 月為29 天elseif (date>28) date=1;month+; /平年2 月為28 天if (month>12) month=1;year+;if (year>99) year=0;week_proc();if (sec=armsec && min=armmin && hour=armhour)if (alarm)TR1=1; /鬧鐘啟用時,鬧鈴時間到,啟動Timer1/顯示處理程序void pro_display() unsigned char i;lc

30、d_pos(0x00);for (i=0;i<=15;i+)lcd_wdat(dis_buf1i);lcd_pos(0x40);for (i=0;i<=15;i+)lcd_wdat(dis_buf2i);/Timer0 中斷處理程序,秒的產(chǎn)生void timer0() interrupt 1TH0=0xdc; /Timer0 置10ms 定時初值dc00H(216=65536D,dc00H=56320D)TL0=0x00; /定時時間=(65536-56320)*(1/11.0592)*12=10ms (f0=11.0592Mhz)sec100+;if(sec100 >= 1

31、00) /1 秒時間(100*10ms=1000ms=1s)sec100 = 0;switch(s)case 0: update_disbuf(0x00," pei ",hour,min,sec); break;/0x00 表示顯示00 位置的自定義字符case 1: update_disbuf(0x00," lu ",hour,min,sec); break;case 2: update_disbuf(0x00," yuan ",hour,min,sec); break;default : break; s+; /每秒輪流顯示我們的

32、姓名pro_timedate();/調(diào)用時間和日期處理程序if (s=3) s=0 ;pro_display(); /調(diào)用顯示處理函數(shù)/按鍵掃描程序unsigned char scan_key()skey=0x00; /給變量vkey置初值skey|=PRE; /讀取PRE 鍵的狀態(tài)skey=skey<<1; /將PRE 鍵的狀態(tài)存于skey 的B1 位skey|=SET; /讀取SET 鍵的狀態(tài),并存于skey 的B0 位return skey; /返回skey的鍵值(即PRE,SET 的狀態(tài))/外部中斷INT0 中斷處理程序void int0() interrupt 0TR0=

33、0; /禁止Timer0IE=0; /禁止中斷l(xiāng)cd_wcmd(0x0e); /顯示光標(biāo)"_",整個光標(biāo)不閃爍alarm=1;update_disbuf(0x50,"alarm:",armhour,armmin,armsec); /更新顯示數(shù)據(jù),0x50 表示要顯示"P"pro_display(); /調(diào)用顯示處理程序lcd_pos(0x47); /使光標(biāo)位于第一個調(diào)整項下flag=0;vkey=0x03;while(flag0x0a)skey = scan_key(); /掃描按鍵狀態(tài)if (skeyvkey) /若skey與vke

34、y相同,跳出循環(huán),相異執(zhí)行循環(huán)體 delay(10); /去按鍵抖動skey = scan_key(); /轉(zhuǎn)回掃描按鍵狀態(tài)if (skeyvkey) /若skey與vkey相同,跳出循環(huán),相異執(zhí)行循環(huán)體 vkey=skey; /將skey的值付給vkeyif (skey=0x01) /PRE 鍵按下 flag+; /調(diào)整標(biāo)志位加1switch (flag) /將光標(biāo)置于相應(yīng)調(diào)整位置case 1: lcd_pos(0x49);break; /光標(biāo)置小時鬧鈴設(shè)置位置case 2: lcd_pos(0x4c);break; /光標(biāo)置分鐘鬧鈴設(shè)置位置case 3: lcd_pos(0x4f);bre

35、ak; /光標(biāo)置秒時鬧鈴設(shè)置位置case 4: update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x05);break; /光標(biāo)置年調(diào)整位置case 5: lcd_pos(0x08);break; /光標(biāo)置月調(diào)整位置case 6: lcd_pos(0x0b);break; /光標(biāo)置日調(diào)整位置case 7: lcd_pos(0x49);break; /光標(biāo)置時調(diào)整位置case 8: lcd_pos(0x4c);break; /光標(biāo)置分調(diào)整位置case 9: lcd_pos(0x4f);break;

36、 /光標(biāo)置秒調(diào)整位置default:break;if (skey=0x02) /SET 鍵按下 pro_key(); /轉(zhuǎn)設(shè)置按鍵處理程序lcd_wcmd(0x0c); /設(shè)置LCD 開顯示及光標(biāo)不閃爍,不顯示"-"lcd_wcmd(0x01); /清除LCD 的顯示內(nèi)容IE=0x8f; /CPU 開中斷,INT0,INT1,開中斷TR0=1; /Timer0 啟動/主程序,初始化及初值設(shè)定void main()lcd_init(); /初始化LCDlcd_sef_chr(); /寫入自定義字符號hour=10;min=0;sec=0; /開機時的時,分,秒顯示armhou

37、r=10;armmin=0;armsec=0; /開機時的時,分,秒鬧鈴初值year= 6; month=12;date=14; /開機時的年,月,日,星期顯示week_proc();alarm=1; /初始開機,啟用鬧鐘IE = 0x8f; /CPU 開中斷,INT0,INT1,Timer0,Timer1 開中斷IP = 0x04; /設(shè)置INT0 為中斷最高優(yōu)先級IT0=0;IT1=0; /外部INT0,INT1 設(shè)置為電平觸發(fā)方式(注意,觸發(fā)不要選邊沿方式)TMOD = 0x11; /Timer0,Timer1 工作于模式1, 16 位定時方式TH0 = 0xdc;TL0 = 0x00;

38、 /Timer0 置10ms 定時初值TH1 = 0xff;TL1 = 0x00; /Timer1 置初值TR0 = 1; /Timer0 啟動TR1 = 0;while(1);/設(shè)置按鍵處理程序void pro_key()switch (flag)case 0:alarm=!alarm; /啟用或關(guān)閉鬧鐘(alarm=1:啟用,alarm=0:關(guān)閉)update_disbuf(0x50,"alarm:",armhour,armmin,armsec); /更新顯示數(shù)據(jù)pro_display(); /調(diào)用顯示處理lcd_pos(0x47);break; /光標(biāo)回到原調(diào)整位置c

39、ase 1:armhour+;if (armhour>23) armhour=0;update_disbuf(0x50,"alarm:",armhour,armmin,armsec); /更新顯示數(shù)據(jù)pro_display(); /調(diào)用顯示處理lcd_pos(0x49);break; /光標(biāo)回到原調(diào)整位置case 2:armmin+;if (armmin>59) armmin=0;update_disbuf(0x50,"alarm:",armhour,armmin,armsec);pro_display();lcd_pos(0x4c);bre

40、ak;case 3:armsec+;if (armsec>59) armsec=0;update_disbuf(0x50,"alarm:",armhour,armmin,armsec);pro_display();lcd_pos(0x4f);break;case 4:year+;if (year> 99) year= 0;week_proc(); /星期自動運算update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x05);break;case 5:month+;if

41、 (month>12) month=1;week_proc(); /星期自動運算update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x08);break;case 6:date+;if (month=1|month=3|month=5|month=7|month=8|month=10|month=12)if (date>31) date=1; /大月31 天if (month=4|month=6|month=9|month=11)if (date>30) date=1; /小月30 天if (month=2)if(leap_year() /閏年的條件if (date>29) date=1; /閏年2 月為29 天elseif (date&

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論