内容正文:
任务5 监测模块设计与制作
单片机技术与应用
项目二 智能车间生产线计数系统设计与制作
任务5 监测模块设计与制作
三诺生物传感有限公司
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
【基础任务要求】利用DS18B20温度传感器检测温度,并用LCD1602液晶屏显示温度。
任务5 监测模块设计与制作
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
任务实现四步骤
绘制控制电路图
搭接硬件电路
硬件设计
调试控制电路
调试控制程序
软硬件调试
仿真运行
实物运行
功能实现
绘制流程图
编程实现功能:DS18B20、LCD1602编程
方法
软件设计
01
02
03
04
重点、难点
难点
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
STC89C52
单片机
时钟电路
复位电路
电源电路
系统框图
任务5 监测模块设计与制作
温度传感器电路
显示电路
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
任务名:监测模块设计与制作
元件名称 图片 型号 数量 Proteus中的名称
单片机芯片 AT89C51 1 用AT89C51代替STC89C52
晶振 12MHZ 1 CRYSTAL
电容 22pF 2 CAP
电解电容 22μf/16V 1 CAP-ELEC
电阻 500Ω 1 RES
按钮 1 BUTTON
温度传感器 1 DS18B20
液晶屏 LCD1602 1 LM016L
元器件选型
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
LCD1602液晶模块
单片机如何与LCD1602液晶屏连接?
单片机如何与DS18B20连接?
硬件设计
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
硬件电路图
任务4 监测模块设计与制作
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
软件设计
2
如何用LCD1602液晶屏显示温度?
重点、难点
1
如何用DS18B20检测温度?
重点、难点
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
知识链接
初始化
跳过ROM
(0xCC)
启动转换
(0x44)
延时等待
初始化
跳过ROM
(0xCC)
读取温度(0xBE)
接收
温度
一、DS18B20工作方式
如果只有一个DS18B20测温,只要用跳过ROM(0xCC),就可进行如下温度转换(0x44)和读取操作(0xBE)了。
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P3^1; //DS18B20接入口
void delay(uint);
/*延时子函数*/
void delay(uint i)
{
while(i--) ;
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
//DS18b20温度传感器所需函数,分为初始化,读、写字节,读取温度4个函数
void Init_DS18B20(void) //传感器初始化
{
uchar x=0;
DQ = 1; //DQ拉高
_nop_ ();
DQ = 0; //单片机将DQ拉低
delay(70); //延时大于 480us
DQ = 1; //拉高总线
delay(15);//延时15-60us
x=DQ; //稍做延时后 如果DS18B20的DQ引脚返回低电平,x=0则初始化成功,否则x=1则初始化失败
delay(35); //若CPU读到了数据线上的低 电平0后,还要做延时,其延时时间从发出的高 电平算起最少要480us
}
DS18B20初始化步骤如下:
(1)将总线拉低,持续时间为480us到960us之间;
(2)将总线拉高;
(3)等待DS18B20的应答,若初始化成功,会在15-60us之后产生个低电平信号,该信号会持续60us到240us;
(4)之后DS18B20会主动释放总线,总线电平会被拉高。
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
读时序分为读“0”时序和读“1”时序两个过程。
当要读取DS18B20的数据时,我们需要将总线拉低,并保持1us的时间,然后将总线拉高,此时需尽快读取。从拉低到读取引脚状态的时间不能超过15us。
读时序:
uchar Read_OneChar(void) //读一个字节
{
uchar i;
uchar temp = 0;
for (i=0;i<8;i++) //先读低位再读高位
{
DQ=1;
_nop_ ();
DQ = 0; // 给脉冲信号
_nop_ ();
_nop_ ();
DQ = 1;
_nop_ ();
temp>>=1; // 给脉冲信号
if(DQ)
temp|=0x80;
delay(5);
}
return(temp);
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
写时序分为写“0”时序和写“1”时序两个过程。
DS18B20写“0”时序和写“1”时序的要求不同、当要写“0”时,单总线要被拉低至少60us,以保证DS18B20能够在15us到45us之间正确地采样I/O总线上的“0”电平;
当要写“1”时,单总线被拉低之后,在15us之内就得释放单总线。
写时序:
void Write_OneChar(uchar dat) //写一个字节
{
uchar i;
for (i=0; i<8; i++)
{
DQ = 0; //拉低总线
_nop_ (); //至少延迟1us
DQ=dat&0x01; //按从低位到高位的顺
序发送数据(一次只发送一位)
delay(6);
DQ=1;
dat>>=1; //每次发送一位,需要数据移位,先传送最低位,将高位移到低位
}
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
int ReadTemperature(void) //读取温度
{
uchar TemperatureL=0;
uchar TemperatureH=0;
int t=0;
float tt=0;
Init_DS18B20(); //DS18B20初始化
Write_OneChar(0xCC); // 跳过读序号列号的操作
Write_OneChar(0x44); // 启动温度转换
delay(80); //延时等待DS18B20温度转换
Init_DS18B20();
Write_OneChar(0xCC); //跳过读序号列号的操作
Write_OneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
TemperatureL=Read_OneChar(); //低位
TemperatureH=Read_OneChar(); //高位
t=(TemperatureH*256+TemperatureL); //两字节合成一个整型变量
tt=t*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625度
t=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字
//同时进行四舍五入操作
return(t);
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
void LcdDisplay(int temp) //lcd显示
{
unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
float tp;
if(temp< 0) //当温度值为负数
{
LcdWriteCmd(0x80); //写地址 80表示初始地址
LcdWriteDat('-'); //显示负
//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算加上0.5,还是在小数点后面。
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
else
{
LcdWriteCmd(0x80); //写地址 80表示初始地址
LcdWriteDat('+'); //显示正
tp=temp; //因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算加上0.5,还是在小数点后面。
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
LcdWriteCmd(0x82); //写地址 80表示初始地址
LcdWriteDat('0'+datas[0]); //百位
LcdWriteCmd(0x83); //写地址 80表示初始地址
LcdWriteDat('0'+datas[1]); //十位
LcdWriteCmd(0x84); //写地址 80表示初始地址
LcdWriteDat('0'+datas[2]); //个位
LcdWriteCmd(0x85); //写地址 80表示初始地址
LcdWriteDat('.'); //显示 ‘.’
LcdWriteCmd(0x86); //写地址 80表示初始地址
LcdWriteDat('0'+datas[3]); //显示小数点
LcdWriteCmd(0x87); //写地址 80表示初始地址
LcdWriteDat('0'+datas[4]); //显示小数点
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
void main()
{
InitLcd1602(); //初始化LCD1602
LcdWriteCmd(0x88); //写地址 80表示初始地址
LcdWriteDat('C');
while(1)
{
LcdDisplay(ReadTemperature());
}
}
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
进阶任务:LCD1602液晶屏显示温湿度
【任务要求】使用DHT11温湿度传感器检测温湿度,并且用LCD1602显示温度和湿度。
虚拟仿真
方案设计
任务拓展
实物联调
总结评价
任务引入
每天学习一点点,变成更好的自己
单片机技术与应用
$$