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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc15c5a60s2 lcd1602 ds18b20網上找的程序就是顯示不正常

[復制鏈接]
跳轉到指定樓層
樓主
各位老鐵,幫忙看看

  1. #include <STC12C5A.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit DQ=P1^6;//ds18b20
  6. sbit lcd_rw=P2^1;
  7. sbit lcd_rs=P2^2;
  8. sbit lcd_en=P2^0;

  9. unsigned char code str1[]={"temperature:  "};
  10. unsigned char code str2[16]={" "};

  11. uchar data disdata[5];
  12. uint value;//溫度值
  13. uchar flag;//正負標志

  14. /*************************lcd1602程序**************************/
  15. void delay1ms(uint z)   //延時1ms
  16. {
  17. uint i,j;
  18. for(i=0;i<z;i++)
  19.    for(j=0;j<=168;j++);
  20. }
  21. void write_com(unsigned char com)//寫指令//
  22. {  
  23.    lcd_rs=0;
  24.    lcd_rw=0;
  25.    lcd_en=0;
  26.    P0=com;
  27.    delay1ms(2);
  28.    lcd_en=1;
  29.    delay1ms(2);
  30.    lcd_en=0;
  31.   }

  32. void write_dat(unsigned char dat)//寫數據//
  33. {
  34.    lcd_rs=1;
  35.    lcd_rw=0;
  36.    lcd_en=0;
  37.    P0=dat;
  38.    delay1ms(2);
  39.    lcd_en=1;
  40.    delay1ms(2);
  41.    lcd_en=0;
  42. }

  43. void lcd_init()//初始化設置//
  44. {
  45.   delay1ms(15);
  46. write_com(0x38);
  47. delay1ms(5);
  48. write_com(0x38);
  49. delay1ms(5);
  50. write_com(0x38);
  51. write_com(0x38);
  52. write_com(0x08);
  53. write_com(0x01);
  54. write_com(0x06);
  55. write_com(0x0c);
  56. }


  57. void display(unsigned char *p)//顯示//
  58. {
  59. while(*p!='\0')
  60. {
  61. write_dat(*p);
  62. p++;
  63. delay1ms(1);
  64. }
  65. }

  66. void init_play()//初始化顯示
  67. {
  68.         lcd_init();
  69.         write_com(0x80);
  70.   display(str1);
  71.   write_com(0xc0);
  72.   display(str2);
  73. }
  74. void delay_18B20(unsigned int j)//延時j * 1us
  75. {
  76.         unsigned int i;
  77.         for(i = 0; i < j; i ++)
  78.         {
  79.                 _nop_( );
  80.                 _nop_( );//@11.0592M晶振(12M晶振:_nop_( );_nop_( );)
  81.         }
  82.       
  83. }

  84. void ds1820rst()/*ds1820復位*/
  85. {
  86.          unsigned char x=0;
  87.          DQ = 1;          //DQ復位
  88.          delay_18B20(4);  //延時
  89.          DQ = 0;          //DQ拉低
  90.          delay_18B20(100); //精確延時大于480us
  91.          DQ = 1;          //拉高
  92.          delay_18B20(40);         
  93.    }  

  94. uchar ds1820rd()/*讀數據*/
  95. {
  96.         unsigned char i=0;
  97.         unsigned char dat = 0;
  98.          for (i=8;i>0;i--)
  99.         {   DQ = 0; //給脈沖信號
  100.                   dat>>=1;
  101.                   DQ = 1; //給脈沖信號
  102.                   if(DQ)
  103.                   dat|=0x80;
  104.                   delay_18B20(10);
  105.          }
  106. return(dat);
  107. }

  108.   void ds1820wr(uchar wdata)/*寫數據*/
  109.   {unsigned char i=0;
  110.     for (i=8; i>0; i--)
  111.    { DQ = 0;
  112.      DQ = wdata&0x01;
  113.      delay_18B20(10);
  114.      DQ = 1;
  115.      wdata>>=1;
  116.    }
  117. }
  118.   read_temp()/*讀取溫度值并轉換*/
  119. {uchar a,b;
  120.   ds1820rst();   
  121.   ds1820wr(0xcc);//*跳過讀序列號*/
  122.   ds1820wr(0x44);//*啟動溫度轉換*/
  123.   ds1820rst();   
  124.   ds1820wr(0xcc);//*跳過讀序列號*/
  125.   ds1820wr(0xbe);//*讀取溫度*/
  126.   a=ds1820rd();
  127.   b=ds1820rd();
  128.   value=b;
  129.   value<<=8;
  130.   value=value|a;
  131.     if(value<0x0fff)
  132.    flag=0;
  133.     else
  134.    {value=~value+1;
  135.          flag=1;
  136.    }
  137.   value=value*(0.625);//溫度值擴大10倍,精確到1位小數
  138.         return(value);
  139.   }

  140. /*******************************************************************/
  141.    void ds1820disp()//溫度值顯示
  142.         { uchar flagdat;
  143.           disdata[0]=value/1000+0x30;//百位數
  144.      disdata[1]=value%1000/100+0x30;//十位數
  145.      disdata[2]=value%100/10+0x30;//個位數
  146.      disdata[3]=value%10+0x30;//小數位

  147.      if(flag==0)
  148.             flagdat=0x20;//正溫度不顯示符號
  149.      else
  150.        flagdat=0x2d;//負溫度顯示負號:-

  151.      if(disdata[0]==0x30)
  152.            {disdata[0]=0x20;//如果百位為0,不顯示
  153.                  if(disdata[1]==0x30)
  154.                   {disdata[1]=0x20;//如果百位為0,十位為0也不顯示
  155.                   }
  156.                 }

  157.            write_com(0xc0);
  158.                 write_dat(flagdat);//顯示符號位
  159.            write_com(0xc1);
  160.            write_dat(disdata[0]);//顯示百位
  161.            write_com(0xc2);
  162.            write_dat(disdata[1]);//顯示十位        
  163.            write_com(0xc3);
  164.            write_dat(disdata[2]);//顯示個位        
  165.            write_com(0xc4);
  166.            write_dat(0x2e);//顯示小數點        
  167.            write_com(0xc5);
  168.            write_dat(disdata[3]);//顯示小數位
  169.    }
  170. /********************主程序***********************************/
  171. void main()
  172. { init_play();//初始化顯示
  173.    while(1)
  174.         {read_temp();//讀取溫度
  175.     ds1820disp();//顯示
  176.          }
  177.   }
復制代碼


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

使用道具 舉報

沙發
ID:330198 發表于 2018-5-16 13:08 | 只看該作者
你這個value參數沒有明確傳遞到ds1820disp()函數中,最好這樣void ds1820disp(uint temp),加個參數,而且你這個value應該是float型,不然沒法顯示小數。
回復

使用道具 舉報

板凳
ID:277550 發表于 2018-5-16 13:27 | 只看該作者
把18B20的時序,弄正確
回復

使用道具 舉報

地板
ID:123289 發表于 2018-5-16 13:28 | 只看該作者
找的不正常就自己寫個正常的。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 夜夜撸av| 欧美福利专区 | 日韩欧美国产一区二区三区 | 欧美一级片久久 | av香蕉| 国产精品国产三级国产aⅴ中文 | 午夜影院在线观看 | 国产精品欧美日韩 | 欧美精品在线免费 | 亚洲三级在线观看 | chengrenzaixian| 中文字幕91av | 一级片免费观看 | 久久精品亚洲 | av手机在线 | 欧美精品在线播放 | 国产日韩中文字幕 | 成年人免费网站 | 在线视频一区二区 | 国产精品成人在线 | 在线免费观看a级片 | 一级看片免费视频囗交动图 | 欧洲视频一区二区 | 精品亚洲一区二区三区 | 国产精品1区 | 亚洲精品二区 | 一本一道久久a久久精品蜜桃 | 操一草 | 美女爽到呻吟久久久久 | 欧美h视频| 在线观看你懂的网站 | 午夜视频一区二区 | 欧美不卡 | 日韩中出 | 久久成人综合 | 午夜私人影院在线观看 | 99精品视频在线 | 视频一区二区在线观看 | 日韩a视频 | 国产亚洲一区二区三区 | 成人免费网视频 |