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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 12492|回復(fù): 18
收起左側(cè)

新人貼 51單片機(jī)+lcd1602+DS18B20溫度顯示程序+仿真

  [復(fù)制鏈接]
ID:97443 發(fā)表于 2015-11-28 12:03 | 顯示全部樓層 |閱讀模式
剛學(xué)單片機(jī)沒多久,寫的不怎樣,求勿噴!!!

  1. #include < reg51.h >
  2. #include < intrins.h >

  3. #define uchar unsigned char
  4. #define uint   unsigned int

  5. //#define lcddata P0
  6. #define lcddata P2
  7. sbit LCDRS=P1^7;              //液晶數(shù)據(jù)選擇命令端
  8. sbit LCDRW=P1^6;             //液晶讀寫命令端
  9. sbit LCDEN=P1^5;            //液晶使能端
  10. //sbit LCDRS = P2^6 ;     // 命令/數(shù)據(jù)選擇端  0為寫命令 1為寫數(shù)據(jù)      
  11. //sbit LCDRW = P2^5 ;                // lcd讀寫端
  12. //sbit LCDEN = P2^7 ;                //lcd使能端
  13. void write_com(uchar com);
  14. void zdyzfxs();
  15. unsigned char code   mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;//lcd自定義字符
  16. //sbit DQ = P3^7 ;   //定義DS18B20端口DQ  
  17. sbit DQ = P1^0;   //定義DS18B20端口DQ
  18. bit presence;           //ds18b20 DQ被拉低 信號(hào)0允許,1禁止
  19. uint cc,cc2;       //變量cc中保存讀出的溫度值
  20. float cc1;
  21. uchar flag;                   //flag為溫度值正負(fù)標(biāo)志位,“1”表示溫度為復(fù)制,“0”表示為正值//flag為溫度值正負(fù)標(biāo)志位,“1”表示溫度為復(fù)制,“0”表示為正值
  22. void write_com(uchar com);

  23. uchar code cdis0[ ] = "CHECKING...";
  24. uchar code cdis1[ ] = "   DS18B20 OK   " ;
  25. uchar code cdis5[ ] = "Temp: ";
  26. uchar  cdis2[ ] = "+00.00";
  27. uchar code cdis3[ ] = " DS18B20   ERR0R " ;
  28. uchar code cdis4[ ] = "   PLEASE CHECK  " ;

  29. unsigned char data   temp_data[2] = {0x00,0x00} ;  //存儲(chǔ)16位溫度

  30. /**********************************lcd1602********************************************/

  31. //----------------------------------
  32. void delaylcd(uint z)
  33. {uchar x,y;
  34. for(x=z;x>0;x--)
  35.   {for(y=110;y>0;y--);
  36.   }
  37. }

  38. /*lcd1602初始化        */
  39. /**********************************/
  40. void lcd_init(void)
  41. {
  42. LCDRW=0;                 //低電平為寫
  43. LCDEN=0;
  44. write_com(0x38);                 //使用8位數(shù)據(jù)開關(guān),顯示兩行,使用5*7字形

  45. write_com(0x0c);                //顯示器開,光標(biāo)關(guān),字符不閃爍         0x0e 光標(biāo)開

  46. write_com(0x06);           //字符不動(dòng),光標(biāo)自動(dòng)右移動(dòng)一位

  47. write_com(0x01);          //清屏
  48. }

  49. /*寫命令to lcd        */
  50. /**********************************/
  51. void write_com(uchar com)//寫命令
  52. {
  53.   LCDRW=0;         //低電平為寫
  54.   LCDRS=0;         //低電平為命令選擇
  55.   //LCDEN=1;
  56.   lcddata=com;
  57.   delaylcd(5);
  58.   LCDEN=1;
  59.   delaylcd(5);
  60.   LCDEN=0;
  61. }

  62. /*寫數(shù)據(jù)to lcd             */
  63. /**********************************/
  64. void write_data(uchar  date)
  65. {
  66. LCDRW=0;  //低電平為寫
  67. LCDRS=1;  //高電平為數(shù)據(jù)選擇
  68. //LCDEN=1;
  69. lcddata=date;
  70. delaylcd(5);
  71. LCDEN=1;
  72. delaylcd(5);
  73. LCDEN=0;
  74. }

  75. /*設(shè)定顯示位置             */
  76. /********************************/
  77. void lcd_pos(uchar pos)
  78. {                                    //第一行第幾列直接寫pos為幾,第二行pos從0x40開始
  79.    write_com(pos | 0x80) ;   //數(shù)據(jù)指針=80+地址變量
  80. }
  81. /*自定義字符寫入CGRAM      */
  82. /*********************************/
  83. void mywritetab()  
  84. {  
  85.      unsigned char i ;
  86.      write_com(0x40) ;             //寫CGRAM
  87.      for(i=0;i<8;i++)
  88.          {write_data(mytab[i]);}                                                                                                                                                                                                                                                                                                                                                
  89. }

  90. /*******************************ds18b20*******************************************/
  91. /*ms級(jí)別      */
  92. void ddelay(uint ms)
  93. {
  94. uint i;
  95. uchar j;
  96. for(i=0;i<ms;i++)
  97.    for(j=0;j<250;j++)
  98.    {
  99.     _nop_();          //一個(gè)機(jī)器周期,1us
  100.            _nop_();          //適用于精度高的
  101.         _nop_();
  102.     _nop_();
  103.    }
  104. }
  105. /*us級(jí)延時(shí),延時(shí)時(shí)間約4+2*i*/
  106. void Delayus(uchar i)
  107. {
  108.   while(--i);
  109. }
  110. /*復(fù)位,每次讀寫之前都要進(jìn)行復(fù)位*/
  111. /**********************************/
  112. bit ow_reset(void)
  113. {
  114. DQ = 1 ;       //DQ復(fù)位
  115. Delayus(8) ;     //稍做延時(shí)

  116. DQ = 0; //拉低約600us
  117. Delayus(150);
  118. Delayus(150);

  119. DQ = 1;//產(chǎn)生上升沿,延時(shí)約15~60us
  120. Delayus(30);

  121. if(DQ==0) {presence=0;}        
  122. else presence=1;
  123. return(presence); //等待應(yīng)答信號(hào) 0允許,1禁止
  124. }

  125. /*讀取數(shù)據(jù)一位            */
  126. //---------------------------------
  127. bit Read_bit()
  128. {
  129. uint i = 0;
  130. bit b = 0;

  131. DQ = 0; //產(chǎn)生讀時(shí)隙  
  132. i++;         //維持低電平至少1us

  133. DQ = 1; //1us以上后拉高
  134. Delayus(2); //延時(shí)8us,DO下降沿15內(nèi)ds18b20輸出的數(shù)據(jù)才有效


  135. b = DQ; //讀取數(shù)據(jù)
  136. Delayus(40);         //每個(gè)讀時(shí)隙至少持續(xù)60us

  137. return(b);
  138. }

  139. /*讀取一個(gè)字節(jié)             */
  140. //------------------------------------
  141. uchar Read_byte()
  142. {
  143. uchar byte_read = 0;
  144. uchar i, j;

  145. for(i=0; i<8; i++)
  146.   {
  147.    j = Read_bit();
  148.    byte_read = (j<<i) | byte_read; //低位讀起
  149.   }

  150. return(byte_read);
  151. }

  152. //-----------------------------------------
  153. /*寫一個(gè)字節(jié)         */
  154. void Write_byte(uchar byte_to_write)
  155. {
  156. uchar i = 0;
  157. uchar j = 0;
  158. bit write_bit = 0;

  159. for(j=0; j<8; j++)
  160.   {
  161.    write_bit =         (byte_to_write & 0x01);
  162.     if(write_bit == 1) //寫1
  163.          {
  164.           DQ = 0;  //產(chǎn)生寫時(shí)隙
  165.          Delayus(3);           //延時(shí)15us
  166.           
  167.           DQ = 1;  //寫1
  168.           Delayus(40);   //延時(shí),寫時(shí)隙不得低于60us
  169.          }
  170.         else
  171.          {
  172.           DQ = 0;  //產(chǎn)生寫時(shí)隙
  173.           Delayus(50);   //延時(shí),保持低約60us~120us
  174.           DQ = 1;  
  175.           i++;
  176.          }
  177.    byte_to_write = byte_to_write >> 1;
  178.   }
  179. }
  180. //-----------------------------------
  181. /*讀取溫度,啟動(dòng)溫度轉(zhuǎn)換*/
  182. /*啟動(dòng)溫度轉(zhuǎn)換*/
  183. void start_convert()
  184. {
  185. ow_reset();          // 發(fā)出復(fù)位脈沖,每次操作都從復(fù)位開始
  186. ddelay(1);
  187. Write_byte(0xcc); //skip room命令,跳過序列號(hào)命令字
  188. Write_byte(0x44); //啟動(dòng)溫度轉(zhuǎn)換命令
  189. }

  190. /*讀取溫度值*/
  191. void read_tempreture()
  192. {
  193. ow_reset();          // 發(fā)出復(fù)位脈沖,每次操作都從復(fù)位開始
  194. ddelay(1);
  195. Write_byte(0xcc); //skip room命令
  196. Write_byte(0xbe); //讀取暫存器命令
  197. temp_data[0] = Read_byte(); //存儲(chǔ)溫度低字節(jié)值 (整數(shù)部分低四位和小數(shù)部分) 先從低字節(jié)讀取
  198. temp_data[1] = Read_byte(); //存儲(chǔ)溫度高字節(jié)值 (其中高五位為符號(hào)位)
  199. }
  200. //--------------------------------------
  201. /* CHECKING...顯示              */
  202. void lcd_display()
  203. {
  204. uchar   m ;
  205. lcd_init() ;                 //初始化LCD
  206. lcd_pos(0) ;                 //設(shè)置顯示位置為第一行的第1個(gè)字符
  207.       m = 0 ;
  208.      while(cdis0[m] != '\0')
  209.       {                          //顯示字符
  210.         write_data(cdis0[m]) ;
  211.         m++ ;
  212.       }
  213. }

  214. //--------------------------------------
  215. /* DS18B20 OK 顯示菜單                 */
  216. void Ok_Menu ()
  217. {
  218.      uchar   m ;
  219.      lcd_init() ;                 //初始化LCD
  220.             
  221.      lcd_pos(0) ;                 //設(shè)置顯示位置為第一行的第1個(gè)字符
  222.       m = 0 ;
  223.      while(cdis1[m] != '\0')
  224.       {                          //顯示字符
  225.         write_data(cdis1[m]) ;
  226.         m++ ;
  227.       }          
  228. }

  229. //-----------------------------------
  230. /*DS18B20   ERR0R          */
  231. /*PLEASE   CHECK  顯示    */
  232. void Error_Menu ()
  233. {
  234.       uchar   m ;
  235.       lcd_init() ;                 //初始化LCD

  236.       lcd_pos(0) ;                 //設(shè)置顯示位置為第一行的第1個(gè)字符
  237.       m = 0 ;
  238.       while(cdis3[m] != '\0')
  239.       {                          
  240.         write_data(cdis3[m]) ;           //顯示字符
  241.         m++ ;
  242.       }

  243.       lcd_pos(0x40) ;              //設(shè)置顯示位置為第二行第1個(gè)字符
  244.       m = 0 ;
  245.       while(cdis4[m] != '\0')
  246.       {
  247.         write_data(cdis4[m]) ;       //顯示字符
  248.         m++ ;
  249.       }
  250. }

  251. //------------------------------------
  252. /*Temp:      ℃顯示        */
  253. void temp_c()
  254. {
  255.   uchar m;
  256.   lcd_init() ;
  257.   lcd_pos(0);
  258.   m=0;
  259.   while(cdis5[m]!='\0')
  260.   {
  261.    write_data(cdis5[m]);
  262.    m++;
  263.   }
  264.   
  265. //  write_data(0xDF);                //°
  266. zdyzfxs();lcd_pos(13);                  
  267.   write_data('C');
  268. }

  269. //-----------------------------------
  270. /*自定義字符顯示    */
  271. void zdyzfxs()
  272. {
  273. mywritetab();
  274. lcd_pos(12);
  275. write_data(0x00);
  276. }
  277. //------------------------------------
  278. /*溫度顯示                       */
  279. void temperature_display()
  280. {
  281.   uchar m;
  282.   flag=0;
  283.   while(1)
  284.   {
  285.     ddelay(2);
  286.     EA=0;                                //DS18B20讀寫數(shù)據(jù)按照嚴(yán)格的時(shí)序,最好不要被打斷,故把所有中斷關(guān)閉
  287.         start_convert();                          //啟動(dòng)溫度轉(zhuǎn)換
  288.     ddelay(250);
  289.         read_tempreture();                          //讀取溫度
  290.     EA=1;
  291.         cc=temp_data[1]*256.0+temp_data[0];
  292.         if(temp_data[1]>0xF8) {flag=1;cc=~cc+1;} else flag=0;
  293.         cc1=cc*0.0625;
  294.         cc2=cc1*100;
  295.         cdis2[1]=cc2/1000+0x30;
  296.         if(cdis2[1]==0x30)
  297.          {cdis2[1]=0x20;}
  298.         cdis2[2]=cc2/100%10+0x30;
  299.         cdis2[4]=cc2%100/10+0x30;
  300.     cdis2[5]=cc2%10+0x30;
  301.         if(flag==1)
  302.            cdis2[0]='-';
  303.         else
  304.            cdis2[0]='+';
  305.          
  306.          lcd_pos(6) ;                 //設(shè)置顯示位置為第一行的第6個(gè)字符
  307.      m=0;
  308.      while(cdis2[m]!='\0')
  309.       {                          //顯示字符
  310.         write_data(cdis2[m]) ;
  311.                 m++;
  312.           }                                                                   
  313.    }
  314. }

  315. //---------------------------------
  316. /*主函數(shù)             */
  317. void main()
  318. {
  319.   lcd_display();
  320.   ddelay(1000);
  321.   ow_reset();
  322.   if(presence==0)
  323.     {
  324.          Ok_Menu ();
  325.          ddelay(1000);
  326.          temp_c();zdyzfxs();
  327.          temperature_display();  
  328.     }
  329.   else
  330.     {
  331.          Error_Menu ();
  332.          while(1)
  333.          {
  334.           ow_reset();
  335.           if(presence==0)
  336.            {
  337.                 Ok_Menu ();
  338.             ddelay(1000);
  339.             temperature_display();
  340.            }
  341.          }
  342.     }
  343. }


復(fù)制代碼


ss.zip

71.05 KB, 下載次數(shù): 333, 下載積分: 黑幣 -5

程序+仿真

評(píng)分

參與人數(shù) 5黑幣 +98 收起 理由
劉懿瑤 + 10
Waiting12138 + 30 共享資料的黑幣獎(jiǎng)勵(lì)!
fyn162011 + 5 共享資料的黑幣獎(jiǎng)勵(lì)!
940102552 + 3
admin + 50 共享資料的積分獎(jiǎng)勵(lì)!

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

無效樓層,該帖已經(jīng)被刪除
ID:1 發(fā)表于 2017-3-1 01:44 | 顯示全部樓層
好資料,51黑有你更精彩。
回復(fù)

使用道具 舉報(bào)

ID:188255 發(fā)表于 2017-4-10 21:17 | 顯示全部樓層
樓主好人
回復(fù)

使用道具 舉報(bào)

ID:148871 發(fā)表于 2017-5-31 22:08 | 顯示全部樓層
非常不錯(cuò)的測試程序
回復(fù)

使用道具 舉報(bào)

ID:136615 發(fā)表于 2017-6-9 17:02 | 顯示全部樓層
謝謝分享,很好用,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:248800 發(fā)表于 2017-11-14 17:59 | 顯示全部樓層
來看看    不錯(cuò)呀
回復(fù)

使用道具 舉報(bào)

8#
無效樓層,該帖已經(jīng)被刪除
ID:260054 發(fā)表于 2017-12-11 10:31 | 顯示全部樓層
好東西,頂起來
回復(fù)

使用道具 舉報(bào)

ID:249737 發(fā)表于 2017-12-12 19:52 | 顯示全部樓層
看著不錯(cuò),等會(huì)來測試一下看看這怎么樣
回復(fù)

使用道具 舉報(bào)

ID:262750 發(fā)表于 2017-12-17 17:12 | 顯示全部樓層
可以能發(fā)給我嗎
回復(fù)

使用道具 舉報(bào)

ID:325192 發(fā)表于 2018-5-9 16:00 | 顯示全部樓層
下下看吧
回復(fù)

使用道具 舉報(bào)

ID:327543 發(fā)表于 2018-5-11 18:13 | 顯示全部樓層
是我需要的
回復(fù)

使用道具 舉報(bào)

ID:355788 發(fā)表于 2018-6-21 10:19 | 顯示全部樓層
能分享嗎
回復(fù)

使用道具 舉報(bào)

ID:318309 發(fā)表于 2019-1-21 13:37 | 顯示全部樓層
謝謝分享。謝謝謝謝
回復(fù)

使用道具 舉報(bào)

ID:290290 發(fā)表于 2019-3-2 21:50 | 顯示全部樓層
學(xué)習(xí)中,多謝樓主。
回復(fù)

使用道具 舉報(bào)

ID:489425 發(fā)表于 2019-3-13 00:00 | 顯示全部樓層
學(xué)習(xí)中,謝謝
回復(fù)

使用道具 舉報(bào)

ID:512403 發(fā)表于 2019-4-17 07:48 來自觸屏版 | 顯示全部樓層
很好用,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:570713 發(fā)表于 2019-6-25 08:34 | 顯示全部樓層
有硬件的電路圖嗎
回復(fù)

使用道具 舉報(bào)

ID:614331 發(fā)表于 2019-9-25 11:13 | 顯示全部樓層
這個(gè)程序不錯(cuò),就是程序有點(diǎn)長
回復(fù)

使用道具 舉報(bào)

ID:692230 發(fā)表于 2020-3-9 21:55 | 顯示全部樓層
這個(gè)程序不錯(cuò),就是小部分沒理解透,能刷新顯示溫度
回復(fù)

使用道具 舉報(bào)

22#
無效樓層,該帖已經(jīng)被刪除

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美国产亚洲一区二区 | 毛片一区二区三区 | 亚洲 中文 欧美 日韩 在线观看 | 精品久久久久久久久久久 | 久久久久久国产精品久久 | 亚洲精品久久久久久国产精华液 | 日韩欧美一区二区三区在线播放 | 69性欧美高清影院 | 亚洲免费精品 | 亚洲一区中文字幕 | 特级毛片| 91精品国产91久久久久福利 | 亚洲日韩中文字幕一区 | 久久久激情视频 | 亚洲视频在线观看 | 精品福利视频一区二区三区 | 亚洲综合视频一区 | 日韩中文字幕在线观看 | 99久久精品国产一区二区三区 | 一区二区三区视频在线 | 久久久久久久亚洲精品 | 久久国产秒 | 久久久久资源 | 久久国产精品免费一区二区三区 | a级在线 | 国产综合精品一区二区三区 | 精品日韩一区二区 | 人人射人人插 | 国产伦精品一区二区三区高清 | 国产999精品久久久久久 | 一区二区三区精品视频 | 亚洲欧美一区二区三区情侣bbw | 国产激情视频在线观看 | 色婷婷综合久久久久中文一区二区 | 欧美成人自拍 | 69av在线视频| 精品亚洲一区二区三区四区五区高 | www亚洲免费国内精品 | 中文精品视频 | 成人免费淫片aa视频免费 | 观看毛片|