📄 wenduji.txt
字号:
#include <stdio.h>
#include <reg51.h>
#include <intrins.h>
#define WENDU 40 //报警温度
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P3^4; //DS1820的数据位
uchar Status_Flag;
unsigned data Tbegin = WENDU; //设定报警温度初值
unsigned data Temp1 = 0;
unsigned char c = 0;
unsigned char d = 0;
unsigned a[4]; //温度数值存放
unsigned char code tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9,-,全灭 (共阳字段表)
uchar code ditab[16]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar code PX[]={0xff,0xfd,0xfb,0xf7};
void Delay(unsigned x,unsigned y); //延时程序
void ChangeTemp(); //温度数值的转换
void DisPlay(); //数码管显示程序
void Delay1(unsigned int i);
void Init_DS18B20(void);
unsigned ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void ReadTemperature(void);
/*------------------------------------主程序----------------------------------*/
void main()
{
TMOD = 0x01;
TH0 = 0xDC;
TL0 = 0xB0;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
ReadTemperature();
}
}
//双变量延时
void Delay(unsigned x,unsigned y)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<y;j++);
}
//温度数值的转换
void ChangeTemp()
{
if(d==15)
{
a[0] = 10;
}
else
{
a[0] = 11;
}
a[1] = Temp1 / 10;
a[2] = Temp1 % 10;
a[3] = ditab[c];
}
//显示函数
void DisPlay()
{
char k;
ChangeTemp();
for(k=0;k<4;k++)
{
if( k==2)
{
P1=(tab[a[k]] & 0x7f);
}
else
{
P1=tab[a[k]];
}
P2=PX[k];
Delay(5,23);
}
}
//显示定时器
void INT_T0() interrupt 1 using 0
{
TH0 = 0xDC;
TL0 = 0xB0;
// ReadTemperature();
DisPlay();
}
/*------------------------------温度传感器子程序--------------------------*/
void Delay1(unsigned int i)
{
while(i--);
}
//初始化函数
void Init_DS18B20(void)
{
unsigned char x = 0;
DQ = 1; //DQ复位
Delay1(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay1(80); //精确延时 大于 480us//80
DQ = 1; //拉高总线
Delay1(14);
x = DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
Delay1(20);
}
//读一个字节
unsigned ReadOneChar(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;
Delay1(4);
}
return(dat);
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i = 0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay1(5);
DQ = 1;
dat >>= 1;
}
Delay1(4);
}
//读取温度
void ReadTemperature(void)
{
unsigned char a = 0;
unsigned char b = 0;
Init_DS18B20();
WriteOneChar(0xcc); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xcc); //跳过读序号列号的操作
WriteOneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
c=(a&0x0f);d=b;
a = a >> 4; //低位右移4位,舍弃小数部分
b = b << 4; //高位左移4位,舍弃符号位
Temp1 = b | a;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -