2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩27頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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>  專 業(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 專用復(fù)位電路。STC89C51RC實(shí)物圖如圖一所示,引腳圖如圖二所示:</p><p>  

9、圖一 圖二</p><p><b>  顯示模塊:</b></p><p>  1602液晶也叫1602字符型液晶,它是一種專門(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論