找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1871|回复: 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 单片机教程网

快速回复 返回顶部 返回列表