不知道程序哪里不对,18B20转 到1602的程序

2019-03-24 18:21发布

#include<STC12C5A60S2.H>
#include <intrins.h>
#include <string.h>    //字符串处理
#define uchar unsigned char
#define uint unsigned int
uchar table[]={"  temp:"};
uchar table1[]={"  name:xinshou "};
/********IO引脚定义**********/
sbit rs = P3^2;    //rs控制线
sbit rw = P3^3;    //rw控制线
sbit en = P3^4;    //使能控制
sbit dq = P2^5;   //18B20数据线
sbit beep = P2^7;  //报警控制线
sbit busy =P1^7;   //测忙线
uchar num;
uint tempwarn,d=0,h=0;


void delay(int num){//延时函数
        while(num--) ;
}

void busytest(void)
{
   P1=0xff;      //设备读状态
   rs=0;
   rw=1;
   en=1;
   while(busy);   //等待1602不忙
   en=0;
}


void write_com(uchar com)  //液晶写命令程序
{   busytest();
     P1=com;  //把com参数,液晶的命令值送到P1口  
   rs=0;  //等0输入命令
   rw=0;      
   en=1;    //使能信号,0到1表示上升沿打开可以写命令数据到液晶里   
    en=0;     //使能信号回复
  
}
    void write_data(uchar date)  //液晶写数据程序
  {
        busytest();
      P1=date;  //把date参数,液晶的数据送到P1口
      rs=1;  //等1表示输入数据
      rw=0;   
       en=1;
       en=0;

   }
    void init()  //液晶初始化程序
   {
       en=0;   
       write_com(0x38);  //设置16X2显示,5X7点阵,8位数据口
       write_com(0x01);  //显示清0,数据指针清0
       write_com(0x02);  //数据指针指向第一行,第一个字符位置
       write_com(0x06);  //写一个字符后地址指针加1
       write_com(0x0c);  //设置开显示,不显示光标
   
    }

    void Writebyte(uchar dat)//DS18B20温度芯片的写字节程序
  {
       uchar j=0;
      for(j=8;j>0;j--)
       {
          dq=0;
          dq=dat&0x01;
          delay(5);
           dq=1;
           dat>>=1;
        }
  
   }
      
    uchar Readbyte(void)   //DS18B20温度芯片读字节程序
{   uchar i,dat=0;
    for(i=8;i>0;i--)
   {
      dq=0;
       dat>>=1;
      dq=1;
          if(dq==1)
         {  dat |= 0x80;}
      delay(4);
    }
       return dat;
}  
     void initds18b20(void) //温度芯片初始化程序
{   uchar x=0;
    dq=1;   //DQ复位
     delay(8);//稍做延时
    dq=0;     //单片机将DQ拉低
      delay(80);  //精确延时 大于 480us
    dq=1;         //拉高总线
      delay(14);
    x=dq;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
    delay(20);
}  
  unsigned int Readtemp(void) //读温度程序
{    unsigned char d=0;   
     unsigned char h=0;
     unsigned int temp=0;
           float tt=0;
     initds18b20();
     Writebyte(0xcc);// 跳过读序号列号的操作
     Writebyte(0x44);// 启动温度转换

     initds18b20();
     Writebyte(0xcc);//跳过读序号列号的操作
     Writebyte(0xbe);//读取温度寄存器
    d=Readbyte();  //温度信号的低8位数据函数
    h=Readbyte();  //温度信号的高8位数据函数

             temp=h; //高8位数据给temp
     temp<<=8;  //高8位左移8位
     temp|=d;   //高低8位数据或起来再赋给temp
          tt=temp*0.0625;        //小数部分数据转换
         temp=tt*10+0.5;
  return (temp);     //温度值返回
}   
  

void warn(uint tempwarn)  //温度报警程序
{   

      if(tempwarn<=2)   //返回的值是温度的值,如果温度小于20度就报警并且启动风冷设备?
     {  
        beep = 0;
        delay(5000);//蜂鸣器的声音响的时间
        beep = 1;
        delay(50000);//蜂鸣器的声音不响的时间
      }
     else if(tempwarn>=30) //如果温度大于25度并且启动报警
      {   
          beep =0;
          delay(5000);
          beep =1;
          delay(50000);
       }   
  }
   
    void main()
{   
       rw = 0;  //rw直接置0,应该在液晶初始化前,否则断电后再通电就不能显示,切记!!!
     init();    //液晶初始化函数
   
  Readtemp();
     write_com(0x80+0x40);  //0x80+0x40表示液晶的第二行开始显示
     for(num=0;num<15;num++) //num<16,16表示显示16位
     {
       write_data(table1[num]);//液晶显示需要的内容,调用写液晶数据函数
      }
          while(1)  //大循环,不断检测和更新温度
      {   
        Readtemp();
         warn(tempwarn);
        write_com(0x80); //液晶的第一行开始地址
       for(num=0;num<15;num++)  //显示16位数据,后面的几位没有用到就写不到16,以免后面的几位会出现一个随机数据显示乱码?
      {
       write_data(table[num]);//液晶需要显示的内容
       }
    }
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。