|
发表于 2021-12-29 20:09:41
|
显示全部楼层
#include <reg52.h> //
#include <intrins.h>
#define uint unsigned int //宏定义
#define uchar unsigned char
//数码管段码
uchar code seg[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
uchar smg_wei[] = {0xe3, 0xe7, 0xeb, 0xef, 0xf3, 0xf7, 0xfb, 0xff};
uchar DisplayData[8]={0};
sbit DQ = P3^7;
//延时函数
void delay_ms(uint n)
{
uint i,j;
for(i = n; i > 0; i--)
{
for(j = 0; j < 114; j++);
}
}
//延时10*n微秒
void delay_10um(uint n)
{
while(n--);
}
uchar DS18B20Init()
{
uchar flag_DQ;
DQ = 0; //将总线拉低 480us~960us
delay_10um(50); //延时 500us
DQ = 1; //然后释放总线,
//如果DS18B20做出反应会将在15us~60us后总线拉低
delay_10um(6); //延时60us
flag_DQ = DQ;
while(!DQ);
//delay_10um(50); //延时 500us
return flag_DQ;
}
//先写低位再读高位
void DS18B20WriteByte(uchar dat)
{
uchar j;
for(j=0;j<8;j++)
{
DQ = 0;
//_nop _: 51单片机中封装好的函数,用于延时,大约1us,需包含#includc“intrins.h”
_nop_();//延时1微秒
_nop_();//延时1微秒
DQ = dat & 0x01;
delay_10um(6);//延时 60us
DQ = 1;
dat = dat >> 1;//右移一位
}
}
//先读低位再读高位
uchar DS18B20ReadByte()
{
uchar i,byte=0;
for(i=0;i<8;i++)
{
DQ = 0;
_nop_();
_nop_();
byte = byte >> 1;
DQ = 1;
_nop_();
_nop_();
//byte = byte >> 1;
if(DQ)
{
byte |= 0x80;
}
delay_10um(5);//延时 50us
}
return byte;
}
//读取温度
uint DS18B20ReadTemp()
{
uint temp = 0;
uchar tmh,tml;
//1.初始化DS18B20
DS18B20Init();
//2.执行ROM指令
DS18B20WriteByte(0xcc); //跳过ROM
//3.执行RAM指令——启动温度测量
DS18B20WriteByte(0x44); //启动温度转换(测量)
delay_10um(75);//延时 750ms
//4.初始化DS18B20
DS18B20Init();
//5.执行ROM指令
DS18B20WriteByte(0xcc); //跳过ROM
//6.执行RAM指令——读取温度数据
DS18B20WriteByte(0xbe); //读取暂存器中的温度数据
tml = DS18B20ReadByte();//读取byte0低位温度值
tmh = DS18B20ReadByte();//读取byte1高位温度值
//7.将低温温度和高位温度组合
temp = tmh;
temp <<= 8;
temp |= tml;
//8.温度转换
temp = temp *0.0625 + 0.5;
return temp;
}
void main()
{
uchar i,temp;
while(1)
{
temp = DS18B20ReadTemp();
DisplayData[0] = seg[temp % 10];
DisplayData[1] = seg[temp / 10];
for(i = 0; i < 8; i++)
{
P2 = smg_wei[i]; /n码
P0 = DisplayData[i]; //取段码
delay_ms(1);
P0 = 0x00;
}
}
} |
|