📄 1.c
字号:
/******************************************************************************
东北大学104实验室
利用DS18B20实现温度计功能
目标器件:DS18B20
晶振:11.0592MHz
编译环境:Keil 7.60 A
******************************************************************************/
/********************************包含头文件***********************************/
#include <reg51.h>
#include <INTRINS.H>
/*******************************宏定义****************************************/
#define uchar unsigned char
#define uint unsigned int
/*******************************端口定义**************************************/
sbit DQ = P1^0; //传感器的数据线
sbit disp_clk=P1^7; //输出系统时钟
sbit disp_num=P1^5; //输出led显示数
/*******************************7段共阳LED码表******************************/
uchar code tab[11][8]={
{0,0,0,0,0,0,1,0}, //0
{1,1,0,0,1,1,1,0}, //1
{0,0,1,0,0,1,0,0}, //2
{1,0,0,0,0,1,0,0}, //3
{1,1,0,0,1,0,0,0}, //4
{1,0,0,1,0,0,0,0}, //5
{0,0,0,1,0,0,0,0}, //6
{1,1,0,0,0,1,1,0}, //7
{0,0,0,0,0,0,0,0}, //8
{1,0,0,0,0,0,0,0}, //9
{1,1,1,1,1,1,1,1}
};
/*****************************定义全局变量************************************/
uchar temperature,temperature_decimal; //保存正的温度 即 0--127 度,
//temperature为//18B20采集温度的整数部分,
//temperature_decimal为小数部分
/******************************************************************************
函数功能:LED显示子程序
入口参数:n
出口参数:
******************************************************************************/
void fun(uint n) //led 显示函数
{
uint i;
for(i=0;i<8;i++)
{
disp_clk=!disp_clk; //led八位初始清屏
disp_clk=!disp_clk;
disp_num=tab[n][i]; //发送led的一个控制码段
}
}
/******************************************************************************
函数功能:延时子程序
入口参数:x
出口参数:
******************************************************************************/
void delay(uint x) //延时函数,进入该函数一次需要13us,x每减1,延时11us
{
for(;x>0;x--);
}
/******************************************************************************
函数功能:18B20复位函数
入口参数:
出口参数:
******************************************************************************/
bit reset_18b20()
{
bit temp;
DQ = 1;
_nop_();
DQ = 0;
delay(45); // 480 us
DQ = 1;
_nop_();
_nop_();
_nop_();
delay(2); //35 us
temp = DQ;
delay(20); //233 us
return temp; //返回18B20重启完成标志位
}
/******************************************************************************
函数功能:18B20写函数
入口参数:command
出口参数:
******************************************************************************/
void write_18b20(uchar command)//向18B20通过单总线写数据
{
uchar i;
CY = 0;
for(i = 8; i > 0; i --)
{
DQ = 0;
delay(0); //13 us
command >>= 1; //低位在前
DQ = CY;
delay(3); //46us
DQ = 1;
_nop_();
}
DQ = 1;
_nop_();
}
/******************************************************************************
函数功能:18B20读函数
入口参数:
出口参数:value
******************************************************************************/
uchar read_18b20()//通过单总线读18B20的ROM数据
{
uchar i;
uchar value = 0;
for (i = 0; i < 8; i ++)
{
DQ = 1;
_nop_();
_nop_();
DQ = 0;
_nop_();
_nop_();
_nop_();
DQ = 1;
value=value>>1;
if (DQ==1)
{
value=value+0x80; //先读取低位
}
delay(3);
}
return value;
}
/******************************************************************************
函数功能:获取18B20的温度数据子程序
入口参数:
出口参数:
******************************************************************************/
void getTemperature() //获取18B20的温度数据
{
uchar temperature_low; //存储温度值的低八位数据
uchar temperature_high; //存储温度值的高八位数据
DQ = 1;
while(reset_18b20()); //等待18B20完成复位,完成复位后才能进行数据的传输
write_18b20(0xcc); //跳过ROM匹配
write_18b20(0x44); //发出温度转换命令
delay(48000); //最大转换时间 750 ms
delay(48000); //528,043 us
while(reset_18b20()); //等待18B20完成复位,准备读温度前先复位
write_18b20(0xcc); //跳过ROM匹配
write_18b20(0xbe); //发出读温度命令
//将读出的温度数据保存到 temperature_high/temperature_low
temperature_low = read_18b20(); //读取温度值
temperature_high = read_18b20();
temperature = 0;
temperature_decimal = temperature_low & 0x0f; //提取温度值的小数部分
temperature += (temperature_low >> 4); //低字节右移四位获取温度值的正数部分的低四位数据
temperature += (temperature_high << 4); //高字节左移四位与低字节数据相加获得十二位的温度值整数部分温度值
}
/******************************************************************************
函数功能:主程序
入口参数:
出口参数:
******************************************************************************/
void main() //主函数
{
uint temp[3]; //存储温度值的十位,个位,小数数值
int i;
while(1)
{
getTemperature(); //读取18B20温度值
for(i=0;i<3;i++)
fun(10);
temp[0]=(temperature%100)/10; //温度值的十位值
temp[1]=temperature%10; //个位值
temp[2]=temperature_decimal*625/1000;//小数部分的十位之一位
for(i=0;i<3;i++)
fun(temp[i]); //循环输出温度值的十位,个位,小数位 }
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -