久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復制鏈接]
跳轉到指定樓層
樓主
ID:175881 發(fā)表于 2017-3-30 01:35 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
51單片機LCD1602液晶顯示的溫度計的仿真原理圖(proteus工程文件可到本帖附件下載):



單片機源程序:

  1. //--------------------------------------------------------------------------------------------
  2. //程序名:  LCD_TEMP09-1.c
  3. //程序功能:LCD溫度計
  4. //--------------------------------------------------------------------------------------------
  5. #include <reg51.h>   
  6. #include<intrins.h>                             //包含_nop_()函數(shù)定義的頭文件
  7. sbit RS=P2^5;                                   // 引腳定義  
  8. sbit RW=P2^6;                                                           
  9. sbit EN=P2^7;      
  10. sbit busy=P0^7;                                 // "忙"標志位      
  11. #define LCD P0                                  //命令或數(shù)據線
  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"};     //定義字符數(shù)組顯示數(shù)字
  22. unsigned char code TEMP[]={"TEMP:"};             //說明顯示的是溫度
  23. unsigned char fuhao;

  24. //------------------------------------  延時函數(shù)  -------------------------------------------

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

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

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

  42. //--------------------------------------  寫命令函數(shù)  -----------------------------------

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

  51. //-------------------------------------- 寫數(shù)據函數(shù) -------------------------------------

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

  60. //--------------------------------------- 初始化函數(shù)   ----------------------------------

  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函數(shù) ----------------------------

  78. TEMP_BJ()                                       //顯示字符C
  79.      {          
  80.            LCD=0xce;                                  //寫入顯示起始地址                 
  81.        WR_COMM();                                 //寫入命令
  82.        LCD=('C' );
  83.            WR_DATA();                                 //送出                        
  84.         }       
  85.       
  86. //----------------------------------- 自定義溫度標志符函數(shù) --------------------------------
  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();                                           //寫入數(shù)據                          
  101.      
  102.            TEMP_BJ();
  103.           
  104.   }
  105.                

  106. //------------------------------------------- DS18B20初始化函數(shù) --------------------------------------

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

  120. //------------------------------------------  讀出DS18B20函數(shù) ----------------------------------------

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

  140. //--------------------------------------------- 寫入DS18B20函數(shù) ---------------------------------------------

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

  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);                                      //循環(huán),等待查明原因   
  172.   }

  173. //-------------------------------------- 顯示溫度的小數(shù)點 ------------------------------------------
  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字符函數(shù) ------------------------------------------------

  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. //------------------------------------------- 顯示菜單函數(shù) --------------------------------------------
  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. //---------------------------------------------- 讀溫度函數(shù) -----------------------------------------

  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);                                       //將小數(shù)點的字符常量寫入LCD
  234.   WR_DATA();
  235.   delay(200);                                       //延時一點時間
  236. }

  237. //---------------------------------------- 顯示溫度的整數(shù)部分函數(shù) ----------------------------------------

  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. //---------------------------------------- 顯示溫度的小數(shù)數(shù)部分函數(shù) -----------------------------------------

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

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

  275.    while(1)                                           //不斷檢測顯示溫度
  276.     {
  277.       RE_TEMP();                                      //讀溫度函數(shù)
  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;                             //計算溫度值整數(shù)部分           
  300.           TD=(TL%16)*10/16;                           //計算溫度的小數(shù)部分
  301.           loopshow:                  
  302. //------------------------
  303.         DISP_TEMP1(TN);                                  //顯示溫度的整數(shù)部分
  304.     DISP_TEMP2(TD);                                 //顯示溫度的小數(shù)部分           
  305.     delay(100);   
  306.   }
  307. }
  308. //---------------------------------------- 主函數(shù) ----------------------------------------------   

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


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


復制代碼


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

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

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91久久久久久久久久久久久 | 成人午夜激情 | 久久久日韩精品一区二区三区 | 成人在线播放网站 | 毛片一区二区三区 | 欧美亚洲成人网 | 国产高清区 | 亚洲精品在线免费观看视频 | 美女视频h | 精品乱码一区二区三四区视频 | 成人高清网站 | 国产成人精品一区二区 | 久久精品亚洲精品国产欧美 | 天堂网中文字幕在线观看 | 天天草天天射 | 97av在线 | 国产精品一区一区 | 国产激情亚洲 | 亚洲高清在线 | 日韩视频一区二区在线 | 国产欧美在线 | 亚洲国产精品久久久 | 国产精品久久久久久久久久久久冷 | 91pron在线| 午夜亚洲 | 国产精品成人一区二区三区夜夜夜 | 亚洲在线一区二区 | 成人av网站在线观看 | 黄色大片观看 | 亚洲 中文 欧美 日韩 在线观看 | 羞羞涩涩在线观看 | 黑人精品xxx一区一二区 | 久久精品成人一区 | 在线观看成人 | 欧美电影免费网站 | 国产99久久精品一区二区永久免费 | 午夜视频一区二区 | av免费看片 | 久久国产电影 | 国产精品成人一区二区三区 | 99pao成人国产永久免费视频 |