DS18B20温度检测带液晶上位机采集.docx
- 文档编号:11423121
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:13
- 大小:28.65KB
DS18B20温度检测带液晶上位机采集.docx
《DS18B20温度检测带液晶上位机采集.docx》由会员分享,可在线阅读,更多相关《DS18B20温度检测带液晶上位机采集.docx(13页珍藏版)》请在冰豆网上搜索。
DS18B20温度检测带液晶上位机采集
DS18B20温度检测(带液晶、上位机采集)
/**********************************************************
DS18B20温度检测(带1602液晶显示,修正负温度显示,新增支持上位机温度采集)
**********************************************************/
#include
#include
unsignedcharcodedigit[10]={"0123456789"}; //定义字符数组显示数字
unsignedcharcodeStr[]={"TestbyDS18B20"}; //说明显示的是温度
unsignedcharcodeError[]={"Error!
Check!
"}; //说明没有检测到DS18B20
unsignedcharcodeTemp[]={"Temp:
"}; //说明显示的是温度
unsignedcharcodeCent[]={"Cent"}; //温度单位
unsignedcharfuhao;
/*****************************************************
函数功能:
向PC发送一个字节数据
***************************************************/
voidSend(unsignedchardat)
{
SBUF=dat;
while(TI==0)
;
TI=0;
}
//Send(tmp); //发送数据i
/*******************************************************************************
以下是对液晶模块的操作程序
*******************************************************************************/
sbitRS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2; //使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:
延时若干毫秒
入口参数:
n
***************************************************/
voiddelaynms(unsignedcharn)
{
unsignedchari;
for(i=0;i delay1ms(); } /***************************************************** 函数功能: 判断液晶模块的忙碌状态 返回值: result。 result=1,忙碌;result=0,不忙 ***************************************************/ bitBusyTest(void) { bitresult; RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给result E=0; //将E恢复低电平 returnresult; } /***************************************************** 函数功能: 将模式设置指令或显示地址写入液晶模块 入口参数: dictate ***************************************************/ voidWriteInstruction(unsignedchardictate) { while(BusyTest()==1); //如果忙就等待 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_(); //空操作两个机器周期,给硬件反应时间 P0=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 指定字符显示的实际地址 入口参数: x ***************************************************/ voidWriteAddress(unsignedcharx) { WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x" } /***************************************************** 函数功能: 将数据(字符的标准ASCII码)写入液晶模块 入口参数: y(为字符常量) ***************************************************/ voidWriteData(unsignedchary) { while(BusyTest()==1); RS=1; //RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" P0=y; //将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 对LCD的显示模式进行初始化设置 ***************************************************/ voidLcdInitiate(void) { delaynms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38); //显示模式设置: 16×2显示,5×7点阵,8位数据接口 delaynms(5); //延时5ms ,给硬件一点反应时间 WriteInstruction(0x38); delaynms(5); //延时5ms ,给硬件一点反应时间 WriteInstruction(0x38); //连续三次,确保初始化成功 delaynms(5); //延时5ms ,给硬件一点反应时间 WriteInstruction(0x0c); //显示模式设置: 显示开,无光标,光标不闪烁 delaynms(5); //延时5ms ,给硬件一点反应时间 WriteInstruction(0x06); //显示模式设置: 光标右移,字符不移 delaynms(5); //延时5ms ,给硬件一点反应时间 WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除 delaynms(5); //延时5ms ,给硬件一点反应时间 } /************************************************************************ 以下是DS18B20的操作程序 ************************************************************************/ sbitDQ=P3^3; unsignedchartime; //设置全局变量,专门用于严格延时 /***************************************************** 函数功能: 将DS18B20传感器初始化,读取应答信号 出口参数: flag ***************************************************/ bitInit_DS18B20(void) { bitflag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在 DQ=1; //先将数据线拉高 for(time=0;time<2;time++)//略微延时约6微秒 ; DQ=0; //再将数据线从高拉低,要求保持480~960us for(time=0;time<200;time++)//略微延时约600微秒 ; //以向DS18B20发出一持续480~960us的低电平复位脉冲 DQ=1; //释放数据线(将数据线拉高) for(time=0;time<10;time++) ;//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲) flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在) for(time=0;time<200;time++)//延时足够长时间,等待存在脉冲输出完毕 ; return(flag); //返回检测成功标志 } /***************************************************** 函数功能: 从DS18B20读取一个字节数据 出口参数: dat ***************************************************/ unsignedcharReadOneChar(void) { unsignedchari=0; unsignedchardat;//储存读出的一个字节数据 for(i=0;i<8;i++) { DQ=1; //先将数据线拉高 _nop_(); //等待一个机器周期 DQ=0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 dat>>=1; _nop_(); //等待一个机器周期 DQ=1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time++) ; //延时约6us,使主机在15us内采样 if(DQ==1) dat|=0x80;//如果读到的数据是1,则将1存入dat else dat|=0x00;//如果读到的数据是0,则将0存入dat //将单片机检测到的电平信号DQ存入r[i] for(time=0;time<8;time++) ; //延时3us,两个读时序之间必须有大于1us的恢复期 } return(dat); //返回读出的十进制数据 } /***************************************************** 函数功能: 向DS18B20写入一个字节数据 入口参数: dat ***************************************************/ WriteOneChar(unsignedchardat) { unsignedchari=0; for(i=0;i<8;i++) { DQ=1; //先将数据线拉高 _nop_(); //等待一个机器周期 DQ=0; //将数据线从高拉低时即启动写时序 DQ=dat&0x01; //利用与运算取出要写的某位二进制数据, //并将其送到数据线上等待DS18B20采样 for(time=0;time<10;time++) ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样 DQ=1; //释放数据线 for(time=0;time<1;time++) ;//延时3us,两个写时序间至少需要1us的恢复期 dat>>=1; //将dat中的各二进制位数据右移1位 } for(time=0;time<4;time++) ;//稍作延时,给硬件一点反应时间 } /****************************************************************************** 以下是与温度有关的显示设置 ******************************************************************************/ /***************************************************** 函数功能: 显示没有检测到DS18B20 ***************************************************/ voiddisplay_error(void) { unsignedchari; WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示 i=0; //从第一个字符开始显示 while(Error[i]! ='\0')//只要没有写到结束标志,就继续写 { WriteData(Error[i]); //将字符常量写入LCD i++; //指向下一个字符 delaynms(100); //延时100ms较长时间,以看清关于显示的说明 } while (1) //进入死循环,等待查明原因 ; } /***************************************************** 函数功能: 显示说明信息 ***************************************************/ voiddisplay_explain(void) { unsignedchari; WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示 i=0; //从第一个字符开始显示 while(Str[i]! ='\0')//只要没有写到结束标志,就继续写 { WriteData(Str[i]); //将字符常量写入LCD i++; //指向下一个字符 delaynms(100); //延时100ms较长时间,以看清关于显示的说明 } } /***************************************************** 函数功能: 显示温度符号 ***************************************************/ voiddisplay_symbol(void) { unsignedchari; WriteAddress(0x40); //写显示地址,将在第2行第1列开始显示 i=0; //从第一个字符开始显示 while(Temp[i]! ='\0')//只要没有写到结束标志,就继续写 { WriteData(Temp[i]); //将字符常量写入LCD i++; //指向下一个字符 delaynms(50); //延时1ms给硬件一点反应时间 } } /***************************************************** 函数功能: 显示温度的小数点 ***************************************************/ voiddisplay_dot(void) { WriteAddress(0x49); //写显示地址,将在第2行第10列开始显示 WriteData('.'); //将小数点的字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示温度的符号 ***************************************************/ void display_ice(unsignedcharfuhao) { unsignedcharshow; show=fuhao; WriteAddress(0x45); //写显示地址,将在第2行第10列开始显示 WriteData(show); //将小数点的字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示温度的单位(Cent) ***************************************************/ voiddisplay_cent(void) { unsignedchari; WriteAddress(0x4c); //写显示地址,将在第2行第13列开始显示 i=0; //从第一个字符开始显示 while(Cent[i]! ='\0') //只要没有写到结束标志,就继续写 { WriteData(Cent[i]); //将字符常量写入LCD i++; //指向下一个字符
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B20 温度 检测 液晶 上位 采集