找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2947|回复: 5
打印 上一主题 下一主题
收起左侧

用ds18b20,LCD1602显示,可是什么都显示不了

[复制链接]
跳转到指定楼层
楼主
ID:223880 发表于 2017-8-10 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用ds18b20,LCD1602显示,可是什么都显示不了;下面是我的我的程序,帮我看看哪里错了。
  1. #include<at89x52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar  diplay[2];
  5. uint temp;
  6. sbit RS=P2^5;
  7. sbit RW=P2^6;
  8. sbit E=P2^7;
  9. sbit DQ=P1^1;

  10. uchar code tab[]="temperature:";
  11. uchar code tab1[]="00oC";
  12. void delay1ms(unsigned int ms)
  13. {
  14.   unsigned int i,j;
  15.   for(i=0;i<ms;i++)
  16.    for(j=0;j<100;j++);
  17. }

  18. void delay1us(unsigned int i)
  19. {
  20.         while(i--);
  21. }

  22. void write_com(uchar com)
  23. {
  24.   RS=0;
  25.   RW=0;
  26.   E=0;
  27.   P2=com;
  28.   delay1ms(5);
  29.   E=1;
  30.   delay1ms(5);
  31.   E=0;
  32. }

  33. void write_dat(uchar dat)
  34. {
  35.   RS=1;
  36.   RW=0;
  37.   E=0;
  38.   P2=dat;
  39.   delay1ms(5);
  40.   E=1;
  41.   delay1ms(5);
  42.   E=0;
  43. }

  44. void init()
  45. {
  46.    
  47.   write_com(0x38);

  48.   write_com(0x0c);
  49.    
  50.   write_com(0x06);
  51.   
  52.   write_com(0x01);     
  53. }

  54. void ds18b20init()
  55. {
  56.   DQ=0;
  57.   delay1us(480);
  58.   DQ=1;
  59.   delay1us(80);
  60.   DQ=0;
  61.   delay1us(480);
  62. }     

  63. void ds18b20write_dat(uchar dat)
  64. {
  65.   unsigned char i;
  66.   for(i=0;i<8;i++)
  67.   {
  68.     DQ=0;
  69.     delay1us(15);
  70.     DQ=dat;
  71.     dat<<=1;
  72.     delay1us(60);
  73.     DQ=1;
  74.   }
  75. }

  76. uchar ds18b20read_dat( )
  77. {
  78.   uchar i,bi,byte;
  79.   uchar dat;
  80.   for(i=8;i>0;i--)
  81.   {
  82.    DQ=0;
  83.    delay1us(1);
  84.    DQ=1;
  85.    delay1us(10);
  86.    bi=dat;
  87.    byte=(byte>>1)|(bi<<7);
  88.    delay1us(45);
  89.   }
  90. return dat;
  91. }

  92. void ds18b20Changtemp()
  93. {
  94.    ds18b20init();
  95.    ds18b20write_dat(0xcc);
  96.    ds18b20write_dat(0x44);
  97.    
  98. }
  99.                                     
  100. uint ds18b20readtemp()
  101. {  
  102.    uchar tmh,tml;
  103.    temp=0;
  104.    ds18b20init();
  105.    ds18b20write_dat(0xcc);
  106.    ds18b20write_dat(0xbe);
  107.    tml=ds18b20read_dat();
  108.    tmh=ds18b20read_dat();
  109.    temp=tmh;
  110.    temp<<=8;
  111.    temp=temp|tml;
  112.    return temp;
  113. }

  114. void dispplay()
  115. {
  116.   uchar i,tp;
  117.   tp=temp*0.625;

  118.   diplay[0]=tp/10+0x30;
  119.   diplay[1]=tp/1+0x30;

  120.   write_com(0x80);  
  121.    for(i=0;i<14;i++)  
  122.    {
  123.      write_dat(tab[i]);     
  124.    }

  125.    write_com(0x80+0x40);
  126.    for(i=0;i<5;i++)   
  127.    {
  128.       write_dat(tab1[i]);
  129.    }     
  130. }

  131. void main()
  132. {
  133.   init();
  134.   while(1)
  135.   {
  136.      ds18b20readtemp();
  137.      dispplay();
  138.   }
  139. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:162136 发表于 2017-8-10 10:05 | 只看该作者
void write_com(uchar com)
{
  RS=0;
  RW=0;
  E=0;
  P2=com;
  delay1ms(5);
  E=1;
  delay1ms(5);
  E=0;
}

void write_dat(uchar dat)
{
  RS=1;
  RW=0;
  E=0;
  P2=dat;
  delay1ms(5);
  E=1;
  delay1ms(5);
  E=0;
}
把上面的数据口P2改为P0试试,肯定不会是P2了。P0,P1,P3都有可能。P0可能性较大。
回复

使用道具 举报

板凳
ID:223214 发表于 2017-8-12 00:34 | 只看该作者
你可以就用数码管显示呀,简单点。
回复

使用道具 举报

地板
ID:179958 发表于 2017-8-13 16:54 | 只看该作者
个人认为LCD1602比数码管还好用呢,正确驱动过后写成库文件,以后都直接调用,很方便的。你这个问题的话,我建议先只写1602的程序先,达到想让1602显示什么就显示什么的地步后,再回入18b20程序。
回复

使用道具 举报

5#
ID:227425 发表于 2017-8-13 17:28 | 只看该作者
背景灯亮吗?
回复

使用道具 举报

6#
ID:136110 发表于 2017-8-14 09:37 | 只看该作者
1602第三脚直接接地试试,我上回有个2402没显示,把3脚直接接地,就会有很淡的显示了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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