问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请教52单片机使DS18B20程序问题

发布网友 发布时间:2022-07-20 03:16

我来回答

2个回答

热心网友 时间:2023-10-18 20:18

#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit DS=P3^3; //定义DS18B20接口

int temp;

uchar flag1;

void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数

void delay();//延时子函数,5个空指令

code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x08,0x00};
//共阴数码管 0-9 - _ 空 表

unsigned char l_tmpdate[8]={0,0,10,0,0,0,0,0};//定义数组变量,并赋值1,2,3,4,5,6,7,8,就是本程序显示的八个数
int tmp(void);
void tmpchange(void);
void tmpwritebyte(uchar dat);
uchar tmpread(void);
bit tmpreadbit(void);
void dsreset(void);
void delayb(uint count);

void main() //主函数

{
uchar i;
int l_tmp;
while(1)
{
tmpchange(); //温度转换
l_tmp=tmp();
if(l_tmp<0)
l_tmpdate[0]=10; //判断温度为负温度,前面加"-"
else
{
l_tmpdate[0]=temp/1000; //显示百位,这里用1000,是因为我们之前乖以10位了
if(l_tmpdate[0]==0)
l_tmpdate[0]=12;//判断温度为正温度且没有上百,前面不显示
}
l_tmp=temp%1000;
l_tmpdate[1]=l_tmp/100;//获取十位
l_tmp=l_tmp%100;
l_tmpdate[2]=l_tmp/10;//获取个位
l_tmpdate[3]=11;
l_tmpdate[4]=l_tmp%10;//获取小数第一位

for(i=0;i<10;i++){ //循环输出10次,提高亮度
display(l_tmpdate,5);

}
}

}

void display(unsigned char *lp,unsigned char lc)//显示
{
unsigned char i; //定义变量
P2=0; //端口2为输出
P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管
for(i=0;i<lc;i++){ //循环显示
P2=table[lp[i]]; //查表法得到要显示数字的数码段
delay(); //延时5个空指令
if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据
break;
P2=0; //清0端口,准备显示下位
P1++; //下一位数码管
}
}
void delay(void) //空5个指令
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}
void delayb(uint count) //delay

{

uint i;

while(count)

{

i=200;

while(i>0)

i--;

count--;

}

}

void dsreset(void) //DS18B20初始化

{

uint i;

DS=0;

i=103;

while(i>0)i--;

DS=1;

i=4;

while(i>0)i--;

}

bit tmpreadbit(void) // 读一位

{

uint i;

bit dat;

DS=0;i++; //小延时一下

DS=1;i++;i++;

dat=DS;

i=8;while(i>0)i--;

return (dat);

}

uchar tmpread(void) //读一个字节

{

uchar i,j,dat;

dat=0;

for(i=1;i<=8;i++)

{

j=tmpreadbit();

dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好//一个字节在DAT里

}

return(dat); //将一个字节数据返回

}

void tmpwritebyte(uchar dat)

{ //写一个字节到DS18B20里

uint i;

uchar j;

bit testb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb) // 写1部分

{

DS=0;

i++;i++;

DS=1;

i=8;while(i>0)i--;

}

else

{

DS=0; //写0部分

i=8;while(i>0)i--;

DS=1;

i++;i++;

}

}

}

void tmpchange(void) //发送温度转换命令

{

dsreset(); //初始化DS18B20

delayb(1); //延时

tmpwritebyte(0xcc); // 跳过序列号命令

tmpwritebyte(0x44); //发送温度转换命令

}

int tmp() //获得温度

{

float tt;

uchar a,b;

dsreset();

delayb(1);

tmpwritebyte(0xcc);

tmpwritebyte(0xbe); //发送读取数据命令

a=tmpread(); //连续读两个字节数据

b=tmpread();

temp=b;

temp<<=8;

temp=temp|a; //两字节合成一个整型变量。

tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20

//可以精确到0.0625度,所以读回数据的最低位代表的是

//0.0625度。

temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位

//也转换为可显示数字,同时进行一个四舍五入操作。

return temp; //返回温度值

}

void readrom() //read the serial 读取温度传感器的序列号

{ //本程序中没有用到此函数

uchar sn1,sn2;

dsreset();

delayb(1);

tmpwritebyte(0x33);

sn1=tmpread();

sn2=tmpread();

}

void delay10ms()
{

uchar a,b;

for(a=10;a>0;a--)

for(b=60;b>0;b--);

}

热心网友 时间:2023-10-18 20:19

难道15不对?
先看一下测出来的数值(不要处理)对不对,再做其他的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
茶映人生:苦尽甘来 海尔冰箱冷藏室和冷冻室都是空空的通上电工作会更耗电吗? 上菱冰箱用过7年了,1米5高有点大,我每天冰箱里面只冻半斤肉,冷藏室其它... 结婚前个人的保险结婚后转成存单是属于个人财产还是夫妻双方的财产_百 ... 六个月宝宝大便水样蛋花怎么办 宝宝拉蛋花样便怎么办 ...张仙亲送玉麒麟,一家老少皆欢喜,祖德宗功信可凭。 我见青山多妩媚,料青山见我应如是意思 料青山见我应如是的意思_百度知... 电脑导航用哪个比较好电脑用什么网址导航哪个更好用 电脑看地图哪个好电脑上的哪个地图软件好 用245驱动DS18B20的程序 微信因自身原因崩溃了怎么找回? 春去秋来又十年什么生肖 你好,健康人能喝转移因子口服液吗? 请问老年人喝转移因子好吗 什么人可以服转移因子 跖疣冷冻后可以洗澡吗 请问有没有人保寿险盛世富贵保险产品 有一种爱叫永远歌词歌谱- 问一问 如果没有钱,怎么做微商 4S锂电池多少算过放 洗河蟹的水有寄生虫吗?如果溅到眼睛里,眼睛会有寄生虫吗 不小心将杀鱼的脏水溅到眼睛里,会不会感染 我在清洗锅时,不小心把那个脏水溅到眼睛里面去了:现在眼睛好痛:应该怎么办? 洗鱼的时候不小心将水弄到眼睛里会不会有寄生虫啊?该怎么办?还有水沾到衣服上还可以继续穿吗?谢谢。 洗虾子水溅到眼睛了,过敏怎么办 尼康d850在AF-C对焦模式时蜂鸣器为什么不响- 问一问 米醋和白醋治疗跖疣到底哪个好? 柯南剧场版一共有多少部?分别是什么?分别首映时间是什么? 《无价的奖赏》赏析200字 丨这是什么花? 关于绣线菊的小故事 中华绣线菊的介绍 红牛饮料集团的老总是谁? 喉咙痛咽炎怎么治 像【表】(不要)【酱紫】(这样子)这样的因为普通话连读合音而成的网络流行词(流行语)还有那些? 不锈钢被洁厕灵腐蚀了怎么办 不锈钢被洁厕灵腐蚀后怎么处理 红牛老板是哪里人 红牛饮料公司的董事长叫什么? 燃气开关怎么是开怎么是关 燃气开关的开关解析 怎么分辨狗狗公母 红牛维他命饮料有限公司的老总是谁? F1大红牛、小红牛的老板是不是同一人? 红牛老总严彬是山东哪的 哈弗m6上坡怎么起步,老是熄火一档无力 盛世投资的管理团队 红牛总裁是谁 新编卡尔卡西古典吉他教程 二练习提高篇(六线谱).pdf 求新编卡尔卡西古典吉他教程1的电子书版 蜂胶是空腹吃好还是吃饭以后吃好?