DS18B20 AT89S52单片机四位共阳数码管温度计怎么才能实现,各位大神下面是我的程序,主要显示函数不会弄

#include<reg51.h>#include<stdio.h>#defineucunsignedchar#defineuiunsignedintsbitds=P2^... #include <reg51.h>
#include <stdio.h>
#define uc unsigned char
#define ui unsigned int
sbit ds=P2^7;//温度传感器信号线
sbit g=P3^4;//数码管个位
sbit sh=P3^5;//数码管十位
sbit b=P3^6;//数码管百位
sbit q=P3^7;//数码管千位
sbit wd=P3^0;//温度信号
sbit s=P0^0;//上
sbit zs=P0^1;//左上
sbit zx=P0^2;//左下
sbit x=P0^3;//下
sbit d=P0^4;//小数点
sbit yx=P0^5;//右下
sbit zj=P0^6;//中间
sbit ys=P0^7;//右上
ui temp;
double f_temp;
uc code table[]={0x50,0x5f,0x32,0x16,0x1d,0x94,0x90,0x5e,0x10,0x14};//对应数码管的的0-9;
void delay(ui n) //延时函数
{
ui x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void) //温度芯片初始化程序
{
ui i;
wd=0;
i=103;
while(i>0)i--;
wd=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void)//读一位数据函数
{
ui i;
bit dat;
wd=0;i++;
wd=1;i++;i++;
dat=wd;
i=8;while(i>0)i--;
return(dat);
}
uc tempread(void)//读一个字节数据函数
{
uc i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在前面,这样刚好一个字节在dat里
}
return(dat);
}
void tempwritebyte(uc dat)//向ds18b20写一个字节数据函数
{
ui i;
uc j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{
wd=0;
i++;i++;
wd=1;
i=8;while(i>0)i--;
}
else
{
wd=0;
i=8;while(i>0)i--;
wd=1;
i++;i++;
}
}
}
void tempchange(void) //传感器开始获取温度并转化
{
dsreset();
delay(1);
tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0x44);//写温度转化指令
}
ui get_temp() //读取寄存器中存储的温度数据
{
uc a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
return temp;
}
void display()//显示函数
{ ui x,i;
P3=0xf0;
x=get_temp();
i=x%10;
P0=table[i];

}
void main()
{
while(1)
{
tempchange();
display();
}
}
能解决问题的,我会继续提高悬赏
展开
 我来答
飘着叶的繁华
2013-05-30 · 超过19用户采纳过TA的回答
知道答主
回答量:104
采纳率:0%
帮助的人:28.9万
展开全部
显示函数有问题。。给你一个参考一下
void display(int bai,int shi,int ge)
{
x=get_temp();//读温度
bai=x%1000/100;//显示百位
shi=x%100/10;//显示十位
ge=x%10;//显示个位

P2=0Xdf; //显示小数点
P0=0X7f; //显示小数点
delay(150);//显示小数点
P2=0x7f;
P0=table[0];//显示千位
delay(300);//一小段延时动态显示
P2=0xbf;
P0=table[bai];//显示百位
delay(300);
P2=0xdf;
P0=table[shi]|0x80;//显示十位
delay(300);
P2=0xef;
P0=table[ge];//显示个位
delay(300);
}不过你的程序真够麻烦,给你一个看看。
/××××××××××××××××××××××××××××××××××××××××××××/
#include<reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
sbit DATA = P3^7; //DS18B20接入口
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
char bai,shi,ge; //定义变量

/*延时子函数*/
void delay(uint num)
{
while(num--) ;
}

/*************DS18b20温度传感器函数*********************/
void Init_DS18B20(void) //传感器初始化
{
uchar x;
DATA = 1; //DQ复位
delay(10); //稍做延时
DATA = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us //450
DATA = 1; //拉高总线
delay(20); //初始化成功的话S18b20返回一个信号 DATA
x=DATA; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(30);

}

//读一个字节 从低位到高位
ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DATA = 0; // 给脉冲信号
dat>>=1;
DATA = 1; // 给脉冲信号
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}

//写一个字节
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DATA = 0;
DATA = dat&0x01;
delay(10);
DATA = 1;
dat>>=1;
}
delay(8);
}

//读取温度
int ReadTemperature(void)
{
uchar a=0;
uchar b=0;
int t=0;
float tt=0;
Init_DS18B20(); //初始化
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}

/*显示子函数*/
void display(int bai,int shi,int ge)
{

P2=0Xdf; //显示小数点
P0=0X7f; //显示小数点
delay(150);//显示小数点

P2=0x7f;
P0=table[0];//显示千位
delay(100);//一小段延时动态显示
P2=0xbf;
P0=table[bai];//显示百位
delay(100);
P2=0xdf;
P0=table[shi]|0x80;//显示十位
delay(100);
P2=0xef;
P0=table[ge];//显示个位
delay(100);
}

void main()
{
int temp;
while(1)
{
temp=ReadTemperature();//读温度
bai=temp%1000/100;//显示百位
shi=temp%100/10;//显示十位
ge=temp%10;//显示个位

display(bai,shi,ge);//显示函数
}
}
追问
读出的的温度为零。。。。。。。。。。。
追答
你确定?我这边可以显示的额。看看我们的数码管是不是一样?有共阳极和共阴极之分的
百度网友c6746721f
2013-05-30 · 超过38用户采纳过TA的回答
知道小有建树答主
回答量:72
采纳率:100%
帮助的人:58.5万
展开全部
void display()
{
ui a,b,c ;
x=get_temp(); //把温度读回来
a=x/100;
b=x%100/10;
c= x%10; //a,b,c 分别是十位,个位,小数点 三个数字,然后分别显示就行了

}
追问
读出的的温度为零。。。。。。。。。。。怎么破呢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
GUEL86
2013-05-30 · TA获得超过5855个赞
知道大有可为答主
回答量:5538
采纳率:86%
帮助的人:2687万
展开全部

仿真实例,参考一下吧。

追问
读出的的温度为零。。。。。。。。。。。
追答
应该没有问题的,你下载后直接仿真,原始为 1.9 度,调节温度传感器 可以改变温度。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式