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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2295|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

stc15c5a60s2 lcd1602 ds18b20網(wǎng)上找的程序就是顯示不正常

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
各位老鐵,幫忙看看

  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;//正負(fù)標(biāo)志

  14. /*************************lcd1602程序**************************/
  15. void delay1ms(uint z)   //延時(shí)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)//寫數(shù)據(jù)//
  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()//初始化設(shè)置//
  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)//延時(shí)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復(fù)位*/
  85. {
  86.          unsigned char x=0;
  87.          DQ = 1;          //DQ復(fù)位
  88.          delay_18B20(4);  //延時(shí)
  89.          DQ = 0;          //DQ拉低
  90.          delay_18B20(100); //精確延時(shí)大于480us
  91.          DQ = 1;          //拉高
  92.          delay_18B20(40);         
  93.    }  

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

  108.   void ds1820wr(uchar wdata)/*寫數(shù)據(jù)*/
  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()/*讀取溫度值并轉(zhuǎn)換*/
  119. {uchar a,b;
  120.   ds1820rst();   
  121.   ds1820wr(0xcc);//*跳過(guò)讀序列號(hào)*/
  122.   ds1820wr(0x44);//*啟動(dòng)溫度轉(zhuǎn)換*/
  123.   ds1820rst();   
  124.   ds1820wr(0xcc);//*跳過(guò)讀序列號(hào)*/
  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);//溫度值擴(kuò)大10倍,精確到1位小數(shù)
  138.         return(value);
  139.   }

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

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

  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);//顯示符號(hào)位
  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]);//顯示個(gè)位        
  165.            write_com(0xc4);
  166.            write_dat(0x2e);//顯示小數(shù)點(diǎn)        
  167.            write_com(0xc5);
  168.            write_dat(disdata[3]);//顯示小數(shù)位
  169.    }
  170. /********************主程序***********************************/
  171. void main()
  172. { init_play();//初始化顯示
  173.    while(1)
  174.         {read_temp();//讀取溫度
  175.     ds1820disp();//顯示
  176.          }
  177.   }
復(fù)制代碼


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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表