📄 stc12c5a60s2-pdip40+ds18b20+lcd1602ʦ
字号:
/*--------------------------------------------*/
//File: DS18B20_A.H
//Note: DS18B20的驱动程序 12Bits数据
/*--------------------------------------------*/
#include "STC12C56.h"
#include <intrins.h>
#define BYTE unsigned char
#define WORD unsigned int
sbit DQ = P2^3; //数据接口定义
BYTE TempBuffer[6]; //温度数据字符
bit symbol = 0; //温度数据正负号 1-温度为负值,0-温度为正值
//bit delaytestflag=0; //延时断点测试标志
/*--------------------------------------------*/
//函数声明
bit Init_DS18B20(void); //DS18B20初始化函数,如果bit=0则初始化成功,bit=1则初始化失败
BYTE ReadOneByte(void); //从DS18B20中的RAM中读出一个字节
void WriteOneByte(BYTE dat); //向DS18B20中的RAM写入一个字节
BYTE ReadTempature(void); //从DS18B20中的RAM中读出DS18B20当前的温度
void Temp_To_String(void); //温度数据转化成液晶字符显示//函数返回值为TempBuffer
/*--------------------------------------------*/
//us级别延时函数
void DelayXus(BYTE x, BYTE y)
{
BYTE tempx,tempy=y;
do
{
tempx=x;
while(--tempx);
}while(--tempy);
}
/*--------------------------------------------*/
//ms级别延时函数
void DelayXms(BYTE x,BYTE y,BYTE z)
{
BYTE tempx,tempy,tempz=z;
do
{
tempy=y;
do
{
tempx=x;
while(--tempx);
}
while (--tempy);
}
while (--tempz);
}
/*--------------------------------------------*/
//DS18B20初始化函数
bit Init_DS18B20(void)
{
bit Status=0;
DQ=1; //DS18B20复位
_nop_(); //连续两个空操作指令等待引脚电平变高
_nop_();
DQ=0; //低电平复位
_nop_(); //连续两个空操作指令等待引脚电平变低
_nop_();
DelayXus(6,175); //508us
DQ=1; //释放总线
_nop_();
_nop_();
DelayXus(1,27); //31us //延时15us~60us 准备接收数据
Status=DQ; //如果Status=0则初始化成功,Status=1则初始化失败
DelayXus(2,90); //131us //60~240us低电平存在脉冲,以此向CPU表示复位成功
return (Status);
}
/*--------------------------------------------*/
//DS18B20读出一个字节
BYTE ReadOneByte(void)
{
BYTE i=0;
BYTE dat=0;
for(i=8;i>0;i--)//逐位读数据
{
DQ=0; //读出数据开始
_nop_();
_nop_();
dat>>=1; //由低到高位依次读出
DQ=1; //释放总线
_nop_();
_nop_();
if(DQ)
dat|=0x80; //15us内必须完成读数据
DelayXus(1,70); //77us //60us~120us释放总线
}
return (dat);
}
/*--------------------------------------------*/
//DS18B20写入一个字节
void WriteOneByte(BYTE dat)
{
BYTE i=0;
for(i=8;i>0;i--)
{
DQ=0; //写开始
_nop_();
_nop_();
DQ=dat&0x01; //由低到高依次写入
DelayXus(1,70); //70us //写入数据时间间隙为:至少60us,连续写2位间的间隙应大于1us
DQ=1; //释放总线
_nop_();
_nop_();
dat>>=1;
}
}
/*--------------------------------------------*/
//读出DS18B20当前的温度
BYTE ReadTempature(void)
{
BYTE TempL=0;
BYTE TempH=0;
BYTE Temp_Value;
Init_DS18B20(); //先复位,再写ROM,最后写RAM
WriteOneByte(0xcc); //跳过读出序列号的操作
WriteOneByte(0x44); //启动温度转换,默认的【12Bits】转化
DelayXms(150,171,80); //752ms //12Bits转换时间750ms
// while(!DQ);查询方式
Init_DS18B20(); //先复位,再写ROM,最后写RAM
WriteOneByte(0xcc); //跳过读出序列号的操作
WriteOneByte(0xbe); //读出温度寄存器
DelayXus(1,15); //18us
TempL=ReadOneByte(); //读出温度值低8位/低四位为小数位
TempH=ReadOneByte(); //读出温度值高8位/高四位和第四位为符号位
if((TempH>>4)==0x0f) //高五为为符号扩展位,仅取高4位:1111=负数 0000=正数
symbol = 1;
else
symbol = 0;
Temp_Value=TempH<<4 | TempL>>4;
return (Temp_Value);
}
/*--------------------------------------------*/
//温度数据转化成液晶字符显示
void Temp_To_String(void)
{
//symbol初值为0
//DS18B20测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C
BYTE Temp_Value= ReadTempature(); //关键:从DB18B20读取其当前温度
if(symbol==1)
{
Temp_Value = 256 - Temp_Value;//取反将结果左移8位
TempBuffer[0]=Temp_Value/100+0x2d;//'-'; //如果温度为负值,则百位充当符号位
TempBuffer[1]=Temp_Value/10%10+'0'; //十位
TempBuffer[2]=Temp_Value%10+'0'; //个位
TempBuffer[3]=0xdf; //温度符号
TempBuffer[4]=0x43; //'C';
TempBuffer[5]='\0'; //字符串结束标志符
if(TempBuffer[1]=='0')//0x30) //高位为0,不显示
{
TempBuffer[1]=0x20; //''编码为0x20
if(TempBuffer[2]=='0') //0x30) //次高位为0,不显示
TempBuffer[2]=0x20;
}
}
else
{
TempBuffer[0]=Temp_Value/100+0x20;//'0'; //如果温度为正值,则讲百位数据转换位对应ASCII码
TempBuffer[1]=Temp_Value/10%10+'0'; //十位
TempBuffer[2]=Temp_Value%10+'0'; //个位
TempBuffer[3]=0xdf; //温度符号
TempBuffer[4]=0x43;//'C';
TempBuffer[5]='\0'; //字符串结束标志符
if(TempBuffer[0]=='0')//0x30) //高位为0,不显示
{
TempBuffer[0]=0x20;//''编码为0x20
if(TempBuffer[1]=='0')//0x30) //次高位为0,不显示
TempBuffer[1]=0x20;
}
}
}
/*--------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -