版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、<p> 課 程 設 計 報 告 </p><p> 課程名稱 單片機應用 </p><p> 設計題目 基于DS18B20和1602的溫度計 </p><p> 專 業(yè) 計算機應用技術(shù) </p><p> 班
2、 級 </p><p><b> 一、設計目的</b></p><p> 在本設計中選用STC89C51型單片機作為主控制器件,采用DS18B20數(shù)字溫度傳感器作為測溫元件,通過1602LCD液晶顯示器實現(xiàn)溫度顯示。本設計的內(nèi)容主要分為三部分,一是系統(tǒng)硬件設計,包括溫度采集電路和顯示電路;二是對系統(tǒng)
3、軟件部分的設計,應用C語言實現(xiàn)溫度的采集與顯示;三是通過1602LCD液晶顯示與DS1302芯片顯示其時間。通過DS18B20直接讀取被測溫度值,送入單片機進行數(shù)據(jù)處理,之后進行輸出顯示,最終完成了數(shù)字溫度計的總體設計。其系統(tǒng)構(gòu)成簡單,信號采集效果好,數(shù)據(jù)處理速度快,便于實際檢測使用。</p><p><b> 二、設計指標</b></p><p><b>
4、; 2.1 設計要求</b></p><p> (1).具有實時顯示溫度的功能,精度為1;</p><p> (2).具備在液晶上顯示年、月、日、星期、時、分、秒的功能; (3).具備年、月、日、星期、時、分、秒校準功能; (4).具有與實時時間同步的功能。 2.2 單片機芯片的選擇采用STC89C51芯片作為硬件核心,內(nèi)部具有4KB ROM 存儲空間,能于3V的
5、超低壓工作,而且與MCS-51系列單片機完全兼容。2.3 顯示模塊的選擇采用1602液晶顯示屏,該液晶顯示屏的顯示功能強大,內(nèi)置192種字符,可顯示大量符號、數(shù)字,清晰可見,而且功率消耗小壽命長抗干擾能力強。所以在此設計中采用1602液晶顯示屏。2.4 時鐘的選擇采用DS1302時鐘芯片實現(xiàn)時鐘,DS1302芯片是一種高性能的時鐘芯片,可自動對秒、分、時、日、周、月、年進行計數(shù),而且精度高,位的RAM做為數(shù)據(jù)暫存區(qū),工作電壓2.
6、5V~5.5V范圍內(nèi),2.5V時耗電小于300nA。2.5溫度傳感器的選擇采用數(shù)字溫度芯片DS18B20 測量溫度,輸出信號全數(shù)字化。便于單片機處理及控制,省去傳統(tǒng)的測溫方法的很多外圍電路。且該芯片的物理化學性很穩(wěn)定,它能用做工業(yè)測溫元件,此元件線形較好。在0—100 攝氏度時,最大線形偏差</p><p><b> 三、總體框圖設計</b></p><p>
7、 四、功能模塊及原理說明</p><p> 1.單片機芯片模塊:</p><p> STC89C51RC是采用8051核的ISP(In System Programming)在系統(tǒng)可編程芯片,最高工作時鐘頻率為80MHz,片內(nèi)含8K Bytes的可反復擦寫1000次的Flash只讀程序存儲器,器件兼容標準MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP
8、Flash存儲單元,具有在系統(tǒng)可編程(ISP)特性,配合PC端的控制程序即可將用戶的程序代碼下載進單片機內(nèi)部,省去了購買通用編程器,而且速度更快。STC89C52RC系列單片機是單時鐘/機器周期(1T)的兼容8051 內(nèi)核單片機,是高速/ 低功耗的新一代8051 單片機,全新的流水線/精簡指令集結(jié)構(gòu),內(nèi)部集成MAX810 專用復位電路。STC89C51RC實物圖如圖一所示,引腳圖如圖二所示:</p><p>
9、圖一 圖二</p><p><b> 顯示模塊:</b></p><p> 1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊。它由若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符,每位之間有一個點距的間隔,每行之
10、間也有間隔,起到了字符間距和行間距的作用,1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個字符液晶模塊(顯示字符和數(shù)字)。1602LCD顯示器實物圖如圖三:</p><p> 圖三 圖四</p><p><b> 3.時鐘芯片模塊:</b></p><p>
11、DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產(chǎn)品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,
12、同時提供了對后備電源進行涓細電流充電的能力。DS1302時鐘芯片實物圖如圖四:</p><p><b> 溫度傳感器模塊:</b></p><p> DS18B20數(shù)字溫度傳感器接線方便,封裝成后可應用于多種場合,如管道式,螺紋式,磁鐵吸附式,不銹鋼封裝式,型號多種多樣,有LTM8877,LTM8874等等。主要根據(jù)應用場合的不同而改變其外觀。封裝后的DS18B2
13、0可用于電纜溝測溫,高爐水循環(huán)測溫,鍋爐測溫,機房測溫,農(nóng)業(yè)大棚測溫,潔凈室測溫,彈藥庫測溫等各種非極限溫度場合。耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設備數(shù)字測溫和控制領域。DS1802數(shù)字溫度傳感器DS18B20內(nèi)部結(jié)構(gòu)圖如圖五所示,實物管腳分布圖如圖六所示:</p><p> 圖五 圖六
14、 </p><p><b> 五、設計驗證</b></p><p> 1.在仿真軟件上選取以上元件,元件圖如圖七所示:</p><p> 圖七 圖八</p><p> 2.在仿真軟件上進行布局連線,如
15、圖八所示:</p><p><b> 3.程序設計:</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ù)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(); //延時750us </p><p> DQ=1; //釋放總線</p>
28、<p> delay_15us(); //延時15us,如果DS18B20初始化成功,會把總線DQ拉低</p><p> while(DQ); //等待總線被拉低</p><p> delay_240us(); </p><p> DQ=1; //拉高電平釋放總線</p><p><b>
29、; }</b></p><p> /***********************DS18B20寫函數(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) //判斷寫0還是寫1</p><p><b> DQ=1;</b></p>
32、<p><b> else</b></p><p><b> DQ=0;</b></p><p> delay_45us(); //延時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; //先右移一位,消耗一個for循環(huán),如果不這樣做,讀出的數(shù)據(jù)會不正確</p><p><b> DQ=0;</b></p><p> _nop_();_nop_();</p><p> DQ=1; //根據(jù)手冊,需釋放總線</p><p> _nop_();_nop_();<
36、/p><p> _nop_();_nop_();</p><p> if(DQ) //判斷總線讀出的數(shù)據(jù)</p><p> temp=temp|0x80; //temp與0x80或運算的作用?</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(); //復位</p><p> Write_DS18B20(0xcc); //跳過ROM</p><p> Write_DS18B20(0x44); //開始轉(zhuǎn)換溫度 對芯片寫入0x44</p><p> //芯片接收轉(zhuǎn)換指令后,把一些溫度有
39、關的模擬量轉(zhuǎn)變成數(shù)字信號,再把此數(shù)值放入相應的RAM上</p><p> delay_100ms(); //延時100ms,轉(zhuǎn)換時間 這里如果太長,讀出的會慢</p><p> DS18B20_Init(); //復位</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(); //溫度開始轉(zhuǎn)換并發(fā)出讀取命令</p><p> temp1=Read_DS18B20();</p><p> temp2=Read_DS18B20
42、(); //讀取暫存器前兩個字節(jié)</p><p> DS18B20_Init(); //讀取完前兩個字節(jié)后,終止讀取</p><p> if((temp2&0xf8)==0xf8) //判斷,如果讀取的溫度是負數(shù)</p><p><b> {</b></p><p> LCD_Di
43、s_sign=1; //液晶顯示標志 溫度為負數(shù)</p><p> return ((~((temp2<<8)|temp1)+1)*0.0625); //單片機二進制轉(zhuǎn)十進制</p><p> //把Temp2的值左移8位,然后或Temp1,非運算,再加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度,置液晶顯示標志為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]); //個位</p><p> Displ
48、ay_char(0xce,'C'); //溫度符號</p><p><b> break;</b></p><p> case 1:Display_char(0xcb,'-');//如果溫度為負數(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> 時鐘代碼如下:</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 //讀寫秒寄存器</p><p> #define W_MIN 0X82</p><p> #def
54、ine R_MIN 0X83 //讀寫分寄存器</p><p> #define W_HOUR 0X84</p><p> #define R_HOUR 0X85 //讀寫時寄存器</p><p> #define W_DAY 0X86</p><p> #define R_DAY 0X87 //讀寫日寄存器&l
55、t;/p><p> #define W_MON 0X88</p><p> #define R_MON 0X89 //讀寫月寄存器</p><p> #define W_WEEK 0X8A</p><p> #define R_WEEK 0X8B //讀寫周寄存器</p><p> #define
56、W_YEAR 0X8C</p><p> #define R_YEAR 0X8D //讀寫年寄存器</p><p> #define W_PROTECT 0X8E //寫控制寄存器(主要用來允許禁止寫保護) </p><p> /**************************DS1302寫函數(shù)</p><p> 函數(shù)原型:
57、void Write_DS1302(uchar addr,uchar date)</p><p> 函數(shù)參數(shù):addr-----地址 date------數(shù)據(jù)</p><p><b> 函數(shù)返回值:無</b></p><p> 函數(shù)意義:向某個地址處寫入某個數(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ù)意義:在某個地址處讀取數(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; //先寫入地址</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));//十六進制轉(zhuǎn)換成十進
69、制</p><p><b> }</b></p><p> /***************************初始化DS1302函數(shù)</p><p> 函數(shù)原型:Init_DS1302()</p><p><b> 函數(shù)參數(shù):無</b></p><p><
70、b> 函數(shù)返回值:無</b></p><p> 函數(shù)意義:對DS1302芯片各寄存器初始化</p><p> **********************************/</p><p> /***************************讀秒寄存器</p><p> 函數(shù)原型:uchar Read
71、_sec()</p><p><b> 函數(shù)參數(shù):無</b></p><p> 函數(shù)返回值:讀出秒的數(shù)據(jù)</p><p> 函數(shù)意義:讀出當前秒的數(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ù):無</b></p><p> 函數(shù)返回值:讀出FEN的數(shù)據(jù)</p><p> 函數(shù)意義:讀出當前分的數(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> /***************************讀時寄存器</p><p> 函數(shù)原型:uchar Read_hour()</p><p><b> 函數(shù)參數(shù):無</b></p>
76、<p> 函數(shù)返回值:讀出hour的數(shù)據(jù)</p><p> 函數(shù)意義:讀出當前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ù):無</b></p><p><b> 函數(shù)返回值:</b></p><p> 函數(shù)意義:讀出當前日的數(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ù):無</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ù):無</
83、p><p> 函數(shù)返回值:讀出 函數(shù)意義:讀出當前</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ù):無</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)//如果設置鍵按下</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);//液晶光標在分位置閃爍</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);//液晶光標在時位置閃爍</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);//液晶光標在日位置閃爍</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);//液晶光標在月位置閃爍</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);//液晶光標在年位置閃爍</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);//液晶光標在周位置閃爍</p><p><b> break;</b>&
97、lt;/p><p> default: KEY=0;</p><p> Write_LCD1602_command(0x0c);//取消光標閃爍</p><p> Write_DS1302(W_PROTECT,0X80);//允許寫保護</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";//每三個字母是一個星期X的簡寫</p><p> /***********************************************/</p><p> /***********
124、***延時函數(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> /*****************寫指令函數(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> /****************寫數(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> /**************檢測忙狀態(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為高電平時1,可以讀液晶模塊(忙或不忙)的狀態(tài) </p><p><b> LCD_RW=1;</b></p><p> LCD_E=1; //E=1,才允許讀寫 (滿足了E=R/W=1,RS=0)</p><p> del
132、ay_n10us(1);</p><p> state=LCD_DB; //將忙碌標志電平賦給state</p><p> LCD_E=0; //將E恢復低電平</p><p> while(state&0X80);</p><p> delay_n10us(5);</p><p><b&g
133、t; }</b></p><p> /*************LCD開機顯示函數(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); //設置16×2顯示,5×7點陣,8位數(shù)據(jù)接口</p
136、><p> Write_LCD1602_command(0x01); //清屏設置</p><p> Write_LCD1602_command(0x06);// 光標移動設置 N=1讀或?qū)懸粋€字符后地址指針加1 S=0 整屏顯示不移動</p><p> Write_LCD1602_command(0x0c);//顯示開及光標設置 C=0 光標不顯示 B=0
137、 光標不閃爍</p><p> LCD1602_Init_display();//調(diào)用LCD1602_Init_display()函數(shù)在第一行顯示 "welcome LCD1602"</p><p><b> }</b></p><p> /*************液晶某處顯示某個字符函數(shù)************
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ds18b20溫度計課程設計
- 課程設計--ds18b20數(shù)字溫度計
- ds18b20數(shù)字溫度計設計課程設計
- 單片機溫度計課程設計--基于ds18b20的溫度計
- 課程設計-基于ds18b20數(shù)字溫度計的設計
- 基于ds18b20的溫度計設計
- 數(shù)字溫度計ds18b20課程設計報告
- 基于ds18b20數(shù)字式溫度計課程設計
- 基于單片機設計的溫度計(ds18b20)課程設計
- ds18b20數(shù)字溫度計的設計
- 課程設計--基于單片機的ds18b20數(shù)字溫度計設計
- 傳感器課程設計-----ds18b20數(shù)字溫度計的設計
- ds18b20 數(shù)字溫度計外文翻譯
- 外文翻譯---ds18b20 數(shù)字溫度計
- 基于ds18b20的數(shù)字溫度計設計與實現(xiàn)
- 單片機課程設計報告--ds18b20數(shù)字溫度計的設計與實現(xiàn)
- 課程設計--基于51單片機與ds18b20的數(shù)字溫度計設計
- 畢業(yè)設計----ds18b20數(shù)字溫度計論文
- 畢業(yè)設計---ds18b20數(shù)字溫度計的設計
- ds18b20 數(shù)字溫度計外文資料翻譯
評論
0/150
提交評論