打印

显示的温度不停的闪烁 请各位老师帮忙 都弄了一个星期了

[复制链接]
2689|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
haojianfu12345|  楼主 | 2011-3-20 06:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit duan=P2^6;
sbit wei=P2^7;
sbit en=P3^4;
sbit rs=P3^5;
sbit DQ=P2^2;
//uchar code table[]={"ds18b20"};
//uchar code table1[]={"0123456789"};
void delay(uint i)
{
while(i--);
}
void delay1(uchar t)
{
uchar x,y;
for(x=t;x>0;x--)
{
  for(y=110;y>0;y--);
}
}
init_ds18b20(void)
{
uchar x=0;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(14);
x=DQ;
delay(20);
}
readonebyte(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
  DQ=0;
  dat=dat>>1;
  DQ=1;
  if(DQ==1)
  {
   dat=dat|0x80;
  }
  delay(4);
}
return(dat);
}
writeonebyte(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat=dat>>1;
}
delay(4);
}
readtemper(void)
{
uchar a=0;
uchar b=0;
uchar t=0;
   init_ds18b20();
   writeonebyte(0xcc);
   writeonebyte(0x44);
   delay1(750);
   init_ds18b20();
   writeonebyte(0xcc);
   writeonebyte(0xbe);
delay1(750);
   a=readonebyte();
   b=readonebyte();
   
   t=(b<<4)|(a>>4);
   if(t>128)
   {
     t=~t+1;
   }
   return(t);
}
/****************************************/
1602程序
/*****************************************/
uchar com,inf;
uchar code table[]="ds18b20";
uchar code table1[]="0123456789";
void write_com(uchar com)
{
rs=0;
P0=com;
delay1(1);
en=1;
delay1(2);
en=0;
}
void write_inf(uchar inf)
{
rs=1;
P0=inf;
delay1(2);
en=1;
delay1(2);
en=0;
}
void init_lcd()
{
duan=0;
wei=0;
en=0;
rs=0;
write_com(0x38);
write_com(0x0f);
write_com(0x06);
write_com(0x01);
}

void main()
{
uchar num;
uchar tp,tp1,tp2;
  init_lcd();
delay(5);
    write_com(0x80);
for(num=0;num<7;num++)
{
  write_inf(table[num]);
  delay(10);
}
while(1)
{
  tp=readtemper();
  tp1=tp%10;
  tp2=tp/10;
  delay(20);
     write_com(0x80+0x0b);
   write_inf(table1[tp2]);
     write_com(0x80+0x0c);
   write_inf(table1[tp1]);
   write_com(0x80+0x0d);
  write_inf(0xdf);
    write_com(0x80+0x0e);
   write_inf('c');
  }
}

相关帖子

沙发
ocon| | 2011-3-20 09:06 | 只看该作者
经常听到学生对我说这句话,回答是:把注释都写上,写完了BUG也就暴露了。

使用特权

评论回复
板凳
dqyubsh| | 2011-3-20 10:51 | 只看该作者
呵呵,还是那句话,代码是给人看的,不是给机器看的。

使用特权

评论回复
地板
SmartEnergy| | 2011-3-20 10:57 | 只看该作者
经常听到学生对我说这句话,回答是:把注释都写上,写完了BUG也就暴露了。
ocon 发表于 2011-3-20 09:06

LS是老师呀? :)

使用特权

评论回复
5
刹那涅磐| | 2011-3-20 11:04 | 只看该作者
越来越觉得注释很重要

使用特权

评论回复
6
刹那涅磐| | 2011-3-20 11:04 | 只看该作者
越来越觉得注释很重要

使用特权

评论回复
7
红金龙吸味| | 2011-3-20 11:43 | 只看该作者
刷新不要太频繁。对于温度显示一秒钟刷新2~5次足矣。

使用特权

评论回复
8
haojianfu12345|  楼主 | 2011-3-20 16:11 | 只看该作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit duan=P2^6;     //定义数码管段选
sbit wei=P2^7;                //定义数码管位选
sbit en=P3^4;                //定义1602的lcden
sbit rs=P3^5;                //定义1602的rs
sbit DQ=P2^2;                //定义18b20的数据端

void delay(uint i)         //        延时函数
{
while(i--);
}
void delay1(uchar t)  //延时函数
{
        uchar x,y;
        for(x=t;x>0;x--)
        {
                for(y=110;y>0;y--);
        }
}
/****************************************
ds18b20程序
****************************************/
init_ds18b20(void)                //ds18b20的初始化
{
        uchar x=0;                        //定义变量x
        DQ=1;                                //将DQ拉高
        delay(8);                        //延时80us
        DQ=0;                                //将DQ拉低
        delay(80);                   //延时798us
        DQ=1;                                //将DQ拉高
        delay(14);                        //延时154us
        x=DQ;                                //把总线上的值读回来
        delay(20);                        //延时200us
}
readonebyte(void)                //读一个字节
{
        uchar i=0;                        //定义两个变量
        uchar dat=0;
        for(i=8;i>0;i--)
        {
                DQ=0;
                dat=dat>>1;                //返回的数据右移一位
                DQ=1;                        //释放总线
                if(DQ==1)
                {
                        dat=dat|0x80;          //将数据的高位或1
                }
                delay(4);                  //延时40us
        }
        return(dat);                  //将读到的数据返回给单片机
}
writeonebyte(uchar dat)           //写一个字节
{
        uchar i=0;
        for(i=8;i>0;i--)
        {
        DQ=0;
        delay(1);                 //延时至少1us
        DQ=dat&0x01;        //取出数据的最低位
        delay(5);                //延时66us
        DQ=1;                       
        dat=dat>>1;                //将数据右移一位

        }
        delay(4);                 //延时
}
readtemper(void)         //读取温度值
{
        uchar a=0;
        uchar b=0;
        uchar t=0;
   init_ds18b20();                        //初始化ds18b20
   writeonebyte(0xcc);                //跳过ROM指令
   writeonebyte(0x44);                //温度转换
//  delay1(750);

   init_ds18b20();
   writeonebyte(0xcc);
   writeonebyte(0xbe);                 //读暂存器
//        delay1(750);
   a=readonebyte();                         //温度的低字节
   b=readonebyte();                         //温度的高字节
   
   t=(b<<4)|(a>>4);                         //将两字节组合成一个字节
   if(t>128)                                //判断t的正负
   {
                   t=~t+1;                                //如果t 为负值取t的绝对值
   }
   return(t);
}
/****************************************
1602的驱动程序
****************************************/


uchar com,inf;
uchar code table[]="ds18b20";
uchar code table1[]="0123456789";

void write_com(uchar com)           //写指令
{
        rs=0;
        P0=com;
        delay1(1);
        en=1;
        delay1(2);
        en=0;
}
void write_inf(uchar inf)                //写数据
{
        rs=1;
        P0=inf;
        delay1(2);
        en=1;
        delay1(2);
        en=0;
}
void init_lcd()                                  //液晶的初始化
{
        duan=0;
        wei=0;
        en=0;
        rs=0;
        write_com(0x38);
        write_com(0x0f);
        write_com(0x06);
        write_com(0x01);

}


/********************************************************
主函数
*********************************************************/
void main()
{
        uchar num;
        uchar tp,tp1,tp2;
        init_lcd();                        //液晶的初始化
        delay(5);

    write_com(0x80);
        for(num=0;num<7;num++)
        {
                write_inf(table[num]);           //写ds18b20这几个字
                delay(10);
        }
        while(1)
        {
                tp=readtemper();                 //将读出来的温度付给tp
                tp1=tp%10;                                 //温度的个位
                tp2=tp/10;                                //温度的十位
               
            write_com(0x80+0x0b);                 //显示出来
                 write_inf(table1[tp2]);

            write_com(0x80+0x0c);
                 write_inf(table1[tp1]);

                 write_com(0x80+0x0d);
         write_inf(0xdf);

                  write_com(0x80+0x0e);
                 write_inf('c');
                // delay1(1000);

        }
}


我是初学者  注释写上了还是找不出来错误  视频教程这样写就可以  我的怎么不行呀  请各位老师帮忙

使用特权

评论回复
9
宋业科| | 2011-3-20 16:41 | 只看该作者
因为你的温度不稳。

使用特权

评论回复
10
haojianfu12345|  楼主 | 2011-3-20 18:05 | 只看该作者
温度不稳  不会吧  用手捂住18b20显示的温度也不对  显示01度

使用特权

评论回复
11
liulei20101008| | 2011-3-20 21:47 | 只看该作者
围观学习中,楼主加油 啊

使用特权

评论回复
12
wangkangming| | 2011-3-21 22:13 | 只看该作者
void delay(uint i)         //        延时函数
{
while(i--);
}
这个延时时间大约是i*10微秒吗?多多指教啊

使用特权

评论回复
13
ocon| | 2011-3-22 00:48 | 只看该作者
在主程序中
tp=readtemper();                 //将读出来的温度付给tp
的下面加一行tp=123,测试一下问题出在哪个模块。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

7

帖子

1

粉丝