標題: stc15c5a60s2 lcd1602 ds18b20網(wǎng)上找的程序就是顯示不正常 [打印本頁]

作者: BUYYBU    時間: 2018-5-16 09:56
標題: stc15c5a60s2 lcd1602 ds18b20網(wǎng)上找的程序就是顯示不正常
各位老鐵,幫忙看看

  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)//寫數(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)//延時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()/*讀數(shù)據(jù)*/
  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)/*寫數(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);//*跳過讀序列號*/
  122.   ds1820wr(0x44);//*啟動溫度轉(zhuǎn)換*/
  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位小數(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;//個位數(shù)
  146.      disdata[3]=value%10+0x30;//小數(shù)位

  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);//顯示小數(shù)點        
  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.   }
復制代碼



作者: zhanghyg    時間: 2018-5-16 13:08
你這個value參數(shù)沒有明確傳遞到ds1820disp()函數(shù)中,最好這樣void ds1820disp(uint temp),加個參數(shù),而且你這個value應該是float型,不然沒法顯示小數(shù)。
作者: devcang    時間: 2018-5-16 13:27
把18B20的時序,弄正確
作者: yzwzfyz    時間: 2018-5-16 13:28
找的不正常就自己寫個正常的。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1