自動(dòng)打鈴控制器_第1頁
自動(dòng)打鈴控制器_第2頁
自動(dòng)打鈴控制器_第3頁
自動(dòng)打鈴控制器_第4頁
自動(dòng)打鈴控制器_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、單片機(jī)課程設(shè)計(jì)第1章 引言單片機(jī)又稱單片微控制器,它不是完成某一個(gè)邏輯功能的芯片,而是把一個(gè)計(jì)算機(jī)系統(tǒng)集成到一個(gè)芯片上。相當(dāng)于一個(gè)微型的計(jì)算機(jī),和計(jì)算機(jī)相比,單片機(jī)只缺少了I/O設(shè)備。概括的講:一塊芯片就成了一臺(tái)計(jì)算機(jī)。它的體積小、質(zhì)量輕、價(jià)格便宜、為學(xué)習(xí)、應(yīng)用和開發(fā)提供了便利條件。同時(shí),學(xué)習(xí)使用單片機(jī)是了解計(jì)算機(jī)原理與結(jié)構(gòu)的最佳選擇。 單片機(jī)內(nèi)部也用和電腦功能類似的模塊,比如CPU,內(nèi)存,并行總線,還有和硬盤作用相同的存儲(chǔ)器件,不同的是它的這些部件性能都相對(duì)我們的家用電腦弱很多,不過價(jià)錢也是低的,一般不超過10元即可用它來做一些控制電器一類不是很復(fù)雜的工作足矣了。我們現(xiàn)在用的全自動(dòng)滾筒洗衣機(jī)

2、、排煙罩、VCD等等的家電里面都可以看到它的身影!它主要是作為控制部分的核心部件??梢哉f,二十世紀(jì)跨越了三個(gè)“電”的時(shí)代,即電氣時(shí)代、電子時(shí)代和現(xiàn)已進(jìn)入的電腦時(shí)代。不過,這種電腦,通常是指?jìng)€(gè)人計(jì)算機(jī),簡稱PC機(jī)。它由主機(jī)、鍵盤、顯示器等組成。還有一類計(jì)算機(jī),大多數(shù)人卻不怎么熟悉。這種計(jì)算機(jī)就是把智能賦予各種機(jī)械的單片機(jī)(亦稱微控制器)。顧名思義,這種計(jì)算機(jī)的最小系統(tǒng)只用了一片集成電路,即可進(jìn)行簡單運(yùn)算和控制。因?yàn)樗w積小,通常都藏在被控機(jī)械的“肚子”里。它在整個(gè)裝置中,起著有如人類頭腦的作用,它出了毛病,整個(gè)裝置就癱瘓了?,F(xiàn)在,這種單片機(jī)的使用領(lǐng)域已十分廣泛,如產(chǎn)品未使用單片機(jī)或其它可編程邏輯

3、器件上智能控制、實(shí)時(shí)工控、通訊設(shè)備、導(dǎo)航系統(tǒng)、家用電器等。各種產(chǎn)品一旦用上了單片機(jī),就能起到使產(chǎn)品升級(jí)換代的功效,常在產(chǎn)品名稱前冠以形容詞“智能型”,如智能型洗衣機(jī)等。今天我利用單片機(jī)控制學(xué)校的打鈴系統(tǒng),下面是我的設(shè)計(jì)思路第2章 設(shè)計(jì)要求用單片機(jī)、數(shù)字溫度傳感器、實(shí)時(shí)時(shí)鐘芯片、點(diǎn)陣液晶模塊設(shè)計(jì)一個(gè)簡易的自動(dòng)打鈴系統(tǒng),系統(tǒng)工作時(shí),在LCD顯示器的第一行用16×16點(diǎn)陣的漢字顯示“自動(dòng)打鈴系統(tǒng)”,第二行顯示當(dāng)前時(shí)間,第三行顯示當(dāng)前溫度值,在隨后的四行顯示一頁最近的打鈴時(shí)間,即將要打鈴的時(shí)間用黑底白字顯示,如果該頁的最后一個(gè)時(shí)間打過鈴后,自動(dòng)翻頁,將下一頁的4個(gè)打鈴時(shí)間顯示出來;用戶可以通

4、過按鍵修改當(dāng)前時(shí)間或打鈴時(shí)間;用戶可以通過按指定鍵獲知各鍵的功能。2.1 總體設(shè)計(jì)思想用TG12864B液晶模擬塊設(shè)計(jì)一個(gè)簡易的自動(dòng)打鈴系統(tǒng),系統(tǒng)正常工作是,在LCD顯示器的第一行用16*16的點(diǎn)陣的漢字顯示“自動(dòng)打鈴系統(tǒng)”,第二行顯示當(dāng)前時(shí)間,第三行顯示當(dāng)前溫度,在隨后的四行顯示一頁的最近的打鈴時(shí)間,即將要打鈴的時(shí)間用黑底白字顯示,如果該頁的最后一個(gè)時(shí)間打過鈴后,自動(dòng)翻頁,將下一個(gè)的4個(gè)打鈴時(shí)間顯示出來;用戶可以通過按鍵修改當(dāng)前時(shí)間或打鈴時(shí)間。利用KDOWN鍵進(jìn)入HELP功能;打鈴時(shí)用音樂聲代替。第3章 硬件電路設(shè)計(jì)分析:自動(dòng)打鈴系統(tǒng)的本質(zhì)就是電子鐘,如果當(dāng)前的時(shí)間與打鈴時(shí)間相同,就控制蜂鳴

5、器發(fā)出打鈴聲。雖然利用單片機(jī)本身的定時(shí)器也能夠?qū)崿F(xiàn)走時(shí)功能,但精度不夠高,程序也比較復(fù)雜,而實(shí)時(shí)時(shí)鐘芯片PCF8563能夠輕松的解決以上問題。由于打鈴時(shí)間可能多達(dá)數(shù)十個(gè),如果用戶設(shè)置完打鈴時(shí)間后將其保存在片內(nèi)RAM中,一旦斷電或重新啟動(dòng),打鈴時(shí)間又必須重新設(shè)置,為此可利用串行E²PROM器件24C02來保存打鈴時(shí)間。另外用4個(gè)按鍵來設(shè)置當(dāng)前時(shí)間和打鈴時(shí)間。系統(tǒng)正常工作時(shí),按KDOWN鍵進(jìn)入幫助菜單;按KSET鍵進(jìn)入當(dāng)前時(shí)間的設(shè)置,長按KSET鍵則進(jìn)入打鈴時(shí)間的設(shè)置;進(jìn)入設(shè)置方式后,按KSET鍵移動(dòng)光標(biāo),用黑底白字指示當(dāng)前正在修改的時(shí)、分、秒,KINC,KDEC鍵分別對(duì)當(dāng)前的修改對(duì)象加

6、、減1,如果是修改的打鈴時(shí)間,用KDOWN鍵對(duì)下一個(gè)打鈴時(shí)間進(jìn)行設(shè)置,長按KSET鍵退出當(dāng)前時(shí)間或打鈴時(shí)間的設(shè)置方式,回到正常狀態(tài)。電子鐘是一個(gè)以“分”,“秒”顯示于人的視覺器官的計(jì)時(shí)裝置。它的計(jì)時(shí)周期為24小時(shí),顯示滿刻度為23時(shí)59分59秒,另外應(yīng)有校時(shí)功能和一些顯示星期、報(bào)時(shí)、停電查看時(shí)間等附加功能。因此,一個(gè)基本的數(shù)字鐘電路主要由譯碼顯示器、“時(shí)”,“分”,“秒”,“星期”計(jì)數(shù)器、校時(shí)電路、報(bào)時(shí)電路和振蕩器組成。干電路系統(tǒng)由秒信號(hào)發(fā)生器、“時(shí)、分、秒、星期”計(jì)數(shù)器、譯碼器及顯示器、校時(shí)電路、整點(diǎn)報(bào)時(shí)電路組成。秒信號(hào)產(chǎn)生器是整個(gè)系統(tǒng)的時(shí)基信號(hào),它直接決定計(jì)時(shí)系統(tǒng)的精度,一般用石英晶體振蕩

7、器加分頻器來實(shí)現(xiàn)。將標(biāo)準(zhǔn)秒信號(hào)送入“秒計(jì)數(shù)器”,“秒計(jì)數(shù)器”采用60進(jìn)制計(jì)數(shù)器,每累計(jì)60秒發(fā)出一個(gè)“分脈沖”信號(hào),該信號(hào)將作為“分計(jì)數(shù)器”的時(shí)鐘脈沖?!胺钟?jì)數(shù)器”也采用60進(jìn)制計(jì)數(shù)器,每累計(jì)60分鐘,發(fā)出一個(gè)“時(shí)脈沖”信號(hào),該信號(hào)將被送到“時(shí)計(jì)數(shù)器”?!皶r(shí)計(jì)數(shù)器”采用24進(jìn)制計(jì)時(shí)器,可實(shí)現(xiàn)對(duì)一天24小時(shí)的累計(jì)。每累計(jì)24小時(shí),發(fā)出一個(gè)“星期脈沖”信號(hào),該信號(hào)將被送到“星期計(jì)數(shù)器”,“星期計(jì)數(shù)器” 采用7進(jìn)制計(jì)時(shí)器,可實(shí)現(xiàn)對(duì)一周7天的累計(jì)。譯碼顯示電路將“時(shí)”、“分”、“秒”、“星期”計(jì)數(shù)器的輸出狀態(tài)送到七段顯示譯碼器譯碼,通過七位LED七段顯示器顯示出來。整點(diǎn)報(bào)時(shí)電路時(shí)根據(jù)計(jì)時(shí)系統(tǒng)

8、的輸出狀態(tài)產(chǎn)生一脈沖信號(hào),然后去觸發(fā)一音頻發(fā)生器實(shí)現(xiàn)報(bào)時(shí)。校時(shí)電路時(shí)用來對(duì)“時(shí)”、“分”、“秒”、“星期”顯示數(shù)字進(jìn)行校對(duì)調(diào)整的。 晶振用一種能把電能和機(jī)械能相互轉(zhuǎn)化的晶體在共振的狀態(tài)下工作,以提供穩(wěn)定,精確的單頻振蕩。在通常工作條件下,普通的晶振頻率絕對(duì)精度可達(dá)百萬分之五十。高級(jí)的精度更高。有些晶振還可以由外加電壓在一定范圍內(nèi)調(diào)整頻率,稱為壓控振蕩器(VCO)晶體振蕩器電路給數(shù)字鐘提供一個(gè)頻率穩(wěn)定準(zhǔn)確的32768Hz的方波信號(hào),此外還有一校正電容可以對(duì)溫度進(jìn)行補(bǔ)償,以提高頻率準(zhǔn)確度和穩(wěn)定度,使穩(wěn)定度優(yōu)于10-4,可保證數(shù)字鐘的走時(shí)準(zhǔn)確及穩(wěn)定,下面我畫出硬件電路圖C2R104.7KC3Y211

9、.0592MC4VCCVCCVCCP24P25P26P27K4K3K2K1R1VCCBL-20BL+19VEE18RES17CSB16CSA15D714D613D512D411D310D29D18D07E6R/W5D/I4VCC2VO3GND1LCD1LCD12864R84.7KQ1PNPVCCR982RB1BUZZERVCC3DQ2GND1DS1DS1820VCC8CLKOUT7/INT3SCL6SDA5OSCI1OSCO2GND4U4PCF8563R5R6R7C1A01A22A33WP7GND4VCC8SCL6SDA5U524C02Y132768RP18RESVCC40EA/VP31RES

10、ET9X218X119PSEN29WR16T115T014INT113P2728P2627P156P11/T2ALE/P30P0732P0633P0534P0435P0336P0237P0138P0039TXD11RXD10P2021P2122P2223P2324P2425P10/T1P2526P123P134P145P167P178RD17INT012GND20U1SST89E58RDR2R3R4SCLSDARSTENRWRSCS1CS2RSTCS1ENRWRSSPKVCCVCCCS2VCCINTDQ12USBCON2R11POT2硬件電路圖3.1 PCB圖PCB電路圖3.2 程序流程圖開

11、始初始化定時(shí)器T0初始化外部中斷0 初始化液晶屏顯示”自動(dòng)打鈴系統(tǒng)”顯示當(dāng)前時(shí)間顯示當(dāng)前溫度發(fā)DS18B20復(fù)位命令發(fā)跳過ROM命令發(fā)啟動(dòng)溫度轉(zhuǎn)換命令發(fā)DS18B20復(fù)位命令發(fā)跳過ROM命令發(fā)讀暫存器指令讀取2字節(jié)的溫度值將溫度值轉(zhuǎn)換為BCD碼送顯示緩存、調(diào)用顯示程序24C02中的打鈴時(shí)間有效?將打鈴時(shí)間從24C02中至數(shù)組alatime中初始化PCF8563允許定是、報(bào)警中斷寫入當(dāng)前時(shí)間顯示當(dāng)前溫度顯示1頁最近打鈴時(shí)間確定下一個(gè)要打鈴的時(shí)間將其設(shè)為PCF8563的報(bào)警時(shí)間將其以黑底白字方式顯示YYNKDOWN鍵按下翻頁KINC鍵按下顯示HELP功能修改打鈴時(shí)間寫入24C02修改當(dāng)前時(shí)間寫入P

12、CF8563KDOWN鍵按下KSET鍵按下KSET_LONG鍵按下PCF8563產(chǎn)生中斷?從PCF8563讀取當(dāng)前時(shí)間,顯示當(dāng)前時(shí)間控制定時(shí)器T0產(chǎn)生方波將正在打鈴時(shí)間以正常方式顯示指向下一個(gè)打鈴時(shí)間將其設(shè)為PCF8563的打鈴時(shí)間將其以黑底白字方式顯示音樂聲是否結(jié)束?3.3 程序清單文件I2C.C的清單如下:#include <reg51.h> #include <intrins.h>#define uchar unsigned char #define delay1us() _nop_() #define delay5us() _nop_();_nop_();_no

13、p_();_nop_();_nop_() sbit SDA=P17; /P1.1模擬I2C總線的SDAsbit SCL=P16; /P1.0模擬I2C總線的SCLbit ack_mk; /應(yīng)答標(biāo)志位,有應(yīng)答為1,無應(yīng)答為0 void Start()/始信號(hào)/產(chǎn)生起 SDA=1; /將SDA、SCL置為1 SCL=1; delay5us(); /起始條件建立時(shí)間大于4.7us,故延時(shí)5us SDA=0; /SCL為高時(shí),SDA由高變低,發(fā)送起始信號(hào) delay5us(); /延時(shí)5us SCL=0; /SCL變低,準(zhǔn)備發(fā)送或接收數(shù)據(jù) void Stop() /產(chǎn)生停止信號(hào) SDA=0; /將SD

14、A清0, SCL置1 SCL=1; delay5us();/結(jié)束條件建立時(shí)間大于4.7us,所以延時(shí)5us SDA=1; /當(dāng)SCL為高電平時(shí),SDA由低變高,產(chǎn)生結(jié)束信號(hào) delay5us(); /延時(shí)5us SCL=0;void Ack(void) /產(chǎn)生應(yīng)答信號(hào) SDA=0; /SDA先清0,發(fā)應(yīng)答信號(hào) SCL=1; /SCL由低變高,產(chǎn)生一個(gè)時(shí)鐘 delay5us(); /延時(shí)5us SCL=0; /時(shí)鐘線SCL恢復(fù)到低電平,以便繼續(xù)接收void NAck(void)/產(chǎn)生非應(yīng)答信號(hào) SDA=1; /SDA先置1,發(fā)非應(yīng)答信號(hào) SCL=1; /SCL由低變高,產(chǎn)生一個(gè)時(shí)鐘 delay5

15、us(); /延時(shí)5us SCL=0; /時(shí)鐘線SCL清恢復(fù)到低電平,以便繼續(xù)接收 void SendByte(uchar c) /向I2C總線發(fā)送一個(gè)字節(jié) uchar n ; for(n=0;n<8;n+) /一字節(jié)為8位,循環(huán)8次 if(c&0x80) SDA=1; /根據(jù)發(fā)送位將數(shù)據(jù)線SDA置為1或清0 else SDA=0; SCL=1; /置SCL為高,通知被控從機(jī)開始接收數(shù)據(jù)位 delay5us(); /延時(shí)5us SCL=0; /SCL變低電平,準(zhǔn)備發(fā)送下一位數(shù)據(jù) c=c<<1; /將下一位要發(fā)送的數(shù)據(jù)移到最高位,先高后低 delay5us(); /延時(shí)

16、5us SDA=1; /一字節(jié)發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位 delay5us(); SCL=1; /SCL由低變高,產(chǎn)生一個(gè)時(shí)鐘,讀取SDA的狀態(tài) delay5us(); /延時(shí)5us if (SDA=1) ack_mk=0; /如果SDA=1,則發(fā)送失敗,將ack_mk清0 else ack_mk=1; /否則發(fā)送成功,將ack_mk置1 SCL=0;/SCL變低uchar RcvByte()/接收一個(gè)字節(jié) uchar c; uchar n; for(n=0;n<8;n+) /一字節(jié)為8位,循環(huán)8次 SDA=1; /置數(shù)據(jù)線SDA為輸入方式,進(jìn)入接收方式 SCL=1; /SCL由

17、低變高,產(chǎn)生一個(gè)時(shí)鐘 if (SDA=0) /根據(jù)數(shù)據(jù)線SDA的狀態(tài),將c的最高位清0或置1 c=c&0x7f; else c=c|0x80; c= _crol_(c,1); /將c循環(huán)左移一位,先接收高位,后接收低位 SCL=0; /時(shí)鐘線SCL清0 return(c);/*從指定器的的子地址開始寫入多個(gè)字節(jié)*/bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) uchar i; Start(); /啟動(dòng)總線 SendByte(sla); /*發(fā)送器件地址*/ if(ack_mk=0)return(0); SendByte(sub

18、a); /*發(fā)送器件子地址*/ if(ack_mk=0)return(0); for(i=0;i<no;i+) SendByte(*s); /*發(fā)送數(shù)據(jù)*/ if(ack_mk=0)return(0); s+; Stop(); /*結(jié)束總線*/ return(1);/*從指定器的的子地址開始讀取多個(gè)字節(jié)*/bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) uchar i; Start(); /*啟動(dòng)總線*/ SendByte(sla); /*發(fā)送器件地址*/ if(ack_mk=0)return(0); SendByte(suba);

19、 /*發(fā)送器件子地址*/ if(ack_mk=0)return(0); Start(); SendByte(sla+1); if(ack_mk=0)return(0); for(i=0;i<no-1;i+) *s=RcvByte(); /*發(fā)送數(shù)據(jù)*/ Ack(); /*發(fā)送就答位*/ s+; *s=RcvByte(); NAck(); /*發(fā)送非應(yīng)位*/ Stop(); /*結(jié)束總線*/ return(1);文件LCD12864IO.C的清單如下:#include <reg51.h>#include <intrins.h>#include <absacc.

20、h>#define uchar unsigned char#define uint unsigned intsbitLCD_RST= P37;/液晶屏復(fù)位腳定義sbit DI=P34;/DI引腳定義sbit RW=P35;/RW引腳定義sbit CS=P33;/片選信號(hào)定義sbit EN=P36;/使能信號(hào)定義sbit RDY=P07;/對(duì)應(yīng)狀態(tài)信息中的BF位sfr LCD=0x80; /P0口作為數(shù)據(jù)口#defineLCD_DISPON 0x3f/ 打開LCD顯示 #define LCD_STARTROW0xc0/ 設(shè)置起始行,可用LCD_STARTROW+x設(shè)置起始行(x<64

21、) #defineLCD_ADDRSTRY0xb8/ 頁起始地址, 可用LCD_ADDRSTRX+x設(shè)置當(dāng)前頁(x<8)#defineLCD_ADDRSTRX0x40/ 列起始地址,可用LCD_ADDRSTRY+x設(shè)置當(dāng)前列(x<64) #define CS1 0 /左半屏選擇#define CS2 1 /右半屏選擇/命令字cmd送左半屏(port=0)/右半屏(port=1)命令口voidLCD_WrCmd(bit port,uchar cmd) EN=0; CS=port; DI=0;/選擇命令寄存器 RW=0; EN=1; LCD=cmd; /命令碼送總線 EN=0;/數(shù)據(jù)w

22、rdata送左半屏(port=0)/右半屏(port=1)數(shù)據(jù)口void LCD_WrDat(bit port ,uchar wrdata) EN=0; CS=port; DI=1;/選擇命令寄存器 RW=0; EN=1; LCD=wrdata; /命令碼送總線 EN=0;/以filldata充填液晶屏void LCD_DispFill(uchar filldata) uchar x, y; LCD_WrCmd(CS1,LCD_STARTROW);/設(shè)置左半屏顯示起始行為0 LCD_WrCmd(CS2,LCD_STARTROW);/設(shè)置右半屏顯示起始行為0 for(y=0; y<8; y

23、+) /循環(huán)充填8頁 LCD_WrCmd(CS1,LCD_ADDRSTRY+y);/ 設(shè)置左半屏頁地址 LCD_WrCmd(CS1,LCD_ADDRSTRX); / 設(shè)置左半屏列地址 LCD_WrCmd(CS2,LCD_ADDRSTRY+y);/ 設(shè)置右半屏頁地址 LCD_WrCmd(CS2,LCD_ADDRSTRX);/ 設(shè)置右半屏列地址 for(x=0; x<64; x+) /充填每頁的64個(gè)單元(列) LCD_WrDat(CS1,filldata); LCD_WrDat(CS2,filldata); /液晶模塊初始化void LCD_DispIni(void) uint i; LC

24、D_RST = 0; / 復(fù)位驅(qū)動(dòng)芯片 for(i=0; i<500; i+); LCD_RST = 1; LCD_WrCmd(CS1,LCD_DISPON); / 打開顯示 LCD_WrCmd(CS1,LCD_STARTROW); / 設(shè)置顯示起始行為0 LCD_WrCmd(CS2,LCD_DISPON); LCD_WrCmd(CS2,LCD_STARTROW); LCD_DispFill(00);/ 清屏 LCD_WrCmd(CS1,LCD_ADDRSTRY+0);/ 設(shè)置頁(字符行)地址 LCD_WrCmd(CS1,LCD_ADDRSTRX+0);/ 設(shè)置列地址 LCD_WrCmd

25、(CS2,LCD_ADDRSTRY+0); LCD_WrCmd(CS2,LCD_ADDRSTRX+0);/在液晶屏的cy(0-7)行、cx(0-15)列顯示字符dispdatavoid LCD_DispChar(bit color,uchar cy, uchar cx, char dispdata) uchar code *pch; uchar i; bit port; cy = cy&0x07;/ 參數(shù)過濾 cx = cx&0x0f; pch = &ASCII_TAB(dispdata-0X20)*5; /指向字符起始列的點(diǎn)陣碼 if( (cx&0x08) =

26、 0 )/ 列號(hào)cx<8,在左半屏顯示 port=CS1; i=cx<<3; else port=CS2; i = (cx&0x07)<<3; LCD_WrCmd(port,LCD_ADDRSTRX+i);/ 設(shè)置當(dāng)前列地址 LCD_WrCmd(port,LCD_ADDRSTRY+cy);/ 設(shè)置當(dāng)前頁地址 for(i=0; i<5; i+); /延時(shí) if (color=0) LCD_WrDat(port,0x00);/ 顯示一列空格 else LCD_WrDat(port,0xff);/ 顯示一列空格 for(i=0; i<5; i+) /

27、送出字符的5列點(diǎn)陣碼 if(color=0) LCD_WrDat(port,*pch); else LCD_WrDat(port,*pch); pch+; if (color=0) LCD_WrDat(port,0x00);/ 顯示一列空格 else LCD_WrDat(port,0xff);/ 顯示一列空格 for(i=0; i<5; i+); if (color=0) LCD_WrDat(port,0x00);/ 顯示一列空格 else LCD_WrDat(port,0xff);/ 顯示一列空格 /在液晶屏的cy(0-7)行、cx(0-15)列顯示字符disp_strvoid LCD

28、_DispStr(bit color,uchar cy, uchar cx, char *disp_str) while( *disp_str != '0') cy = cy&0x07; / 參數(shù)過濾 cx = cx&0x0f; LCD_DispChar(color,cy, cx, *disp_str); / 顯示字符 disp_str+;/ 指向下一字符數(shù)據(jù) cx+; if(cx>15) cy+; / 指向下一顯示行 /在液晶屏的cy(0-3)行、cx(0-7)列顯示漢字字符dispdata void LCD_DispHZ(uchar cy, uchar

29、 cx, uchar dispdata) uchar code *pdat; uchar i,s,page; bit port; cy = cy&0x03;/ 參數(shù)過濾 cx = cx&0x07; pdat = &HZTABdispdata*32; if( (cx&0x04) = 0 )/ 如果在左半屏顯示 port=0; s = cx<<4;/ 求出該漢字在屏幕上的起始列 else/在右半屏上顯示 port=1; s = (cx<<4)-64;/ 求出該漢字在屏幕上的起始列 for(page=0;page<2;page+) /每個(gè)

30、漢字2頁 LCD_WrCmd(port,LCD_ADDRSTRX+s);/ 設(shè)置當(dāng)前列地址 LCD_WrCmd(port,LCD_ADDRSTRY+(cy<<1)+page);/ 設(shè)置當(dāng)前頁地址 for(i=0; i<5; i+); for(i=0; i<16; i+) /每個(gè)漢字16列 LCD_WrDat(port,*pdat);/ 發(fā)送數(shù)據(jù) pdat+; for(i=0; i<5; i+); /在液晶屏的cy(0-3)行、cx(0-7)列顯示漢字字符串disp_str void LCD_DispHZStr(uchar cy, uchar cx, uchar *

31、disp_str) while( *disp_str!=0xff) cy = cy&0x03;/ 參數(shù)過濾 cx = cx&0x07; LCD_DispHZ(cy, cx, *disp_str); / 顯示漢字 disp_str+;/ 指向下一漢字 cx+;/列號(hào)加1 if(cx>7) cy+;/ 指向下一顯示行 cx=0; void Help(void)Help2();while (1)k=GetKey();if(k=KINC)m+;if(m%2=0)Help2();else Help1();else if(k=KDOWN)break;bit reset(void) /

32、初始化DS18B20 bit err; DQ=0;/在數(shù)據(jù)線上產(chǎn)生600us的低電平 delay15(40); DQ=1;/數(shù)據(jù)線拉高 delay15(4);/延時(shí)60us err=DQ;/讀取數(shù)據(jù)線狀態(tài),err=0:復(fù)位成功 delay15(18);/ err=1:復(fù)位失敗 return(err); void wrbyte(uchar d)/向DS18B20寫入一個(gè)字節(jié) uchar i; dat=d; for(i=8;i>0;i-) /循環(huán)寫8位(先低位,后高位) DQ=0; /產(chǎn)生15us的負(fù)脈沖 delay15(1); DQ=dat0;/將當(dāng)前數(shù)據(jù)位送數(shù)據(jù)線 dat=dat>

33、>1;/將下一位要寫入的數(shù)據(jù)移到最低位 delay15(1);/延時(shí)15us DQ=1; /數(shù)據(jù)線拉高,為寫入下一位做準(zhǔn)備 uchar rdbyte(void)/從DS18B20讀取一個(gè)字節(jié) uchar i; dat=0;/讀出數(shù)據(jù)初值為0 for(i=8;i>0;i-) /循環(huán)讀8位(先低位,后高位) dat=dat>>1; /讀出數(shù)據(jù)先右移一位DQ=0; /產(chǎn)生1us的負(fù)脈沖_nop_(); DQ=1;/數(shù)據(jù)總線拉高 delay15(1); /延時(shí)15us dat7=DQ;/讀取數(shù)據(jù) delay15(4); /延時(shí),為讀下一位做準(zhǔn)備 return(dat); voi

34、d late() /延時(shí)700ms uchar i; for(i=0;i<200;i+) delay15(200);void gettemp(void) int temp; uchar zf; uchar h,l; reset(); /復(fù)位所有DS18B20 wrbyte(0xcc); /跳過ROM wrbyte(0x44); /啟動(dòng)所有DS18B20轉(zhuǎn)換 late(); /延時(shí)750ms reset(); / 復(fù)位 wrbyte(0xcc);/發(fā)跳過ROM命令 wrbyte(0xbe); /發(fā)讀暫存器命令 l=rdbyte(); /讀取溫度低字節(jié)、高字節(jié) h=rdbyte(); tem

35、p=h*256+l; zf=0; if(temp<0) /如果溫度在0度以下 zf=1; /置負(fù)數(shù)標(biāo)志 temp=-temp; /求補(bǔ) dbuf4=dptemp&0x0f+0x30;/求出溫度的小數(shù) temp=temp>>4; dbuf0=temp/100+0x30;/求出百位 temp=temp%100; dbuf1=temp/10+0x30; /求出十位 dbuf2=temp%10+0x30; /求出個(gè)位dbuf3='.' if(zf=1) if(dbuf1='0') dbuf0=' ' dbuf1='-&#

36、39; else dbuf0='-' else if(dbuf0='0') if(dbuf1='0') dbuf1=' ' dbuf0=' ' ; dbuf5='C'LCD_DispStr(0,3,4,dbuf); 文件自動(dòng)打鈴系統(tǒng).C的清單如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define KSET 0xe0#define KSET_LONG 0xe1#define KINC 0

37、xd0#define KDEC 0xb0#define KDOWN 0x70#define AT24C02 0xa0#define PCF8563 0xa2extern bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no);extern bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);extern void LCD_DispIni(void);extern void LCD_DispFill(uchar filldata);extern void LCD_DispChar(bit col

38、or,uchar cy,uchar cx,char dispdata);extern void LCD_DispStr(bit color,uchar cy,uchar cx,char *disp_str);extern void LCD_DispHZ(uchar cy,uchar cx,uchar dispdata);extern void LCD_DispHZStr(uchar cy,uchar cx,uchar *disp_str);extern void gettemp(void);extern void Help(void);sbit SOUND=P15;uchar th,tl;uc

39、har tiee;uint code tab1=64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217;/*uchar code tab3=0x42,0x82,0x82,0x82,0x84,0x02,0x72,0x62,/蘭花草0x72,0x62,0x52,0x48,0xb2,0xb2,0xb2,0xb2,0xb4,0x02,0xa2,0x82,0xa2,0xA2,0x92,0x88,0x82,0xb2,0xb2,0xa2,0x84,0x02,0x

40、72,0x62,0x72,0x62,0x52,0x44,0x02,0x12,0x12,0x62,0x62,0x52,0x44,0x02,0x82,0x72,0x62,0x52,0x32,0x48,0x00;*/uchar code tab3=0x64,0x64,0xa4,0xa4,0xb4,0xb4,0xa4,/小星星0x94,0x94,0x84,0x84,0x74,0x74,0x64,0xa4,0xa4,0x94,0x94,0x84,0x84,0x74,0xa4,0xa4,0x94,0x94,0x84,0x84,0x74,0x64,0x64,0xa4,0xa4,0xb4,0xb4,0xa4,

41、0x94,0x94,0x84,0x84,0x74,0x74,0x64,0x00;uchar max3=24,60,60;uchar time3=05,50,55;uchar idata sbuf5;uchar hzmsg7=0,1,2,3,4,5,0xff;uchar idata alatime162=6,00,6,46,6,47,6,48,10,05,10,45,11,40,13,30,14,10,14,50,15,20,16,00,16,40,17,20,19,30,21,00;bit mk;void delay(uchar t)uchar i;while(t-)for(i=0;i<

42、250;i+);uchar HexBcd(uchar hex)return (hex/10)<<4)|(hex%10);uchar BcdHex(uchar bcd)uchar hex,hex1;hex=bcd&0x0f;hex1=(bcd>>4)*10;return (hex+hex1);uchar Locate(void) uchar n;n=0;while(n<16)if(time0<alatimen0)break;else if(time0=alatimen0)&&(time1<=alatimen1) break;n+;

43、if(n=16)n=0;return (n);void LCD_DispDat(bit color,uchar cy,uchar cx,char dat)uchar str3;str0=dat/10+0x30;str1=dat%10+0x30;str2=0;LCD_DispStr(color,cy,cx,str);uchar GetKey(void)uchar key;uchar t;if(key=P2&0xf0)=0xf0)return 0xff;for(t=0;t<5;t+)delay(5);if(key=P2&0xf0)=0xf0)return 0xff;while

44、(P2&0xf0)!=0xf0)delay(5);if(t<250)t+;if(t>100)&&(key=0xE0)return 0xE1; return key;void DispTime(void)LCD_DispDat(0,2,4,time0);LCD_DispChar(0,2,6,':');LCD_DispDat(0,2,7,time1);LCD_DispChar(0,2,9,':');LCD_DispDat(0,2,10,time2);void DispAla(bit color,uchar no)LCD_DispD

45、at(color,4+no%4,8,alatimeno0);LCD_DispChar(color,4+no%4,10,':');LCD_DispDat(color,4+no%4,11,alatimeno1);void DispPage(uchar page)uchar i;for(i=0;i<4;i+)LCD_DispChar(0,4+i,3,'(');LCD_DispDat(0,4+i,4,page*4+i+1);LCD_DispChar(0,4+i,6,')');DispAla(0,page*4+i);void ReadTime(void)IRcvStr(PCF8563,0X01,sbuf,4);time0=B

溫馨提示

  • 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)論