微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 18b20与1602显示问题

18b20与1602显示问题

时间:10-02 整理:3721RD 点击:

为什么此程序在1602只显示50   就一直没有变化了  望那位大哥帮帮我!谢谢
#include<reg51.h>
#include "b20.h"
#define uchar unsigned char
#define uint unsigned int
sbit RS=P1^3;
sbit RW=P1^4;
sbit EN=P1^5;
sbit date=P3^7;    //数据通信线
unsigned char code str1[]={"temperature: "};
unsigned char  str2[]="  ";
uchar i;//温度值
uchar tflag;//温度正负标志
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{unsigned int i,j;
   for(i=0;i<ms;i++)
    for(j=0;j<100;j++);
}
void wr_com(unsigned char com)//写指令//
{ delay1ms(1);
   RS=0;
   RW=0;
   EN=0;
   P0=com;
   delay1ms(1);
   EN=1;
   delay1ms(1);
   EN=0;
}
void wr_dat(unsigned char dat)//写数据//
{ delay1ms(1);;
   RS=1;
   RW=0;
   EN=0;
   P0=dat;
   delay1ms(1);
   EN=1;
   delay1ms(1);
   EN=0;
}
void lcd_init()//初始化设置//
{delay1ms(15);
wr_com(0x38);delay1ms(5);
   wr_com(0x08);delay1ms(5);
    wr_com(0x01);delay1ms(5);
     wr_com(0x06);delay1ms(5);
      wr_com(0x0c);delay1ms(5);
}
void display(unsigned char *p)//显示//
{      
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(1);
}
}
init_play()//初始化显示
{ lcd_init();
    wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
   }
   
void delay(uchar i)
{
uchar j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}
void init()
{
    uint i;
date=1;
delay(1);
    date = 0;
    i = 100;        //拉低约900us
    while (i>0)    i--;   
   
    date= 1;        // 产生上升沿
    i = 4;
    while (i>0)    i--;
}
void wait()
{
    uint i;
    while(date);
    while(~date);   // 检测到应答脉冲
    i = 4;
    while (i>0)    i--;
}
uchar  readbit()
{
    uint i;
    bit b;
    date = 0;
    i++;
    date = 1;
    i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
    b = date;
    i = 8;
    while(i>0) i--;
    return (b);
}
uchar readbyte()
{
    uchar i,j,b;
    b = 0;
    for (i=1;i<=8;i++)
    {
        j = readbit();
        b = (j<<7)|(b>>1);//读出的数据最低位在最前面,这样刚好一个字节在DATE里
    }
    return(b);
}
void writebyte(uchar b)//
{
    uint i;
    uchar j;
    bit btmp;
    for(j=1;j<=8;j++)
    {
        btmp = b&0x01;
        b = b>>1;        // 取下一位(由低位向高位)
        if (btmp)        // 写1
        {
           
            date = 0;
            i++;i++;    // 延时,使得15us以内拉高
            date = 1;
            i = 8;
            while(i>0) i--;    // 整个写1时隙不低于60us
          }
        else            // 写0
        {
      
            date = 0;           
            i = 8;
            while(i>0) i--;    // 保持低在60us到120us之间
            date = 1;
            i++;
            i++;
        }
    }
}
void convert()        
{
    init();            // 产生复位脉冲,初始化DS18B20
    wait();            // 等待DS18B20给出应答脉冲
    delay(1);          // 延时
    writebyte(0xcc);   // 跳过rom 命令
    writebyte(0x44);   // convert T 命令

}
uint readtemp()   
{  uchar tpmsb,tplsb,temp ;
float tt;
    init();             // 产生复位脉冲,初始化DS18B20
    wait();             // 等待DS18B20给出应答脉冲
    delay(1);           // 延时
   writebyte(0xcc);    // 跳过rom命令
   writebyte(0xbe);    // read scratchpad 读暂存器命令
    tplsb=readbyte(); // 温度值低位字节(其中低4位为二进制的"小数"部分)
    tpmsb=readbyte(); // 温度值高位字节(其中高5位为符号位)
    temp=tpmsb;
    temp<<=8;           //合成一个字         
    temp=temp|tplsb;   
    tt=temp*0.0625;
    temp=tt*10+0.5;
    return temp;   
}
void main()
{
   init_play();//初始化显示
while(1)
{
   i=readtemp();
  str2[0]=i/10+48;
  str2[1]=i%10+48;
  wr_com(0xc0);
    display(str2) ;
  
}

}




坐等高手出现

我也是这问题是 你解决了吗

我有一个关于这方面的程序,需要的话可以给你

可不可以给我发一份,393370479@qq.com  谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top