欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12224|回復: 12
打印 上一主題 下一主題
收起左側

單片機LCD1602溫度計實驗 Proteus仿真加源程序

  [復制鏈接]
跳轉到指定樓層
樓主
51單片機LCD1602液晶顯示的溫度計的仿真原理圖(proteus工程文件可到本帖附件下載):



單片機源程序:

  1. //--------------------------------------------------------------------------------------------
  2. //程序名:  LCD_TEMP09-1.c
  3. //程序功能:LCD溫度計
  4. //--------------------------------------------------------------------------------------------
  5. #include <reg51.h>   
  6. #include<intrins.h>                             //包含_nop_()函數定義的頭文件
  7. sbit RS=P2^5;                                   // 引腳定義  
  8. sbit RW=P2^6;                                                           
  9. sbit EN=P2^7;      
  10. sbit busy=P0^7;                                 // "忙"標志位      
  11. #define LCD P0                                  //命令或數據線
  12. sbit DQ=P2^0;
  13.   
  14. //代碼表
  15. unsigned char code TAB1[]={ 0x0c,0x12,0x12,0x0c,
  16.                             0x00,0x00,0x00,0x00,
  17.                           };
  18. //字符表
  19. unsigned char code TAB2[]={"DS18B20  OK"};  
  20. unsigned char code Error[]={"Error!Check!"};     //說明沒有檢測到DS18B20
  21. unsigned char code digit[10]={"0123456789"};     //定義字符數組顯示數字
  22. unsigned char code TEMP[]={"TEMP:"};             //說明顯示的是溫度
  23. unsigned char fuhao;

  24. //------------------------------------  延時函數  -------------------------------------------

  25. void delay(unsigned int t)                      //延時若干微秒
  26. {
  27.    while(t--);
  28. }

  29. //---------------------------------- 判斷液晶顯示器是否忙函數 ----------------------------------

  30. CHECK_BF()                                      //判斷是否忙碌
  31. {
  32.   do
  33.    {
  34.     LCD=0xff;   
  35.     RS=0;                                       // RS=0,選擇指令寄存器
  36.     RW=1;                                       // RW=1,選擇讀模式
  37.     EN=0;                                       // 執行顯示命令
  38.     EN=1;                                       // 允許讀/寫
  39.    }  
  40.   while(busy);                                  //busy為高電平表示忙,循環等待
  41. }

  42. //--------------------------------------  寫命令函數  -----------------------------------

  43. WR_COMM()                                       //寫命令
  44. {
  45.   RS=0;                                         // RS=0,選擇指令寄存器
  46.   RW=0;                                         // RW=0,選擇寫模式
  47.   EN=0;                                         // 執行顯示命令
  48.   CHECK_BF();                                   // 等待
  49.   EN=1;                                         // E=1,允許讀/寫LCD
  50. }

  51. //-------------------------------------- 寫數據函數 -------------------------------------

  52. WR_DATA()                                       //寫數據
  53. {
  54.   RS=1;                                         // RS=1,選擇數據寄存器
  55.   RW=0;                                         //準備寫入數據
  56.   EN=0;                                         //執行顯示命令
  57.   CHECK_BF();                                   //判斷液晶模塊是否忙
  58.   EN=1;                                         // E=1,允許讀/寫LCD
  59. }

  60. //--------------------------------------- 初始化函數   ----------------------------------

  61. INIT_LCD()                                       //初始化
  62. {
  63.    unsigned char i=200;
  64.     {
  65.       while(--i);
  66.       LCD=0x01;                                 //清屏并光標復位
  67.       WR_COMM();                                //寫入命令
  68.       LCD=0x38;                                 //設置顯示模式:8位2行5x7點陣
  69.       WR_COMM();
  70.       LCD=0x0c;                                 //開顯示屏
  71.           WR_COMM();
  72.       LCD=0x06;                                 //文字不動,光標自動右移
  73.       WR_COMM();                                //寫入命令
  74.     }
  75. }

  76.        
  77. //--------------------------------  顯示溫度標記字符C函數 ----------------------------

  78. TEMP_BJ()                                       //顯示字符C
  79.      {          
  80.            LCD=0xce;                                  //寫入顯示起始地址                 
  81.        WR_COMM();                                 //寫入命令
  82.        LCD=('C' );
  83.            WR_DATA();                                 //送出                        
  84.         }       
  85.       
  86. //----------------------------------- 自定義溫度標志符函數 --------------------------------
  87.   STORE_DATA()
  88.     {
  89.        unsigned char i;
  90.            LCD=0x40;                                      // 指定CG RAM起始地址                 
  91.        WR_COMM();                                     //寫入命令                  
  92.        for(i=0;i<9;i++)                                
  93.         {
  94.           LCD=TAB1[i];                                //提取字符
  95.           WR_DATA();                                  //送出
  96.         }         
  97.            LCD=0xcd;                                      //寫入顯示起始地址
  98.            WR_COMM();                                     //寫入命令
  99.        LCD=0x00;                                      //CGRAM內第0號圖形
  100.        WR_DATA();                                           //寫入數據                          
  101.      
  102.            TEMP_BJ();
  103.           
  104.   }
  105.                

  106. //------------------------------------------- DS18B20初始化函數 --------------------------------------

  107. bit INIT_1820(void)
  108. {
  109.    bit flag;                                         //flag為標志符
  110.    DQ = 1;                                           //DQ復位
  111.    delay(3);                                         //稍作延時
  112.    DQ = 0;                                           //將數據線從高拉低,保持480~960us
  113.    delay(80);
  114.    DQ = 1;                                           //釋放數據線
  115.    delay(10);
  116.    flag=DQ;                                          //DQ=0表示存在      
  117.    delay(25);
  118.    return (flag);                                    //返回檢測標志
  119. }

  120. //------------------------------------------  讀出DS18B20函數 ----------------------------------------

  121. unsigned char READ_1820(void)
  122. {
  123.    unsigned char i=0;
  124.    unsigned char dat;                               //儲存讀出的一個字節數據
  125.    for (i=0;i<8;i++)
  126.    {
  127.      DQ =1;                                          //將數據線拉高
  128.      DQ = 0;                                         //將數據線從高拉低,啟動讀時序
  129.      dat>>=1;  
  130.      DQ = 1;                                         //將數據線拉高,為輸出電平作準備
  131.      _nop_();
  132.          if(DQ==1)
  133.      dat|=0x80;                                      //讀數據,存入dat
  134.      else
  135.      dat|=0x00;                                      //讀數據,存入dat
  136.      delay(3);
  137.         }                     
  138.    return(dat);                                       //返回讀出的十進制數據
  139. }

  140. //--------------------------------------------- 寫入DS18B20函數 ---------------------------------------------

  141. WRITE_1820(unsigned char dat)
  142. {
  143.    unsigned char i=0;
  144.    for (i=0; i<8; i++)
  145.     {
  146.       DQ =1;                                       // 先將數據線拉高
  147.       DQ=0;                                        //數據線從高拉低,開始寫入      
  148.       DQ=dat&0x01;                                 //利用與運算取出要寫的某位二進制數據,                  
  149.       delay(3);
  150.       DQ=1;                                        //釋放數據線      
  151.       _nop_();         
  152.       dat>>=1;                                     //將dat中的各二進制位數據右移1位
  153.    }
  154.       delay(3);
  155. }
  156. //---------------------------------------- 顯示錯誤信息函數 ------------------------------------------

  157. void DISP_ERR(void)
  158.   {
  159.       unsigned char i;
  160.   
  161.       LCD=0x80;                                    //寫顯示地在第1行第1列
  162.       WR_COMM();
  163.       i = 0;                                       //從第一個字符開始顯示
  164.      while(Error[i] != '\0')                       //寫到結束標志
  165.       {      
  166.         LCD=(Error[i]);                            //將字符常量寫入LCD
  167.         WR_DATA();
  168.             i++;                                       //指向下一個字符
  169.         delay(1000);                               //延時
  170.           }
  171.      while(1);                                      //循環,等待查明原因   
  172.   }

  173. //-------------------------------------- 顯示溫度的小數點 ------------------------------------------
  174.   
  175. void DISP_D(void)
  176. {         
  177.    
  178.   LCD=0xc9;                                       //寫顯示地址在第2行第10列
  179.   WR_COMM();
  180.   LCD=('.');
  181.   WR_DATA();   
  182.   delay(200);                                     //延時一點時間
  183. }

  184. //------------------------------------------ 顯示TEMP字符函數 ------------------------------------------------

  185.    void DISP_TEMP(void)  
  186.   
  187.     {
  188.            unsigned char i;
  189.            LCD=0xc0;                                  //寫入顯示起始地址                 
  190.        WR_COMM();                                 //寫入命令
  191.        for(i=0;i<5;i++)                                
  192.         {
  193.          LCD=TEMP[i];                             //提取字符
  194.          WR_DATA();                               //送出
  195.         }                                                        
  196.     }
  197.    
  198. //------------------------------------------- 顯示菜單函數 --------------------------------------------
  199. DISP_EXP( )
  200.      {
  201.            unsigned char i;
  202.            LCD=0x83;                                    //寫入顯示起始地址                 
  203.        WR_COMM();                                   //寫入命令
  204.        for(i=0;i<11;i++)                                
  205.         {
  206.          LCD=TAB2[i];                                //提取字符
  207.          WR_DATA();                                  //送出
  208.         }                          
  209.           DISP_TEMP();
  210.           DISP_D();
  211.         }
  212.    
  213. //---------------------------------------------- 讀溫度函數 -----------------------------------------

  214. RE_TEMP()
  215. {
  216.    unsigned char time;
  217.    INIT_1820();                                      //將DS18B20初始化
  218.    WRITE_1820(0xCC);                                 // 跳過讀序號列號的操作
  219.    WRITE_1820(0x44);                                 // 啟動溫度轉換   
  220.    for(time=0;time<100;time++);         
  221.    INIT_1820();                                      //將DS18B20初始化
  222.    WRITE_1820(0xCC);                                 //跳過讀序號列號的操作
  223.    WRITE_1820(0xBE);                                 //讀取溫度的低位和高位
  224. }

  225. //------------------------------------------ 顯示溫度正負的符號 ---------------------------------------
  226.    
  227. void DISP_ZF(unsigned char fuhao)
  228. {
  229.   unsigned char show;   
  230. show=fuhao;      
  231.   LCD=0xc5;                                         //寫顯示地址在第2行第10列
  232.   WR_COMM();
  233.   LCD=(show);                                       //將小數點的字符常量寫入LCD
  234.   WR_DATA();
  235.   delay(200);                                       //延時一點時間
  236. }

  237. //---------------------------------------- 顯示溫度的整數部分函數 ----------------------------------------

  238. void DISP_TEMP1(unsigned char x)
  239. {
  240.   unsigned char j,k,l;                              //j,k,l分別儲存溫度的百位、十位和個位
  241.   j=x/100;                                          //取百位
  242.   k=(x%100)/10;                                     //取十位
  243.   l=x%10;                                           //取個位
  244.   LCD=0xc6;                                         //寫顯示地址在第2行第7列
  245.   WR_COMM();
  246.   LCD=(digit[j]);
  247.   WR_DATA();
  248.   LCD=0xc7;
  249.   WR_COMM();
  250.   LCD=(digit[k]);
  251.   WR_DATA();
  252.   LCD=0xc8;
  253.   WR_COMM();
  254.   LCD=(digit[l]);
  255.   WR_DATA();
  256.   delay(200);                                       //延時一點時間
  257. }

  258. //---------------------------------------- 顯示溫度的小數數部分函數 -----------------------------------------

  259. void DISP_TEMP2(unsigned char x)
  260. {
  261.    LCD=0xca;                                         //寫顯示地址在第2行第11列
  262.    WR_COMM();
  263.    LCD=(digit[x]);
  264.    WR_DATA();                                        //將小數部分寫入LCD
  265.    delay(200);                                       //延時一點時間
  266. }

  267. //----------------------------------------  溫度數據轉換顯示函數 -------------------------------------------
  268.    
  269. void CONV_TEMP(void)  
  270. {
  271.    unsigned char TL;                                  //儲存溫度低位
  272.    unsigned char TH;                                  //儲存溫度高位
  273.    unsigned char TN;                                  //儲存整數部分
  274.    unsigned char TD;                                  //儲存小數部分

  275.    while(1)                                           //不斷檢測顯示溫度
  276.     {
  277.       RE_TEMP();                                      //讀溫度函數
  278. //-------------------
  279.           TL=READ_1820();                                 //先讀溫度值低位
  280.       TH=READ_1820();                                 //接著讀溫度值高位

  281.         if(TH>=0xf8)
  282.          {
  283.            DISP_ZF('-');
  284.            if(TL==0)
  285.             {
  286.               TH=(~TH+1)&0x03;
  287.               TN=TH*16+TL/16;
  288.               TD=(TL%16)*10/16;
  289.               goto loopshow;
  290.             }
  291.    
  292.            TH=~TH&0x03;
  293.            TL=~TL+1;
  294.            TN=TH*16+TL/16;
  295.            TD=(TL%16)*10/16;
  296.            goto loopshow;
  297.         }
  298.           DISP_ZF('+');
  299.           TN=TH*16+TL/16;                             //計算溫度值整數部分           
  300.           TD=(TL%16)*10/16;                           //計算溫度的小數部分
  301.           loopshow:                  
  302. //------------------------
  303.         DISP_TEMP1(TN);                                  //顯示溫度的整數部分
  304.     DISP_TEMP2(TD);                                 //顯示溫度的小數部分           
  305.     delay(100);   
  306.   }
  307. }
  308. //---------------------------------------- 主函數 ----------------------------------------------   

  309. void main(void)
  310. {   
  311.    INIT_LCD();                                       //LCD初始化函數
  312.    delay(100);   
  313.    if(INIT_1820()==1)                                //DS18B20初始化函數
  314.    DISP_ERR();                                       //顯示錯誤信息函數
  315.    STORE_DATA();                                     //自定義溫度標志符函數
  316.    DISP_EXP();                                       //顯示菜單函數
  317.    CONV_TEMP();                                      //溫度數據轉換顯示函數


  318. …………限于本文篇幅 余下代碼請從51黑下載附件…………


復制代碼


該系列源碼包含有很多非常經典,代碼風格十分規范,而且注釋詳細的單片機例程,還帶仿真,對于MCU學習特別是初學者是很有幫助的,全部源碼下載(共25個項目):http://www.raoushi.com/bbs/dpj-79328-1.html

本例程下載(含proteus仿真工程文件與源碼):
單片機LCD1602溫度計實驗.rar (76.76 KB, 下載次數: 291)

評分

參與人數 6黑幣 +30 收起 理由
slender宇 + 5 贊一個!
天才2333333 + 5 很給力!
Jehu_Yu + 5 很給力!
fyn162011 + 5 很給力!
滄? + 5 絕世好帖!
201511106109 + 5 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂4 踩
回復

使用道具 舉報

無效樓層,該帖已經被刪除
板凳
ID:162634 發表于 2017-3-30 12:42 來自觸屏版 | 只看該作者
可以。。
回復

使用道具 舉報

地板
ID:208351 發表于 2017-6-6 19:24 | 只看該作者
請問在這個基礎上怎么加報警器,并且可以手動設置溫度上限呢
回復

使用道具 舉報

5#
ID:212907 發表于 2017-6-20 13:02 | 只看該作者
完美!
回復

使用道具 舉報

6#
ID:257583 發表于 2017-12-5 10:44 | 只看該作者
好貼,很給力!
回復

使用道具 舉報

7#
ID:260460 發表于 2017-12-12 01:05 | 只看該作者
剛好要用到,太有幫助了
回復

使用道具 舉報

8#
ID:320097 發表于 2018-5-30 21:54 | 只看該作者
新手看得云里霧里的
回復

使用道具 舉報

9#
ID:415717 發表于 2018-10-28 23:54 | 只看該作者
很實用,謝謝樓主
回復

使用道具 舉報

10#
ID:410674 發表于 2019-3-5 16:30 | 只看該作者
正需要這個,謝謝啦
回復

使用道具 舉報

11#
ID:492403 發表于 2019-3-17 09:56 | 只看該作者
感謝分享
回復

使用道具 舉報

12#
ID:491410 發表于 2019-3-17 12:01 | 只看該作者
感謝分享,多謝
回復

使用道具 舉報

13#
無效樓層,該帖已經被刪除
14#
ID:558989 發表于 2019-6-10 15:04 | 只看該作者
感謝感謝
回復

使用道具 舉報

15#
ID:563106 發表于 2019-6-19 09:15 | 只看該作者
怎么能在加個NRF24L01無線傳輸模塊呢?
回復

使用道具 舉報

16#
無效樓層,該帖已經被刪除
17#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表