📄 temp.c
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar dis[5]={0x10,0x10,0x10,0x10};
uchar c[4]={1, 2, 4, 8};
uchar seg7[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
uchar dot_seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
uint tm; //从DS18B20读出的数据
uchar isNeg;/*是否为负数标志位*/
sbit DQ=P3^7;/*DS18B20的DQ端*/
/* ********************延时t毫秒 ***************************/
void delay(uint t)
{
uchar m;
while(t--)
{
for (m=0;m<100;m++)
;
}
}
/******************************ds1820程序***************************************/
void delay_18B20(uint i)//延时1微秒
{
while(i--)
;
}
/********************* 产生复位脉冲初始化DS18B20 **************************/
void TxReset(void)
{
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(4);
}
/* ***********************等待应答脉冲 *********************/
void RxWait(void)
{
while(DQ)
;
while(~DQ)
; // 检测到应答脉冲
delay_18B20(1);
}
/* ****************读取数据的一个字节 *****************************/
uchar RdByte(void)
{
unsigned char i=0;
unsigned char dat = 0;
for(i = 8; i > 0; i--)
{
DQ = 0; //给脉冲信号
dat >>= 1;
DQ = 1; //给脉冲信号
if(DQ)
dat |= 0x80;
delay_18B20(10);
}
return(dat);
}
/* ****************写数据的一个字节,满足写1和写0的时隙要求 *************/
void WrByte(uchar wdata)
{
unsigned char i=0;
for(i = 8; i > 0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
delay_18B20(10);
}
}
/* **************启动温度转换 *******************/
void convert(void)
{
TxReset(); // 产生复位脉冲,初始化DS18B20
RxWait(); // 等待DS18B20给出应答脉冲
WrByte(0xcc); // skip rom 命令
WrByte(0x44); // convert T 命令
}
/**************** 读取温度值 *********************/
void RdTemp(void)
{
uchar tpmsb, tplsb;
convert();
TxReset(); // 产生复位脉冲,初始化DS18B20
RxWait(); // 等待DS18B20给出应答脉冲
WrByte(0xcc); // skip rom 命令
WrByte(0xbe); // read scratchpad 命令
tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
tm = tpmsb;
tm <<= 8;
tm = tm | tplsb;
if(tm & 0x0fff)
isNeg = 0;
else
{
tm = ~tm + 1;
isNeg = 1;
}
}
//*************************8数据处理程序************************//
void dataProc(void)
{
uchar temp1,temp2;
uint tt;
uint tmp;
if(tm < 0)
tm = 0 - tm;
temp2 = tm & 0x0f;
temp1 = (tm >> 4) & 0xff;
tmp = temp1 / 10 % 10;
if(tmp >= 5 && tmp != 16)
P1 = 0x08;
else
P1 = 0x40;
if(tmp == 0)
dis[0] = seg7[16];
else
dis[0] = seg7[tmp];
if(isNeg)
dis[0] = 0xbf;
tmp = temp1 % 10;
dis[1] = dot_seg[tmp];
tt = tm & 0x0f;
if(isNeg == 0)
tt = 625*tt;
else
{
tt = 0 - tt;
tt = tt & 0x0f;
tt = tt * 625;
}
tmp = tt / 1000;
dis[2] = seg7[tmp];
tmp = tt / 100 % 10;
dis[3] = seg7[tmp];
}
//**************显示程序**************** 使用了时钟中断//
void display(void) interrupt 1
{
static uchar i;
TH0 = 0xD8;
TL0 = 0xF0;
P2 = c[i];
P0 = dis[i];
i = (i + 1) % 4;
}
void initINT(void)
{
TMOD = 0x01;
TH0 = 0xF0;
TL0 = 0x5F;
ET0 = 1;
EX0 = 1;
TR0 = 1;
EA = 1;
}
/* 主程序,读取的温度值最终存放在tplsb和tpmsb变量中。
tplsb其中低4位为二进制的“小数”部分;tpmsb其中高
5位为符号位。真正通过数码管输出时,需要进行到十进
制有符号实数(包括小数部分)的转换。*/
void main(void)
{
initINT();
P0=0xff;
P1 = 0;
while(1)
{
RdTemp(); // 读取温度
dataProc();
delay(250);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -