标题:
msp430开发板温度传感器DS18B20控制程序,显示环境温度
[打印本页]
作者:
weizhong993
时间:
2018-1-17 18:21
标题:
msp430开发板温度传感器DS18B20控制程序,显示环境温度
/********************************************************************
//DM430-L型开发板温度传感器DS18B20控制程序,显示环境温度,未校准
//将温度的个位显示在LED8上,触摸传感器LED灯会变化,测试参考用
//DS18b20的C语言驱动程序,读取当前环境温度,显示精度达0.1度,温度范围0-99度
//DS18B20 详细引脚功能描述1、GND 地信号;2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下
//也可以向器件提供电源;3、VDD可选择的VDD 引脚。当工作于寄生电源时,此引脚必须接地。
//DS18B20 的使用方法。DS18B20 采用的是1-Wire 总线协议方式
//即在一根数据线实现数据的双向传输,数据脚接在P17上
********************************************************************/
#include <msp430x14x.h>
#include "Config.h"
uint temp_value;
uint temp,A1,A2,A3; //定义的变量,显示数据处理
//*************************************************************************
// 初始化IO口子程序
//*************************************************************************
void Port_Init()
{
LED8DIR = 0xFF; //设置IO口方向为输出
LED8 = 0xFF; //P2口初始设置为FF
}
//*************************************************************************
// DS18B20初始化
//*************************************************************************
unsigned char DS18B20_Reset(void) //初始化和复位
{
unsigned char i;
DQ_OUT;
DQ_CLR;
delay_us(500); //延时500uS(480-960)
DQ_SET;
DQ_IN;
delay_us(80); //延时80uS
i = DQ_R;
delay_us(500); //延时500uS(保持>480uS)
if (i)
{
return 0x00;
}
else
{
return 0x01;
}
}
//*************************************************************************
// DS18B20读一个字节函数
//*************************************************************************
unsigned char ds1820_read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i = 8; i != 0; i--)
{
value >>= 1;
DQ_OUT;
DQ_CLR;
delay_us(4); //*延时4uS
DQ_SET;
DQ_IN ;
delay_us(10); //*延时10uS
if (DQ_R)
{
value|=0x80;
}
delay_us(60); //*延时60uS
}
return(value);
}
//*************************************************************************
// 向18B20写一个字节函数
//*************************************************************************
/*DS18B20字节写入函数*/
void ds1820_write_byte(unsigned char value)
{
unsigned char i;
for (i = 8; i != 0; i--)
{
DQ_OUT;
DQ_CLR;
delay_us(4); //延时4uS
if (value & 0x01)
{
DQ_SET;
}
delay_us(80); //延时80uS
DQ_SET; //位结束
value >>= 1;
}
}
//*************************************************************************
// 发送温度转换命令
//*************************************************************************
/*启动ds1820转换*/
void ds1820_start(void)
{
DS18B20_Reset();
ds1820_write_byte(0xCC); //勿略地址
ds1820_write_byte(0x44); //启动转换
}
//*************************************************************************
// DS8B20读取温度信息
//*************************************************************************
unsigned int ds1820_read_temp(void)
{
unsigned int i;
unsigned char buf[9];
DS18B20_Reset();
ds1820_write_byte(0xCC); //勿略地址
ds1820_write_byte(0xBE); //读取温度
for (i = 0; i < 9; i++)
{
buf[i] = ds1820_read_byte();
}
i = buf[1];
i <<= 8;
i |= buf[0];
temp_value=i;
temp_value=(uint)(temp_value*0.625); //不是乘以0.0625的原因是为了把小数点后一位数据也转化为可以显示的数据
//比如温度本身为27.5度,为了在后续的数据处理程序中得到BCD码,我们先放大到275
//然后在显示的时候确定小数点的位置即可,就能显示出27.5度了
return i;
}
//*************************************************************************
// 温度数据处理函数
//*************************************************************************
void data_do(uint temp_d)
{
uint A2t;
A1=temp_d/100; //分出百,十,和个位
A2t=temp_d%100;
A2=A2t/10;
A3=A2t%10;
}
//***********************************************************************
// 主程序
//***********************************************************************
void main(void)
{
uchar j;
WDT_Init(); //看门狗初始化
Clock_Init(); //时钟初始化
Port_Init(); //端口初始化,用于控制IO口输入或输出
DS18B20_Reset(); //复位D18B20
while(1)
{
ds1820_start(); //启动一次转换
ds1820_read_temp(); //读取温度数值
data_do(temp_value); //处理数据,得到要显示的值
for(j=0;j<200;j++)
{
//Display_DS18B20(A1,A2,A3); //显示温度值,用户外扩显示器件后可用
LED8 = A2; //将温度的个位显示在LED8上,触摸传感器LED灯会变化
}
}
}
复制代码
作者:
zyluglugl
时间:
2021-11-14 10:23
有没有低功耗的例子
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1