帮我看看单片机设计用DS18B20测温的keil程序中的c语言编的代码,讲解一下大概每段是做什么?马上要答辩了
/*这个程序能用DS18B20进行温度采集显示*/#include<reg52.h>#include<intrins.h>#defineuintunsignedint#d...
/*这个程序能用DS18B20进行温度采集显示*/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint zhengshu,xiaoshu,xiaoshi,xiaoge,zhengshi,zhengge;
sbit DQ=P1^0; //DS18B20的数据总线
//共阴极的代码0~F
unsigned char code duandaima[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//数码管位选代码
unsigned char code weidaima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay_5us()
{
_nop_();
}
void delay(uint a)
{
while(a--);
}
void init18b20()
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(4);
n=DQ;
delay(20);
}
void write_byte18b20(uchar shu)
{
uchar i;
DQ=1;
delay_5us();
for(i=0;i<8;i++)
{
DQ=0;
delay_5us();
DQ=shu&0x01;
delay(3);
DQ=1;
shu=shu>>1;
}
delay(3);
}
uchar read_byte18b20()
{
uchar i,temp;
DQ=1;
delay_5us();
for(i=0;i<8;i++)
{
DQ=0;
temp=temp>>1;
DQ=1; //然后释放总线,接着才能读取数据
if(DQ==1) //开始读取数据,如果为1,则跟0x80相或。
//如果为0,则直接跳过此步,当右移时,0就出来了。
temp=temp|0x80;
delay(4); //开始读数据后,还要让其延时57us左右,如果只延时
//47us(即delay(3);)而已,则不能正确读出温度值!
DQ=1; //经过上面45us的延时数据读取完毕后释放总线
delay_5us(); //稍微延时一下
}
delay(3); //8位数据读完了之后稍微延时一下子
return temp; //返回读取出来的数值
}
//从DS18B20读取温度值
void read_temperature18b20()
{
uchar a,b;
init18b20(); //初始化18b20
write_byte18b20(0xcc); //跳过ROM
write_byte18b20(0x44); //启动温度变换
init18b20(); //初始化18b20
write_byte18b20(0xcc); //跳过ROM
write_byte18b20(0xbe); //读暂存存贮器
a=read_byte18b20(); //先读取第0字节寄存器的数据
b=read_byte18b20(); //读取第1字节寄存器的数据
zhengshu=((b<<4)&0x70)|((a>>4)&0x0f);//整数部分
xiaoshu=(a&0x0f)*6.25; //小数部分
}
//数码管显示程序
void display(uchar k1,uchar k2,uchar k3,uchar k4)
{
P2=duandaima[k1]; //显示小数个位
P3=weidaima[0];
delay(1000);
P2=0X00; //消影
P3=0x00;
P2=duandaima[k2]; //显示小数十位
P3=weidaima[1];
delay(1000);
P2=0X00; //消影
P3=0x00;
P2=(duandaima[k3]+0x80); //显示整数数个位加上一个小数点
P3=weidaima[2];
delay(1000);
P2=0X00; //消影
P3=0x00;
P2=duandaima[k4]; //显示整数十位
P3=weidaima[3];
delay(1000);
P2=0X00; //消影
P3=0x00;
}
//主函数
void main()
{
while(1)
{
read_temperature18b20();
xiaoshi=xiaoshu/10;
xiaoge=xiaoshu%10;
zhengshi=zhengshu/10;
zhengge=zhengshu%10;
display(xiaoge,xiaoshi,zhengge,zhengshi);
}
}
能不能详细点要答辩了,我对这完全不了解,东西是别人给做的,delay_5us() , delay(uint a),void init18b20(),void write_byte18b20(uchar shu)这几个方法是做什么?具体的,谢谢 展开
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint zhengshu,xiaoshu,xiaoshi,xiaoge,zhengshi,zhengge;
sbit DQ=P1^0; //DS18B20的数据总线
//共阴极的代码0~F
unsigned char code duandaima[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//数码管位选代码
unsigned char code weidaima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay_5us()
{
_nop_();
}
void delay(uint a)
{
while(a--);
}
void init18b20()
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(4);
n=DQ;
delay(20);
}
void write_byte18b20(uchar shu)
{
uchar i;
DQ=1;
delay_5us();
for(i=0;i<8;i++)
{
DQ=0;
delay_5us();
DQ=shu&0x01;
delay(3);
DQ=1;
shu=shu>>1;
}
delay(3);
}
uchar read_byte18b20()
{
uchar i,temp;
DQ=1;
delay_5us();
for(i=0;i<8;i++)
{
DQ=0;
temp=temp>>1;
DQ=1; //然后释放总线,接着才能读取数据
if(DQ==1) //开始读取数据,如果为1,则跟0x80相或。
//如果为0,则直接跳过此步,当右移时,0就出来了。
temp=temp|0x80;
delay(4); //开始读数据后,还要让其延时57us左右,如果只延时
//47us(即delay(3);)而已,则不能正确读出温度值!
DQ=1; //经过上面45us的延时数据读取完毕后释放总线
delay_5us(); //稍微延时一下
}
delay(3); //8位数据读完了之后稍微延时一下子
return temp; //返回读取出来的数值
}
//从DS18B20读取温度值
void read_temperature18b20()
{
uchar a,b;
init18b20(); //初始化18b20
write_byte18b20(0xcc); //跳过ROM
write_byte18b20(0x44); //启动温度变换
init18b20(); //初始化18b20
write_byte18b20(0xcc); //跳过ROM
write_byte18b20(0xbe); //读暂存存贮器
a=read_byte18b20(); //先读取第0字节寄存器的数据
b=read_byte18b20(); //读取第1字节寄存器的数据
zhengshu=((b<<4)&0x70)|((a>>4)&0x0f);//整数部分
xiaoshu=(a&0x0f)*6.25; //小数部分
}
//数码管显示程序
void display(uchar k1,uchar k2,uchar k3,uchar k4)
{
P2=duandaima[k1]; //显示小数个位
P3=weidaima[0];
delay(1000);
P2=0X00; //消影
P3=0x00;
P2=duandaima[k2]; //显示小数十位
P3=weidaima[1];
delay(1000);
P2=0X00; //消影
P3=0x00;
P2=(duandaima[k3]+0x80); //显示整数数个位加上一个小数点
P3=weidaima[2];
delay(1000);
P2=0X00; //消影
P3=0x00;
P2=duandaima[k4]; //显示整数十位
P3=weidaima[3];
delay(1000);
P2=0X00; //消影
P3=0x00;
}
//主函数
void main()
{
while(1)
{
read_temperature18b20();
xiaoshi=xiaoshu/10;
xiaoge=xiaoshu%10;
zhengshi=zhengshu/10;
zhengge=zhengshu%10;
display(xiaoge,xiaoshi,zhengge,zhengshi);
}
}
能不能详细点要答辩了,我对这完全不了解,东西是别人给做的,delay_5us() , delay(uint a),void init18b20(),void write_byte18b20(uchar shu)这几个方法是做什么?具体的,谢谢 展开
3个回答
展开全部
前面是ds18b20的初始化,读写程序,
后面是数码管显示程序
后面是数码管显示程序
追问
我对这完全不懂,请说具体点void delay_5us(),void delay(uint a),void init18b20(),void write_byte18b20(uchar shu)这几个方法是做什么?谢谢了
追答
建议你看下ds18b20时序吧,答辩会问到的,就这个小程序设计太简单了,没什么太多可说的,
个人认为老师一般会问,整个转化时间是多少,分辨率是多少,你这上面可没有,说明书还是要详细看,
启动转换命令字是多少,各个时序段的时间大概是多少,你应该都要写下来,不然一不知,不过不用担心,答辩指正是会让你过,只是评级不一样而已.
void delay_5us(),void delay(uint a),是延时函数,配合ds18b20时序工作的,
void init18b20(),是初始化ds18b20,你要看下资料才可以,按照时序来操作的,主要是检测18b20是否存在,存在初始化成功,才能进行读写操作,完成温度的读去,然后送显示.
并且就你的这个程序是0-100度的显示,根本完成不了-55~125度的显示
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询