版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課 程 設(shè) 計(jì) 報(bào) 告 </p><p> 課程名稱 單片機(jī)應(yīng)用 </p><p> 設(shè)計(jì)題目 基于DS18B20和1602的溫度計(jì) </p><p> 專(zhuān) 業(yè) 計(jì)算機(jī)應(yīng)用技術(shù) </p><p> 班
2、 級(jí) </p><p><b> 一、設(shè)計(jì)目的</b></p><p> 在本設(shè)計(jì)中選用STC89C51型單片機(jī)作為主控制器件,采用DS18B20數(shù)字溫度傳感器作為測(cè)溫元件,通過(guò)1602LCD液晶顯示器實(shí)現(xiàn)溫度顯示。本設(shè)計(jì)的內(nèi)容主要分為三部分,一是系統(tǒng)硬件設(shè)計(jì),包括溫度采集電路和顯示電路;二是對(duì)系統(tǒng)
3、軟件部分的設(shè)計(jì),應(yīng)用C語(yǔ)言實(shí)現(xiàn)溫度的采集與顯示;三是通過(guò)1602LCD液晶顯示與DS1302芯片顯示其時(shí)間。通過(guò)DS18B20直接讀取被測(cè)溫度值,送入單片機(jī)進(jìn)行數(shù)據(jù)處理,之后進(jìn)行輸出顯示,最終完成了數(shù)字溫度計(jì)的總體設(shè)計(jì)。其系統(tǒng)構(gòu)成簡(jiǎn)單,信號(hào)采集效果好,數(shù)據(jù)處理速度快,便于實(shí)際檢測(cè)使用。</p><p><b> 二、設(shè)計(jì)指標(biāo)</b></p><p><b>
4、; 2.1 設(shè)計(jì)要求</b></p><p> (1).具有實(shí)時(shí)顯示溫度的功能,精度為1;</p><p> (2).具備在液晶上顯示年、月、日、星期、時(shí)、分、秒的功能; (3).具備年、月、日、星期、時(shí)、分、秒校準(zhǔn)功能; (4).具有與實(shí)時(shí)時(shí)間同步的功能。 2.2 單片機(jī)芯片的選擇采用STC89C51芯片作為硬件核心,內(nèi)部具有4KB ROM 存儲(chǔ)空間,能于3V的
5、超低壓工作,而且與MCS-51系列單片機(jī)完全兼容。2.3 顯示模塊的選擇采用1602液晶顯示屏,該液晶顯示屏的顯示功能強(qiáng)大,內(nèi)置192種字符,可顯示大量符號(hào)、數(shù)字,清晰可見(jiàn),而且功率消耗小壽命長(zhǎng)抗干擾能力強(qiáng)。所以在此設(shè)計(jì)中采用1602液晶顯示屏。2.4 時(shí)鐘的選擇采用DS1302時(shí)鐘芯片實(shí)現(xiàn)時(shí)鐘,DS1302芯片是一種高性能的時(shí)鐘芯片,可自動(dòng)對(duì)秒、分、時(shí)、日、周、月、年進(jìn)行計(jì)數(shù),而且精度高,位的RAM做為數(shù)據(jù)暫存區(qū),工作電壓2.
6、5V~5.5V范圍內(nèi),2.5V時(shí)耗電小于300nA。2.5溫度傳感器的選擇采用數(shù)字溫度芯片DS18B20 測(cè)量溫度,輸出信號(hào)全數(shù)字化。便于單片機(jī)處理及控制,省去傳統(tǒng)的測(cè)溫方法的很多外圍電路。且該芯片的物理化學(xué)性很穩(wěn)定,它能用做工業(yè)測(cè)溫元件,此元件線形較好。在0—100 攝氏度時(shí),最大線形偏差</p><p><b> 三、總體框圖設(shè)計(jì)</b></p><p>
7、 四、功能模塊及原理說(shuō)明</p><p> 1.單片機(jī)芯片模塊:</p><p> STC89C51RC是采用8051核的ISP(In System Programming)在系統(tǒng)可編程芯片,最高工作時(shí)鐘頻率為80MHz,片內(nèi)含8K Bytes的可反復(fù)擦寫(xiě)1000次的Flash只讀程序存儲(chǔ)器,器件兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP
8、Flash存儲(chǔ)單元,具有在系統(tǒng)可編程(ISP)特性,配合PC端的控制程序即可將用戶的程序代碼下載進(jìn)單片機(jī)內(nèi)部,省去了購(gòu)買(mǎi)通用編程器,而且速度更快。STC89C52RC系列單片機(jī)是單時(shí)鐘/機(jī)器周期(1T)的兼容8051 內(nèi)核單片機(jī),是高速/ 低功耗的新一代8051 單片機(jī),全新的流水線/精簡(jiǎn)指令集結(jié)構(gòu),內(nèi)部集成MAX810 專(zhuān)用復(fù)位電路。STC89C51RC實(shí)物圖如圖一所示,引腳圖如圖二所示:</p><p>
9、圖一 圖二</p><p><b> 顯示模塊:</b></p><p> 1602液晶也叫1602字符型液晶,它是一種專(zhuān)門(mén)用來(lái)顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊。它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符,每位之間有一個(gè)點(diǎn)距的間隔,每行之
10、間也有間隔,起到了字符間距和行間距的作用,1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊(顯示字符和數(shù)字)。1602LCD顯示器實(shí)物圖如圖三:</p><p> 圖三 圖四</p><p><b> 3.時(shí)鐘芯片模塊:</b></p><p>
11、DS1302 是美國(guó)DALLAS公司推出的一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘電路,它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。DS1302內(nèi)部有一個(gè)31×8的用于臨時(shí)性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級(jí)產(chǎn)品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,
12、同時(shí)提供了對(duì)后備電源進(jìn)行涓細(xì)電流充電的能力。DS1302時(shí)鐘芯片實(shí)物圖如圖四:</p><p><b> 溫度傳感器模塊:</b></p><p> DS18B20數(shù)字溫度傳感器接線方便,封裝成后可應(yīng)用于多種場(chǎng)合,如管道式,螺紋式,磁鐵吸附式,不銹鋼封裝式,型號(hào)多種多樣,有LTM8877,LTM8874等等。主要根據(jù)應(yīng)用場(chǎng)合的不同而改變其外觀。封裝后的DS18B2
13、0可用于電纜溝測(cè)溫,高爐水循環(huán)測(cè)溫,鍋爐測(cè)溫,機(jī)房測(cè)溫,農(nóng)業(yè)大棚測(cè)溫,潔凈室測(cè)溫,彈藥庫(kù)測(cè)溫等各種非極限溫度場(chǎng)合。耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設(shè)備數(shù)字測(cè)溫和控制領(lǐng)域。DS1802數(shù)字溫度傳感器DS18B20內(nèi)部結(jié)構(gòu)圖如圖五所示,實(shí)物管腳分布圖如圖六所示:</p><p> 圖五 圖六
14、 </p><p><b> 五、設(shè)計(jì)驗(yàn)證</b></p><p> 1.在仿真軟件上選取以上元件,元件圖如圖七所示:</p><p> 圖七 圖八</p><p> 2.在仿真軟件上進(jìn)行布局連線,如
15、圖八所示:</p><p><b> 3.程序設(shè)計(jì):</b></p><p> ?。?)溫度傳感器代碼如下:</p><p> DS18B20.h:</p><p> #include<intrins.h></p><p> #include<reg51.h><
16、;/p><p> void Display_char(unsigned char addr, unsigned char dat);</p><p> unsigned char code time[]="0123456789";</p><p> sbit DQ=P2^7;</p><p> static unsig
17、ned char LCD_Dis_sign;</p><p> void delay_100ms()//延時(shí)函數(shù)100ms</p><p><b> {</b></p><p><b> {</b></p><p> unsigned char a1,a2,a3;</p>
18、<p> for(a3=1;a3>0;a3--)</p><p> for(a2=232;a2>0;a2--)</p><p> for(a1=214;a1>0;a1--)</p><p><b> {</b></p><p><b> }</b></
19、p><p><b> }</b></p><p><b> }</b></p><p> void delay_750us()</p><p><b> {</b></p><p> unsigned char a1;</p><
20、;p> for(a1=149;a1>0;a1--)</p><p><b> {</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</
21、b></p><p><b> }</b></p><p><b> }</b></p><p> void delay_15us()</p><p><b> {</b></p><p> unsigned char a1;</p
22、><p> for(a1=5;a1>0;a1--)</p><p><b> {</b></p><p><b> }</b></p><p><b> }</b></p><p> void delay_45us()</p>
23、<p><b> {</b></p><p> unsigned char a1;</p><p> for(a1=20;a1>0;a1--)</p><p><b> {</b></p><p><b> }</b></p><p
24、><b> }</b></p><p> void delay_240us()</p><p><b> {</b></p><p> unsigned char a1;</p><p> for(a1=43;a1>0;a1--)</p><p><
25、;b> {</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> }</b></p&g
26、t;<p><b> }</b></p><p> /************************DS18B20初始化函數(shù)**********/</p><p> void DS18B20_Init()</p><p><b> {</b></p><p> DQ=1;
27、 //拉為高電平</p><p><b> _nop_();</b></p><p> DQ=0; //拉為低電平 </p><p> delay_750us(); //延時(shí)750us </p><p> DQ=1; //釋放總線</p>
28、<p> delay_15us(); //延時(shí)15us,如果DS18B20初始化成功,會(huì)把總線DQ拉低</p><p> while(DQ); //等待總線被拉低</p><p> delay_240us(); </p><p> DQ=1; //拉高電平釋放總線</p><p><b>
29、; }</b></p><p> /***********************DS18B20寫(xiě)函數(shù)***************/</p><p> void Write_DS18B20(unsigned char command)</p><p><b> {</b></p><p> uns
30、igned char i,temp;</p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p> temp=command&0x01;//*********作用?</p><p> DQ=1;//拉為高電平</p><p&
31、gt;<b> _nop_();</b></p><p><b> DQ=0;</b></p><p> delay_15us();</p><p> if(temp==1) //判斷寫(xiě)0還是寫(xiě)1</p><p><b> DQ=1;</b></p>
32、<p><b> else</b></p><p><b> DQ=0;</b></p><p> delay_45us(); //延時(shí)45us</p><p><b> DQ=1;</b></p><p> command >>= 1;<
33、/p><p><b> }</b></p><p> DQ=1; //釋放總線</p><p><b> }</b></p><p> /****************DS18B20讀函數(shù)**********************/</p><p> unsigne
34、d char Read_DS18B20()</p><p><b> {</b></p><p> unsigned char i,temp;</p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p> temp
35、 >>= 1; //先右移一位,消耗一個(gè)for循環(huán),如果不這樣做,讀出的數(shù)據(jù)會(huì)不正確</p><p><b> DQ=0;</b></p><p> _nop_();_nop_();</p><p> DQ=1; //根據(jù)手冊(cè),需釋放總線</p><p> _nop_();_nop_();<
36、/p><p> _nop_();_nop_();</p><p> if(DQ) //判斷總線讀出的數(shù)據(jù)</p><p> temp=temp|0x80; //temp與0x80或運(yùn)算的作用?</p><p> delay_45us();</p><p><b> }</b></
37、p><p> return temp;</p><p> } </p><p> /************DS18B20轉(zhuǎn)換溫度函數(shù)******************/</p><p> void DS18B20_Start_Conversion()</p><p><b>
38、 {</b></p><p> DS18B20_Init(); //復(fù)位</p><p> Write_DS18B20(0xcc); //跳過(guò)ROM</p><p> Write_DS18B20(0x44); //開(kāi)始轉(zhuǎn)換溫度 對(duì)芯片寫(xiě)入0x44</p><p> //芯片接收轉(zhuǎn)換指令后,把一些溫度有
39、關(guān)的模擬量轉(zhuǎn)變成數(shù)字信號(hào),再把此數(shù)值放入相應(yīng)的RAM上</p><p> delay_100ms(); //延時(shí)100ms,轉(zhuǎn)換時(shí)間 這里如果太長(zhǎng),讀出的會(huì)慢</p><p> DS18B20_Init(); //復(fù)位</p><p> Write_DS18B20(0xcc); //</p><p>
40、 Write_DS18B20(0xbe);//0xbe讀取暫存器指令</p><p><b> }</b></p><p> /**************獲得轉(zhuǎn)換溫度函數(shù)*****************/</p><p> unsigned char Get_temperature()</p><p>&l
41、t;b> {</b></p><p> unsigned char temp1,temp2;</p><p> DS18B20_Start_Conversion(); //溫度開(kāi)始轉(zhuǎn)換并發(fā)出讀取命令</p><p> temp1=Read_DS18B20();</p><p> temp2=Read_DS18B20
42、(); //讀取暫存器前兩個(gè)字節(jié)</p><p> DS18B20_Init(); //讀取完前兩個(gè)字節(jié)后,終止讀取</p><p> if((temp2&0xf8)==0xf8) //判斷,如果讀取的溫度是負(fù)數(shù)</p><p><b> {</b></p><p> LCD_Di
43、s_sign=1; //液晶顯示標(biāo)志 溫度為負(fù)數(shù)</p><p> return ((~((temp2<<8)|temp1)+1)*0.0625); //單片機(jī)二進(jìn)制轉(zhuǎn)十進(jìn)制</p><p> //把Temp2的值左移8位,然后或Temp1,非運(yùn)算,再加1</p><p> } //得到的數(shù)再乘以0.0625,將值賦給
44、Temperature</p><p> LCD_Dis_sign=0; //溫度小于100度且為正</p><p> return (((temp2<<8)|temp1)*0.0625);</p><p><b> }</b></p><p> /***************液晶顯示函數(shù)
45、*************************/</p><p> void LCD_Dis_temperature()</p><p><b> {</b></p><p> unsigned int temp;</p><p> temp=Get_temperature();//獲得溫度</p>
46、;<p> if(temp>=100) //如果溫度大于等于100度,置液晶顯示標(biāo)志為3</p><p> LCD_Dis_sign=3; //溫度大于等于100度</p><p> switch(LCD_Dis_sign)</p><p><b> {</b></p><p&g
47、t; case 0: Display_char(0xcb,' '); //如果溫度小于100度且為正,執(zhí)行case 0</p><p> Display_char(0xcc,time[temp/10]); //十位</p><p> Display_char(0xcd,time[temp%10]); //個(gè)位</p><p> Displ
48、ay_char(0xce,'C'); //溫度符號(hào)</p><p><b> break;</b></p><p> case 1:Display_char(0xcb,'-');//如果溫度為負(fù)數(shù),液晶顯示'-',執(zhí)行case 1</p><p> Display_char(0x
49、cc,time[temp/10]);</p><p> Display_char(0xcd,time[temp%10]);</p><p> Display_char(0xce,'C');</p><p><b> break;</b></p><p> case 3:Display_char(
50、0xcb,time[temp/100]);//如果溫度大于等于100度,執(zhí)行case 3</p><p> Display_char(0xcc,time[(temp%100)/10]);</p><p> Display_char(0xcd,time[(temp%100)%10]);</p><p> Display_char(0xce,'C'
51、);</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 時(shí)鐘代碼如下:</b></p><p><b> D
52、S1302.h:</b></p><p> #include<reg51.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int </p><p> sbit CE=P3^7;</p><p>
53、 sbit IO=P3^6;</p><p> sbit SCLK=P3^5;</p><p> #define W_SEC 0X80 </p><p> #define R_SEC 0X81 //讀寫(xiě)秒寄存器</p><p> #define W_MIN 0X82</p><p> #def
54、ine R_MIN 0X83 //讀寫(xiě)分寄存器</p><p> #define W_HOUR 0X84</p><p> #define R_HOUR 0X85 //讀寫(xiě)時(shí)寄存器</p><p> #define W_DAY 0X86</p><p> #define R_DAY 0X87 //讀寫(xiě)日寄存器&l
55、t;/p><p> #define W_MON 0X88</p><p> #define R_MON 0X89 //讀寫(xiě)月寄存器</p><p> #define W_WEEK 0X8A</p><p> #define R_WEEK 0X8B //讀寫(xiě)周寄存器</p><p> #define
56、W_YEAR 0X8C</p><p> #define R_YEAR 0X8D //讀寫(xiě)年寄存器</p><p> #define W_PROTECT 0X8E //寫(xiě)控制寄存器(主要用來(lái)允許禁止寫(xiě)保護(hù)) </p><p> /**************************DS1302寫(xiě)函數(shù)</p><p> 函數(shù)原型:
57、void Write_DS1302(uchar addr,uchar date)</p><p> 函數(shù)參數(shù):addr-----地址 date------數(shù)據(jù)</p><p><b> 函數(shù)返回值:無(wú)</b></p><p> 函數(shù)意義:向某個(gè)地址處寫(xiě)入某個(gè)數(shù)據(jù)</p><p> **************
58、**************************/</p><p> void Write_DS1302(uchar addr,char date)</p><p><b> {</b></p><p><b> uchar i;</b></p><p><b> CE=0;&
59、lt;/b></p><p><b> SCLK=0;</b></p><p><b> CE=1;</b></p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p><b>
60、 SCLK=0;</b></p><p> IO=(bit)(addr&0x01);</p><p><b> SCLK=1;</b></p><p> addr >>= 1;</p><p><b> }</b></p><p>
61、; for(i=0;i<8;i++)</p><p><b> {</b></p><p><b> SCLK=0;</b></p><p> IO=(bit)(date&0x01);</p><p><b> SCLK=1;</b></p>
62、<p> date >>= 1;</p><p><b> }</b></p><p><b> CE=0;</b></p><p><b> }</b></p><p> /**************************DS1
63、302讀函數(shù)</p><p> 函數(shù)原型:uchar Read_DS1302(uchar addr)</p><p> 函數(shù)參數(shù):addr-------地址</p><p> 函數(shù)返回值:讀取到的數(shù)據(jù)</p><p> 函數(shù)意義:在某個(gè)地址處讀取數(shù)據(jù)</p><p> ********************
64、*************/</p><p> uchar Read_DS1302(uchar addr)</p><p><b> {</b></p><p> uchar temp,i;</p><p><b> CE=0;</b></p><p><b&g
65、t; SCLK=0;</b></p><p><b> CE=1;</b></p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p><b> SCLK=0;</b></p><p&
66、gt; IO=(bit)(addr&0x01);</p><p><b> SCLK=1;</b></p><p> addr >>= 1; //先寫(xiě)入地址</p><p><b> }</b></p><p> for(i=0;i<8;i++)</p&g
67、t;<p><b> {</b></p><p><b> if(IO)</b></p><p> temp=temp|0x80;</p><p><b> SCLK=1;</b></p><p><b> SCLK=0;</b>
68、</p><p> temp >>= 1;</p><p><b> }</b></p><p><b> CE=0;</b></p><p> return (((temp&0xf0)>>4)*10+(temp&0x0f));//十六進(jìn)制轉(zhuǎn)換成十進(jìn)
69、制</p><p><b> }</b></p><p> /***************************初始化DS1302函數(shù)</p><p> 函數(shù)原型:Init_DS1302()</p><p><b> 函數(shù)參數(shù):無(wú)</b></p><p><
70、b> 函數(shù)返回值:無(wú)</b></p><p> 函數(shù)意義:對(duì)DS1302芯片各寄存器初始化</p><p> **********************************/</p><p> /***************************讀秒寄存器</p><p> 函數(shù)原型:uchar Read
71、_sec()</p><p><b> 函數(shù)參數(shù):無(wú)</b></p><p> 函數(shù)返回值:讀出秒的數(shù)據(jù)</p><p> 函數(shù)意義:讀出當(dāng)前秒的數(shù)據(jù)并返回</p><p> ************************************/</p><p> uchar Rea
72、d_sec()</p><p><b> {</b></p><p> uchar val;</p><p> val=Read_DS1302(R_SEC);</p><p> return val;</p><p><b> }</b></p>&l
73、t;p> /*************************讀分寄存器</p><p> 函數(shù)原型:uchar Read_min()</p><p><b> 函數(shù)參數(shù):無(wú)</b></p><p> 函數(shù)返回值:讀出FEN的數(shù)據(jù)</p><p> 函數(shù)意義:讀出當(dāng)前分的數(shù)據(jù)</p><
74、;p> ********************************/</p><p> uchar Read_min()</p><p><b> {</b></p><p> uchar val;</p><p> val=Read_DS1302(R_MIN);</p><p&
75、gt; return val;</p><p><b> }</b></p><p> /***************************讀時(shí)寄存器</p><p> 函數(shù)原型:uchar Read_hour()</p><p><b> 函數(shù)參數(shù):無(wú)</b></p>
76、<p> 函數(shù)返回值:讀出hour的數(shù)據(jù)</p><p> 函數(shù)意義:讀出當(dāng)前hour的數(shù)據(jù)并返回</p><p> *****************************************/</p><p> uchar Read_hour()</p><p><b> {</b><
77、/p><p> uchar val;</p><p> val=Read_DS1302(R_HOUR);</p><p> return val;</p><p><b> }</b></p><p> /***************************讀日寄存器</p>
78、<p> 函數(shù)原型:uchar Read_day()</p><p><b> 函數(shù)參數(shù):無(wú)</b></p><p><b> 函數(shù)返回值:</b></p><p> 函數(shù)意義:讀出當(dāng)前日的數(shù)據(jù)并返回</p><p> *****************************
79、****/</p><p> uchar Read_day()</p><p><b> {</b></p><p> uchar val;</p><p> val=Read_DS1302(R_DAY);</p><p> return val;</p><p>
80、;<b> }</b></p><p> /***************************讀月寄存器</p><p> 函數(shù)原型:uchar Read_mon()</p><p><b> 函數(shù)參數(shù):無(wú)</b></p><p> 函數(shù)返回值:讀出月寄存器數(shù)據(jù)</p>
81、<p> 函數(shù)意義:讀出月寄存器的數(shù)據(jù)并返回</p><p> **********************************/</p><p> uchar Read_mon()</p><p><b> {</b></p><p> uchar val;</p><p&g
82、t; val=Read_DS1302(R_MON);</p><p> return val;</p><p><b> }</b></p><p> /***************************讀周寄存器</p><p> 函數(shù)原型:uchar Read_week() 函數(shù)參數(shù):無(wú)</
83、p><p> 函數(shù)返回值:讀出 函數(shù)意義:讀出當(dāng)前</p><p> ****************************/</p><p> uchar Read_week()</p><p><b> {</b></p><p> uchar val;</p&g
84、t;<p> val=Read_DS1302(R_WEEK);</p><p> return val;</p><p><b> }</b></p><p> /***************************讀年寄存器</p><p> 函數(shù)原型:uchar Read_year()<
85、;/p><p><b> 函數(shù)參數(shù):無(wú)</b></p><p><b> 函數(shù)返回值:讀出</b></p><p><b> 函數(shù)意義:讀出</b></p><p> ******************************/</p><p>
86、 uchar Read_year()</p><p><b> {</b></p><p> uchar val;</p><p> val=Read_DS1302(R_YEAR);</p><p> return val;</p><p><b> }</b>&l
87、t;/p><p><b> 按鍵代碼如下:</b></p><p><b> key.c:</b></p><p> #include<reg51.h></p><p> sbit SET=P1^0;</p><p> sbit ADD=P1^1;</
88、p><p> sbit SUB=P1^2;</p><p> static unsigned char KEY;</p><p> static char min,hour,mon,day,year,week;</p><p> void ADD_Down();</p><p> void SUB_Down()
89、;</p><p> void Set_Key_down()</p><p><b> {</b></p><p> if(SET==0)//如果設(shè)置鍵按下</p><p><b> {</b></p><p> delay_15us();</p>&
90、lt;p> if(SET==0)</p><p><b> {</b></p><p> while(!SET);</p><p><b> KEY++;</b></p><p> switch(KEY)</p><p><b> {<
91、/b></p><p> case 1: Write_LCD1602_command(0xc4);</p><p> Write_LCD1602_command(0x0F);//液晶光標(biāo)在分位置閃爍</p><p> min=Read_DS1302(R_MIN);</p><p><b> break;</b&g
92、t;</p><p> case 2: Write_LCD1602_command(0xc1);</p><p> hour=Read_DS1302(R_HOUR);</p><p> //Write_LCD1602_command(0x0f);//液晶光標(biāo)在時(shí)位置閃爍</p><p><b> break; </b&
93、gt;</p><p> case 3: Write_LCD1602_command(0x89);</p><p> day=Read_DS1302(R_DAY);</p><p> //Write_LCD1602_command(0x0f);//液晶光標(biāo)在日位置閃爍</p><p><b> break;</b>
94、;</p><p> case 4: Write_LCD1602_command(0x86);</p><p> mon=Read_DS1302(R_MON);</p><p> //Write_LCD1602_command(0x0f);//液晶光標(biāo)在月位置閃爍</p><p><b> break;</b>&
95、lt;/p><p> case 5: Write_LCD1602_command(0x83);</p><p> year=Read_DS1302(R_YEAR);</p><p> //Write_LCD1602_command(0x0f);//液晶光標(biāo)在年位置閃爍</p><p><b> break;</b>&
96、lt;/p><p> case 6: Write_LCD1602_command(0x8c);</p><p> week=Read_DS1302(R_WEEK);</p><p> //Write_LCD1602_command(0x0f);//液晶光標(biāo)在周位置閃爍</p><p><b> break;</b>&
97、lt;/p><p> default: KEY=0;</p><p> Write_LCD1602_command(0x0c);//取消光標(biāo)閃爍</p><p> Write_DS1302(W_PROTECT,0X80);//允許寫(xiě)保護(hù)</p><p><b> break;</b></p><
98、;p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void ADD_Down()</p><p>&l
99、t;b> {</b></p><p> if(KEY!=0)</p><p><b> {</b></p><p> if(ADD==0)</p><p><b> {</b></p><p> delay_15us();</p>
100、<p> if(ADD==0)</p><p><b> {</b></p><p> while(!ADD);</p><p> switch(KEY)</p><p><b> {</b></p><p> case 1: min++;if(min=
101、=60)min=0;</p><p> Write_DS1302(W_MIN,(min/10)<<4|(min%10));</p><p> LCD_Dis_min();</p><p> Write_LCD1602_command(0xc4);</p><p><b> break;</b><
102、/p><p> case 2:hour++;if(hour==24)hour=0;</p><p> Write_DS1302(W_HOUR,(hour/10)<<4|(hour%10));</p><p> LCD_Dis_hour();</p><p> Write_LCD1602_command(0xc1);</p
103、><p><b> break;</b></p><p> case 3:day++;if(day==32)day=1;</p><p> Write_DS1302(W_DAY,(day/10)<<4|(day%10));</p><p> LCD_Dis_day();</p><p&
104、gt; Write_LCD1602_command(0x89);</p><p><b> break;</b></p><p> case 4:mon++;if(mon==13)mon=1;</p><p> Write_DS1302(W_MON,(mon/10)<<4|(mon%10));</p><
105、p> LCD_Dis_mon();</p><p> Write_LCD1602_command(0x86);</p><p><b> break;</b></p><p> case 5:year++;if(year==99)year=0;</p><p> Write_DS1302(W_YEAR,(
106、year/10)<<4|(year%10));</p><p> LCD_Dis_year();</p><p> Write_LCD1602_command(0x83);</p><p><b> break;</b></p><p> case 6:week++;if(week==8)week=1
107、;</p><p> Write_DS1302(W_WEEK,(week/10)<<4|(week%10));</p><p> LCD_Dis_week();</p><p> Write_LCD1602_command(0x8c);</p><p><b> break;</b></p>
108、;<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>&l
109、t;p> void SUB_Down()</p><p><b> {</b></p><p> if(KEY!=0)</p><p><b> {</b></p><p> if(SUB==0)</p><p><b> {</b>&
110、lt;/p><p> delay_15us();</p><p> if(SUB==0)</p><p><b> {</b></p><p> while(!SUB);</p><p> switch(KEY)</p><p><b> {</b&
111、gt;</p><p> case 1: min--;if(min<0)min=59;</p><p> Write_DS1302(W_MIN,(min/10)<<4|(min%10));</p><p> LCD_Dis_min();</p><p> Write_LCD1602_command(0xc4);<
112、;/p><p><b> break;</b></p><p> case 2:hour--;if(hour<0)hour=23;</p><p> Write_DS1302(W_HOUR,(hour/10)<<4|(hour%10));</p><p> LCD_Dis_hour();</p
113、><p> Write_LCD1602_command(0xc1);</p><p><b> break;</b></p><p> case 3:day--;if(day==0)day=31;</p><p> Write_DS1302(W_DAY,(day/10)<<4|(day%10));<
114、/p><p> LCD_Dis_day();</p><p> Write_LCD1602_command(0x89);</p><p><b> break;</b></p><p> case 4:mon--;if(mon==0)mon=12;</p><p> Write_DS1302
115、(W_MON,(mon/10)<<4|(mon%10));</p><p> LCD_Dis_mon();</p><p> Write_LCD1602_command(0x86);</p><p><b> break;</b></p><p> case 5:year--;if(year<0
116、)year=99;</p><p> Write_DS1302(W_YEAR,(year/10)<<4|(year%10));</p><p> LCD_Dis_year();</p><p> Write_LCD1602_command(0x83);</p><p><b> break;</b>&
117、lt;/p><p> case 6:week--;if(week==0)week=7;</p><p> Write_DS1302(W_WEEK,(week/10)<<4|(week%10));</p><p> LCD_Dis_week();</p><p> Write_LCD1602_command(0x8c);<
118、/p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> } </b>&
119、lt;/p><p><b> }</b></p><p><b> 顯示代碼如下:</b></p><p> LCD1602.h:</p><p> /***********************************************************</p>&
120、lt;p> P0-------DB0~DB7 P2^0----------LCD_RS</p><p> P2^1----------LCD_RW</p><p> P2^2----------LCD_E</p><p> ***********************************************************/&
121、lt;/p><p> #include<reg51.h></p><p> #define LCD_DB P0</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> sbit LCD_RS=P2
122、^4;</p><p> sbit LCD_RW=P2^5;</p><p> sbit LCD_E=P2^6;</p><p> /*******************定義申明函數(shù)**********************************/</p><p> unsigned char code table[]=&quo
123、t;Welcome LCD1602";</p><p> uchar table1[]="MONTUEWESTHUFRISATSUN";//每三個(gè)字母是一個(gè)星期X的簡(jiǎn)寫(xiě)</p><p> /***********************************************/</p><p> /***********
124、***延時(shí)函數(shù)**********************/</p><p> void delay_n10us(unsigned int n)</p><p><b> {</b></p><p> unsigned int i,j;</p><p> for(i=n;i>0;i--)</p>
125、<p> for(j=100;j>0;j--);</p><p><b> }</b></p><p> /*****************寫(xiě)指令函數(shù)*******************/</p><p> void Write_LCD1602_command(unsigned char cmd)</p&g
126、t;<p><b> {</b></p><p><b> LCD_RS=0;</b></p><p><b> LCD_RW=0;</b></p><p> LCD_DB=cmd;</p><p> delay_n10us(5);</p>
127、<p><b> LCD_E=1;</b></p><p> delay_n10us(15);</p><p><b> LCD_E=0;</b></p><p><b> }</b></p><p> /****************寫(xiě)數(shù)據(jù)函數(shù)****
128、***********/</p><p> void Write_LCD1602_data(unsigned char dat)</p><p><b> {</b></p><p><b> LCD_RS=1;</b></p><p><b> LCD_RW=0;</b&g
129、t;</p><p> LCD_DB=dat;</p><p> delay_n10us(5);</p><p><b> LCD_E=1;</b></p><p> delay_n10us(15);</p><p><b> LCD_E=0;</b></p
130、><p><b> }</b></p><p> /**************檢測(cè)忙狀態(tài)***********************/</p><p> void CHECK_LCD1602_Busy()</p><p><b> {</b></p><p> uc
131、har state;</p><p> LCD_RS=0; //RS為低電平0,RW為高電平時(shí)1,可以讀液晶模塊(忙或不忙)的狀態(tài) </p><p><b> LCD_RW=1;</b></p><p> LCD_E=1; //E=1,才允許讀寫(xiě) (滿足了E=R/W=1,RS=0)</p><p> del
132、ay_n10us(1);</p><p> state=LCD_DB; //將忙碌標(biāo)志電平賦給state</p><p> LCD_E=0; //將E恢復(fù)低電平</p><p> while(state&0X80);</p><p> delay_n10us(5);</p><p><b&g
133、t; }</b></p><p> /*************LCD開(kāi)機(jī)顯示函數(shù)******************/</p><p> void LCD1602_Init_display()</p><p><b> {</b></p><p><b> uint i;</b&g
134、t;</p><p> Write_LCD1602_command(0x80);</p><p> for(i=0;i<16;i++){</p><p> Write_LCD1602_data(table[i]);}</p><p><b> }</b></p><p> /***
135、*************初始化函數(shù)*********************/</p><p> void Init_LCD1602(void)</p><p><b> {</b></p><p> Write_LCD1602_command(0x38); //設(shè)置16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口</p
136、><p> Write_LCD1602_command(0x01); //清屏設(shè)置</p><p> Write_LCD1602_command(0x06);// 光標(biāo)移動(dòng)設(shè)置 N=1讀或?qū)懸粋€(gè)字符后地址指針加1 S=0 整屏顯示不移動(dòng)</p><p> Write_LCD1602_command(0x0c);//顯示開(kāi)及光標(biāo)設(shè)置 C=0 光標(biāo)不顯示 B=0
137、 光標(biāo)不閃爍</p><p> LCD1602_Init_display();//調(diào)用LCD1602_Init_display()函數(shù)在第一行顯示 "welcome LCD1602"</p><p><b> }</b></p><p> /*************液晶某處顯示某個(gè)字符函數(shù)************
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- ds18b20溫度計(jì)課程設(shè)計(jì)
- 課程設(shè)計(jì)--ds18b20數(shù)字溫度計(jì)
- ds18b20數(shù)字溫度計(jì)設(shè)計(jì)課程設(shè)計(jì)
- 單片機(jī)溫度計(jì)課程設(shè)計(jì)--基于ds18b20的溫度計(jì)
- 課程設(shè)計(jì)-基于ds18b20數(shù)字溫度計(jì)的設(shè)計(jì)
- 基于ds18b20的溫度計(jì)設(shè)計(jì)
- 數(shù)字溫度計(jì)ds18b20課程設(shè)計(jì)報(bào)告
- 基于ds18b20數(shù)字式溫度計(jì)課程設(shè)計(jì)
- 基于單片機(jī)設(shè)計(jì)的溫度計(jì)(ds18b20)課程設(shè)計(jì)
- ds18b20數(shù)字溫度計(jì)的設(shè)計(jì)
- 課程設(shè)計(jì)--基于單片機(jī)的ds18b20數(shù)字溫度計(jì)設(shè)計(jì)
- 傳感器課程設(shè)計(jì)-----ds18b20數(shù)字溫度計(jì)的設(shè)計(jì)
- ds18b20 數(shù)字溫度計(jì)外文翻譯
- 外文翻譯---ds18b20 數(shù)字溫度計(jì)
- 基于ds18b20的數(shù)字溫度計(jì)設(shè)計(jì)與實(shí)現(xiàn)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--ds18b20數(shù)字溫度計(jì)的設(shè)計(jì)與實(shí)現(xiàn)
- 課程設(shè)計(jì)--基于51單片機(jī)與ds18b20的數(shù)字溫度計(jì)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)----ds18b20數(shù)字溫度計(jì)論文
- 畢業(yè)設(shè)計(jì)---ds18b20數(shù)字溫度計(jì)的設(shè)計(jì)
- ds18b20 數(shù)字溫度計(jì)外文資料翻譯
評(píng)論
0/150
提交評(píng)論