//程序:ex6_2_1.c
//功能:数字温度计
#include "reg51.h"
#include "intrins.h" //包含内部函数头文件intrins.h
#define uchar unsigned char
#define uint unsigned int
#define out P2
sbit smg1=P3^1; //温度个位位选端
sbit smg2=P3^0; //温度十位位选端
sbit DQ=P3^7; //温度采集
void delay5us(uchar n); //精确延时n*5us子程序
void delayms(uint j);
void init_ds18b20(void); //总线初始化复位
uchar readbyte(void); // 读取一个字节
void writebyte(uchar); //写一个字节
uchar readtemp(void); //读取温度
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳数码管显示"0-9"字型码
void main(void)
{uchar i;
uchar temp;
temp=readtemp(); //读取转换的温度
delayms(1000);
while(1)
{
temp=readtemp(); //读取转换的温度
for(i=0;i<10;i++) //连续扫描数码管10次
{
out=led[temp/10]; //显示温度十位
smg1=0;
smg2=1;
delay5us(200); //延时1ms
out=0xff;
out=led[temp%10]; //显示温度个位
smg1=1;
smg2=0;
delay5us(200); //延时1ms
out=0xff;
}
}
}
//函数名:delay5us
//函数功能:精确延时5us子程序
//形式参数:延时时间参数n,unsigned char 类型
//返回值:无
void delay5us(unsigned char n)
{ do
{
_nop_();
_nop_();
_nop_();
n--;
}
while(n);
}
//函数名:init_ds18b20
//函数功能: 总线初始化复位
//形式参数:无
//返回值:无
void init_ds18b20(void)
{
uchar x=0;
DQ=1;
delay5us(10);
DQ =0;
delay5us(120); //低电平480-960s
DQ =1;
delay5us(16); //等待50-100s
x=DQ;
delay5us(80);
DQ=1;
}
//函数名:readbyte
//函数功能: 读取一个字节
//形式参数:无
//返回值:读取字节数据date, unsigned char 类型
uchar readbyte(void)
{
uchar i=0;
uchar date=0;
for (i=8;i>0;i--)
{
DQ =0;
delay5us(1);
DQ =1; //15微秒内拉释放总线
date>>=1;
if(DQ)
date|=0x80;
delay5us(11); //读完需要45us的等待
}
return(date);
}
//函数名:writebyte
//函数功能: 写一个字节
//形式参数:写字节数据dat, unsigned char 类型
//返回值:无
void writebyte(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ =0;
DQ =dat&0x01; //写"1" 在15微秒内拉低
delay5us(12); //写"0" 拉低60微秒等待写完
DQ = 1; //恢复高电平,至少保持1us
dat>>=1; //下次写作准备,移位数据
delay5us(5); //延时25us
}
}
//函数名: readtemp
//函数功能:读取温度
//形式参数:无
//返回值:单字节的温度值tt, unsigned char 类型
uchar readtemp(void)
{
uchar templ,temph,tt;
uint t;
init_ds18b20();
writebyte(0xCC);
writebyte(0x44); //跳过ROM匹配,跳过读序列号的操作,可节省操作时间
init_ds18b20(); //开始操作前需要复位
writebyte(0xCC);
writebyte(0xBE); //读暂存器中的温度值
templ=readbyte(); //分别读取温度的低、高字节
temph=readbyte();
t=temph;
t<<=8;
t=t|templ;
tt=t*0.0625; //温度转换
return(tt);
}//函数名:delayms(uint ms)
//函数功能:延时ms毫秒子函数
//形式参数:ms
//返回值:无
void delayms(uint ms)//延时ms毫秒子函数
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<110;j++);//延时1毫秒
}
}
|