2900|7

4

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

不知道程序哪里不对,18B20转 到1602的程序 [复制链接]

#include
#include
#include     //字符串处理
#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]);//液晶需要显示的内容
       }
    }
}
此帖出自51单片机论坛

最新回复

没说清是什么问题啊.  详情 回复 发表于 2014-4-27 22:22
点赞 关注
 

回复
举报

58

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
你这个问题太泛泛了,你最好把错误给大家看一看,我想这个不难解决,因为这都是最基本的程序
此帖出自51单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
程序没显示有错误啊
此帖出自51单片机论坛
 
 
 

回复

1183

帖子

1

TA的资源

纯净的硅(高级)

4
 
时间 延时一定得高对。
此帖出自51单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

5
 
我用的是  测试过的模板, 单独使用是没问题的
此帖出自51单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

6
 
换了这个程序  1602屏幕一直显示    temp:-000.9hi           不知道哪里出现问题了
#include
#include
#include     //字符串处理
#define uchar unsigned char
#define uint unsigned int
uchar table[]={"  temp:"};
uchar table1[]={"www.china.cn"};
/********IO引脚定义**********/
sbit rs = P3^2;   
sbit rw = P3^3;
sbit en = P3^4;
sbit dq = P2^5;   
sbit beep = P2^7;

uchar num;
uint tempwarn,d=0,h=0;

void delay(uint n)
{
   while(n>0)n--;
}

void write_com(uchar com)  //液晶写命令程序
{   
    rs=0;  //等0输入命令
    en=0;  //液晶使能信号初始化?
   P1=com;  //把com参数,液晶的命令值送到P1口
   delay(100);  //延时,按照液晶的时序图的要求
   en=1;    //使能信号,0到1表示上升沿打开可以写命令数据到液晶里
    delay(100);   
    en=0;     //使能信号回复
  
}
    void write_data(uchar date)  //液晶写数据程序
  {
      rs=1;  //等1表示输入数据
      en=0;  
      P1=date;  //把date参数,液晶的数据送到P0口
      delay(100);
      en=1;
      delay(100);
      en=0;

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

    void Writebyte(uchar dat)//DS18B20温度芯片的写字节程序
  {
       uchar j;
      for(j=0;j<8;j++)
       {
          dq=0;
          dq=dat&0x01;
          delay(5);
           dq=1;
           dat>>=1;
        }
  
   }
      
    uchar Readbyte(void)   //DS18B20温度芯片读字节程序
{   uchar i,dat=0;
    for(i=0;i<8;i++)
   {
      dq=0;
       dat>>=1;
      dq=1;
          if(dq==1)
         dat |= 0x80;
      delay(4);
    }
       return dat;
}  
     void initds18b20(void) //温度芯片初始化程序
{   uchar x=0;
    dq=1;
     delay(8);
    dq=0;
      delay(80);
    dq=1;
      delay(14);
    x=dq;
    delay(20);
}  
   void Readtemp(void) //读温度程序
{    initds18b20();
     Writebyte(0xcc);
     Writebyte(0x44);

     initds18b20();
     Writebyte(0xcc);
     Writebyte(0xbe);
    d=Readbyte();  //温度信号的低8位数据函数
    h=Readbyte();  //温度信号的高8位数据函数
}
     convert()  //温度信号处理程序,把温度信号数据值转换为液晶显示
{    uint temp,tmp;
     float tt;
     tmp=d;  //低8位数据给tmp?
            temp=h; //高8位数据给temp
     temp<<=8;  //高8位左移8位
     temp|=d;   //高低8位数据或起来再赋给temp
    if((h&0x80)!=0)  //高8位h&10000000是否等0,不等0表示负多少度
{
      table[7]='-';  //把-赋给液晶数组的第8个元素,表示-号在第8位,1602一行有16个字符
      temp=temp-1;
      temp=~temp;
}
    else
         table[7]='+';
         temp>>=4;
         table[8]=(temp/100)+'0';  //液晶第9位字符为温度的百位数,例如120度的1
         table[9]=(temp/10)%10+'0'; //液晶第10位字符为温度的十位数,例如120度的2?
         table[10]=(temp%10)+'0';  //液晶第9位字符为温度的个位数,例如120度的0
         tmp=tmp&0x0f;           //低位温度提取小数数据
         tt=tmp*0.0625;        //小数部分数据转换
         table[11]='.';         //显示小数点
         table[12]=((uchar)(tt*10))%10+'0'; //小数点后面的小数数字
         tempwarn=temp;
return tempwarn;     //温度值返回
}   
   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();    //液晶初始化函数
     write_com(0x80+0x40);  //0x80+0x40表示液晶的第二行开始显示
     for(num=0;num<15;num++) //num<16,16表示显示16位
     {
       write_data(table1[num]);//液晶显示需要的内容,调用写液晶数据函数,这行显示拼音dengtianming
      }
        while(1)  //大循环,不断检测和更新温度
   {   
        Readtemp();
        convert();
        warn(tempwarn);
       write_com(0x80); //液晶的第一行开始地址
       for(num=0;num<15;num++)  //显示16位数据,后面的几位没有用到就写不到16,以免后面的几位会出现一个随机数据显示乱码?
      {
       write_data(table[num]);//液晶需要显示的内容
       }
    }
}
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

7
 
查看本帖全部讨论,请登录或者注册
此帖出自51单片机论坛
 
 
 

回复

3471

帖子

14

TA的资源

五彩晶圆(高级)

8
 
查看本帖全部讨论,请登录或者注册
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 10

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表