📄 tempreature.c
字号:
#include <ht46c24.h>
//8M晶振,一条指令周期是0.5us
#define uchar unsigned char //0~255
#define temp_data _12_4 //DS18B20 端口
#define temp_data_ctrl _13_4 //DS18B20控制端口
uchar Read_Temperature(void); //读温度的函数
uchar Init_DS18B20(void); //初始化DS18B20
uchar Read_OneChar(void); //读一个字节的数据
void Write_OneChar(uchar write_data); //写一个字节的数据
uchar temperature;
uchar str[2];
void main()
{
long k;
temperature = 0;
_pbc = 0; //output mode
_pcc = 0; //output mode
_pb0 = 1;
_pb1 = 1;
_pc &= 0xf0;
while(1)
{
temperature = Read_Temperature();
str[0] = temperature % 10; //个位
str[1] = temperature / 10; //十位
_pc &= 0xf0; //清除低位
_pc |= str[0];
_pb0 = 0; //选中个位LED管
_delay(10);
_pb0 = 1;
_pc &= 0xf0; //清除低位
_pc |= str[1];
_pb1 = 0; //选中十位LED管
_delay(10);
_pb1 = 1;
_delay(2000);
}
}
//18b20初始化函数
uchar Init_DS18B20(void)
{
unsigned char temp_flag = 0;
temp_data_ctrl = 0; //output mode
temp_data = 1; //准备复位
_delay(80); //稍做延时
temp_data = 0; //单片机将总线拉低,产生复位信号
_delay(1000); //精确延时 大于 480us
temp_data = 1; //拉高总线
_delay(80);
temp_data_ctrl = 1; //input mode
temp_flag = temp_data; //稍做延时后 如果temp_flag = 0则初始化成功 temp_flag = 1则初始化失败
_delay(500); //注意:ds18b20应答脉冲要持续60——240us
if (temp_flag)
{
return 1; //初始化失败
}
else
{
return 0; //初始化成功
}
}
//读一个字节
uchar Read_OneChar(void)
{
uchar j;
uchar i = 0;
uchar read_data = 0;
for (i = 8; i > 0; i --)
{
read_data >>= 1;
temp_data_ctrl = 0; //output mode
temp_data = 0; // 给脉冲信号
_delay(2);
temp_data = 1; // 给脉冲信号
_delay(8);
temp_data_ctrl = 1; //input mode
if(temp_data)
read_data |= 0x80;
else
read_data &= 0x7f;
_delay(90);
temp_data_ctrl = 0;
temp_data = 1;
}
return(read_data);
}
//写一个字节
void Write_OneChar(uchar write_data)
{
uchar i = 0;
for (i = 8; i > 0; i --)
{
temp_data_ctrl = 0; //output mode
temp_data = 0; //给个脉冲
_delay(30);
temp_data = write_data & 0x01;
_delay(90);
temp_data = 1;
write_data >>= 1;
_delay(2);
}
}
//读取温度
uchar Read_Temperature(void)
{
long j;
long m;
uchar temp_l = 0;
uchar temp_h = 0;
uchar temp = 0;
uchar ds18b20_exist = 0;
uchar ds18b20_exist1 = 0;
ds18b20_exist = Init_DS18B20();
if(!ds18b20_exist)
{
Write_OneChar(0xCC); // 跳过读序号列号的操作
Write_OneChar(0x44); // 启动温度转换
for (j = 800; j >= 0; j --)
{
_delay(2000);
}
ds18b20_exist1 = Init_DS18B20();
Write_OneChar(0xCC); //跳过读序号列号的操作
Write_OneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
temp_l = Read_OneChar();
temp_h = Read_OneChar();
temp_h <<= 4;
temp_h += ((temp_l & 0xf0) >> 4);
temp = temp_h;
return(temp);
}
else
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -