DS18B20与80C51 DS这边改了延时还不行 实在是看不出代码哪里错了 大佬们帮帮忙

我不是fai5 2018-12-04 11:35:07



#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define data 1000
#define lcd_date P0
sbit lcd_en=P2^2;//定义P2口第2位
sbit lcd_rw=P2^1;//定义P2口第1位
sbit lcd_rs=P2^4;//定义P2口第4位
sbit key0=P1^0;//定义P1口第0位
sbit key1=P1^1;//定义P1口第1位
sbit led=P1^7;//定义P1口第7位
uchar code lcdtable[]={"0123456789- "};
uchar code error[12]={"no facility"};
uchar rom_id[3][8]={ {0x28,0xc4,0x14,0x11,0x00,0x00,0x00,0x89},
{0x28,0xc4,0x14,0x10,0x00,0x00,0x00,0x06}};
uchar dispbuf[8];
uchar dispbuf1[8];
uint data1=50000;
uchar tem1,tem2,temt1,temt2;
uint temper1;//温度寄存器
uint temper11;
uint temper22;
uint temper2;
uint tempert1;//温度阈值R-min
uint tempert2;//温度阈值R-max
uint tempert11;
uint tempert22;
#define NOP3() _nop_();_nop_();_nop_()
sbit DQ=P3^2; //DQ脚
bit flag_init; //DS18B20运行标志

/************ us延时*************/
void delay_us(unsigned int tt)
{
while(tt--)
{
;
}
}

/************ ms延时*************/
void delay_ms(unsigned int tms)
{
unsigned char i;
while(tms--)
for(i=123;i>0;i--)
;
}


void Write_com(uchar com)
{
lcd_rs=0;
lcd_rw=0;
lcd_date=com;
delay_ms(2);
lcd_en=1;
delay_ms(2);
lcd_en=0;
}

void Write_dat(uchar dat)
{
lcd_rs=1;
lcd_rw=0;
lcd_date=dat;
delay_ms(2);
lcd_en=1;
delay_ms(2);
lcd_en=0;
}

void lcd_init()
{
lcd_rw=0;
lcd_en=0;
delay_ms(15);
Write_com(0x38);//显示模式设置
delay_ms(5);
Write_com(0x38);//显示模式设置
delay_ms(5);
Write_com(0x38);//显示模式设置
Write_com(0x08);//显示关闭
Write_com(0X01);//清屏
Write_com(0x06);//显示光标
Write_com(0X0c);//显示开关及光标显示
}

/****DS18B20初始化¯**************************************/
void reset()
{
flag_init=1;
EA=0;
DQ=1;
NOP3();
DQ=0;
delay_us(60);//480~960us 556
DQ=1;

delay_us(5);//60us
flag_init=DQ;
delay_us(60);//241us
EA=1;
}

/****************写一个字节函数*************************/
void Write_Byte(uchar dat)
{
uchar i;
DQ=1;
EA=0;
for(i=8;i>0;i--)
{
DQ=0;
delay_us(5);//61us
DQ=(bit)(dat&0x01);
delay_us(5);//61us
DQ=1;
dat>>=1;
}
EA=1;
}

/*****读一个字节函数*****************************/
uchar Read_Byte()
{
uchar i,date;
date=0;
DQ=1;
EA=0;//关闭中断
for(i=8;i>0;i--)
{
DQ=0;
date>>=1;
DQ=1;
NOP3();
if(DQ)
{
date|=0x80;
}
delay_us(5);//61us
}
EA=1;//打开中断
return(date);
}

void match_rom(uchar rom_id[])
{
uchar n;
reset(); //DS18B20初始化
Write_Byte(0x33);
for(n=0;n<8;n++)
rom_id[n]=Read_Byte();
}

void get_tem()
{
uchar teml,temh;
reset();
Write_Byte(0xcc);
Write_Byte(0x44);//启动温度转换
delay_ms(800);//750ms
match_rom(0);
Write_Byte(0xbe);//读取温度转换结果
teml=Read_Byte();
temh=Read_Byte();
temper11=(temh*256+teml);
if(temper11&0x8000)
{
temper1=(~temper11+1)*0.625;
tem1=1;
}
else
{
temper1=(temh*256+teml)*0.625;
tem1=0;
}

}

void get1_tem()
{
uchar teml,temh;
reset();
Write_Byte(0xcc);
Write_Byte(0x44);
delay_ms(800);//750ms
match_rom(1);
Write_Byte(0xbe);
teml=Read_Byte();
temh=Read_Byte();
temper22=(temh*256+teml);
if(temper22&0x8000)
{
temper2=(~temper22+1)*0.625;
tem2=1;
}
else
{
temper2=(temh*256+teml)*0.625;
tem2=0;
}

}

void update()
{
if(tem1)
{
dispbuf[0]=10;
if(temper1/100)
dispbuf[1]=temper1/100;
else
dispbuf[1]=11;
dispbuf[2]=temper1%100/10;
dispbuf[3]=temper1%10;
}
else
{
if(temper1/1000)
{
dispbuf[0]=temper1/1000;
dispbuf[1]=temper1%1000/100;
}
else
{
dispbuf[0]=11;
if(temper1/100)
dispbuf[1]=temper1/100;
else
dispbuf[1]=11;
}
dispbuf[2]=temper1%100/10;
dispbuf[3]=temper1%10;
}
if(tem2)
{
dispbuf[4]=10;
if(temper2/100)
dispbuf[5]=temper2/100;
else
dispbuf[5]=11;
dispbuf[6]=temper2%100/10;
dispbuf[7]=temper2%10;
}
else
{
if(temper2/1000)
{
dispbuf[4]=temper2/1000;
dispbuf[5]=temper2%1000/100;
}
else
{
dispbuf[4]=11;
if(temper2/100)
dispbuf[5]=temper2/100;
else
dispbuf[5]=11;
}
dispbuf[6]=temper2%100/10;
dispbuf[7]=temper2%10;
}
}

void update_1()
{
if(tempert1/1000)
{
dispbuf1[0]=tempert1/1000;
dispbuf1[1]=tempert1%1000/100;
}
else
{
dispbuf1[0]=11;
if(tempert1/100)
dispbuf1[1]=tempert1/100;
else
dispbuf1[1]=11;
}
dispbuf1[2]=tempert1%100/10;
dispbuf1[3]=tempert1%10;


if(tempert2/1000)
{
dispbuf1[4]=tempert2/1000;
dispbuf1[5]=tempert2%1000/100;
}
else
{
dispbuf1[4]=11;
if(tempert2/100)
dispbuf1[5]=tempert2/100;
else
dispbuf1[5]=11;
}
dispbuf1[6]=tempert2%100/10;
dispbuf1[7]=tempert2%10;

}

void ds_init()
{
led=0;
tempert1=100;
tempert2=990;
}

void disp()
{
Write_com(0xc0);
Write_dat('1');
Write_dat(':');
Write_dat(lcdtable[dispbuf[0]]);
Write_dat(lcdtable[dispbuf[1]]);
Write_dat(lcdtable[dispbuf[2]]);
Write_dat('.');
Write_dat(lcdtable[dispbuf[3]]);
Write_com(0xc9);
Write_dat('2');
Write_dat(':');
Write_dat(lcdtable[dispbuf[4]]);
Write_dat(lcdtable[dispbuf[5]]);
Write_dat(lcdtable[dispbuf[6]]);
Write_dat('.');
Write_dat(lcdtable[dispbuf[7]]);

Write_com(0x80);
Write_dat('L');
Write_dat(':');
Write_dat(lcdtable[dispbuf1[0]]);
Write_dat(lcdtable[dispbuf1[1]]);
Write_dat(lcdtable[dispbuf1[2]]);
Write_dat('.');
Write_dat(lcdtable[dispbuf1[3]]);
Write_com(0x89);
Write_dat('H');
Write_dat(':');
Write_dat(lcdtable[dispbuf1[4]]);
Write_dat(lcdtable[dispbuf1[5]]);
Write_dat(lcdtable[dispbuf1[6]]);
Write_dat('.');
Write_dat(lcdtable[dispbuf1[7]]);
}

key() interrupt 3
{
TH1=(65536-data1)>>8;
TL1=(65536-data1)%256;
if(key0==0)
{
tempert1+=10;
if(tempert1>1280)
tempert1=0;
while(key0==0);
}
if(key1==0)
{
tempert2-=10;
if(tempert2>1280)
tempert2=1280;
while(key1==0);
}
}


void init_mcu()
{
TMOD=0x01;
TH1=(65536-data1)>>8;
TL1=(65536-data1)%256;
ET1=1;TR1=1;
EA=1;
}

//报警函数
void alarm()
{

if((temper1<tempert1||temper1>tempert2)||(temper2<tempert1||temper2>tempert2))
{ led=1;}
else
{ led=0;}
}

// 主函数
void main()
{
uchar i;
init_mcu();
ds_init();
lcd_init();

while(1)
{
reset();
if(flag_init)//ds18b20
{
Write_com(0x80);
for(i=0;i<12;i++)
{
Write_dat(error[i]);
}
}

else//ds18b20启动
{
get_tem();
get1_tem();
update();
update_1();
delay_ms(60);
disp();
alarm();
}
}
}
...全文
246 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
显示一直是0的话,有可能就是没有获取到传感器的数据,所以有一个可能的原因是传感器在仿真时序列号没有编辑
worldy 2018-12-07
  • 打赏
  • 举报
回复
LZ的18B20没有接进系统啊
yishumei 2018-12-07
  • 打赏
  • 举报
回复
引用 8 楼 qq_41570616 的回复:
把isis里面的ds18b20地址改了一下 然后在百度上找了另外两组地址吗 放程序里面 就可以跑路 虽然弄好了 但是很懵
建议楼主参考以下网址提供的例程https://blog.csdn.net/cp1300/article/details/8817368。 刚开始学习时,一定要学习芯片的数据资料,好好研读。然后结合例程,动手操作。弄懂之后再使用其他芯片也不会无从下手。
我不是fai5 2018-12-06
  • 打赏
  • 举报
回复
把isis里面的ds18b20地址改了一下 然后在百度上找了另外两组地址吗 放程序里面 就可以跑路 虽然弄好了 但是很懵
我不是fai5 2018-12-05
  • 打赏
  • 举报
回复
我自己改过了 问题是从ds18b20读取数据转换的值 一直是0 能帮忙看看问题在哪吗
Aing丶 2018-12-05
  • 打赏
  • 举报
回复
一般这种问题都是延时有问题吧。可以尝试用keil 软件仿真测试下延时是否正确。注意修改软件仿真的晶振。
  • 打赏
  • 举报
回复
当时学这个时也遇到问题,运行别人提供的代码实际运行也是错误的,代码也是错误的,不过获取读的值,并查网络上资料后才发现问题所在,也就解决了.
yishumei 2018-12-05
  • 打赏
  • 举报
回复
引用 5 楼 qq_41570616 的回复:
是匹配DS18B20的地址位 然后发送相应的数据
uchar rom_id[3][8]={ {0x28,0xc4,0x14,0x11,0x00,0x00,0x00,0x89}, {0x28,0xc4,0x14,0x10,0x00,0x00,0x00,0x06}}; 这个多维数组里定义的是两个18B20的地址吧。楼主总线上挂了两个18B20,读取温度时需要匹配相应器件的ROM地址,否则总线上的数据冲突,读不到正确的温度值。楼主可以先去掉一个18B20,获取温度时不调用match_rom,看看读到的温度数据是否正确。
我不是fai5 2018-12-05
  • 打赏
  • 举报
回复
是匹配DS18B20的地址位 然后发送相应的数据
我不是fai5 2018-12-05
  • 打赏
  • 举报
回复
我理解的是先设置DS18B20的地址位
没有报错
yishumei 2018-12-05
  • 打赏
  • 举报
回复
楼主,下面这个子函数完成什么功能? void match_rom(uchar rom_id[]) { uchar n; reset(); //DS18B20初始化 Write_Byte(0x33); for(n=0;n<8;n++) rom_id[n]=Read_Byte(); } 子函数get1_tem()调用match_rom(1)时不报错吗?

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧