基于单片机的温控报警器设计内容摘要:

部分设计用到了温度传感器 DS18B20,这种传感器是单数据总线传感器,一共有三只引脚,一个引脚接电源 VCC,一个引脚接地 GND,还有一个就是数据总线引脚 DQ 接到单片机的其中一只引脚。 设计图如下。 图 5 DS18B20 原理图 14 这个是 DS18B20 传感器的硬件设计。 1 脚接电源 VCC, 2 脚是数据总线的引脚用于接到单片机 ATmega16 的 PB3 引脚, 3 脚用于接地 GND。 还有在设计里面考虑到电源的不稳定,所以在接近插槽的电源 VCC 和 地 GND 之间加了一个 的电容用于滤波 ,稳定电源。 LCD1602 显示部分设计 这部分设计用到了带字符的液晶显示器 LCD1602,这种液晶显示器是16*2 显示规格的带字符显示器。 这里带字符显示 的 液晶显示器里面已经有一个解释芯片,当收到字符数据时,自动识别出字符, 不 需要在单片机作解释,但缺点就是这种带字符的显示器不能按照设计者的意思随心所欲地显示需要的图案。 不过今次设计液晶显示器的功能是用于显示实时温度和设定温度,并不需要特殊图案。 因此,带字符的 lcd1602 液晶显示器对于今次设计来说, 简单直观地 实 现效果。 所以 我选择用带字符的液晶显示器。 LCD1602 原理图如下: 图 6 LCD1602 原理图 15 设计按照 LCD1602 的接口信号来连接引脚。 1 脚是电源地 GND; 2 脚接电源正极 VCC; 3脚接液晶显示偏压信号,利用两个 1k 的电阻进行分压; 4脚到 6脚接单片机 ATmega16 的 PD5到 PD7,分别代表接到 LCD1602 的 RS、 RW、 EN的引脚;7脚到 14 脚接按顺序接到单片机 ATmega16 的 PB0到 PB7 引脚, 15 脚背光源正极接电源正极 VCC; 16 脚背光源负极接正源地 GND。 下表显示 LCD1602 的 4脚到 14脚和单片机引脚对应关系。 表 单片机与 LCD1602 引脚对应表 单片机 ATmega16 LCD1602 单片机 ATmega16 LCD1602 PD5 引脚 4( RS) PB3 引脚 10( Data3) PD6 引脚 5( RW) PB4 引脚 11( Data4) PD7 引脚 6( EN) PB5 引脚 12( Data5) PB0 引脚 7( Data0) PB6 引脚 13( Data6) PB1 引脚 8( Data1) PB7 引脚 14( Data7) PB2 引脚 9( Data2) ATmega16 原理图设计 这部分是整个单片机 ATmega16 的设计 总图。 包含了程序烧写下载端口, 3个按键,电源端口,预留串口通讯端、复位模块和声光报警模块。 图 7 设计部分原理图 16 程序烧写 这部分设计是用于将在电脑端的编写好的程序烧写到单片机 ATmega16,今次设计的下载用 ASP 下载方式。 如下图,采用的是 10PIN 插针。 1脚连接单片机的 MOSI 端; 2 脚空接; 3脚接单片机 RESET 端; 4脚接单片机 SCK 端; 5脚接单片机 MISO 端; 6脚到 9 脚均接电源地 GND; 10 脚接 VCC。 图 8 程序烧写 电源端口 这部分只需要外接一个 2PIN 的端子用于连接 5V 开关。 用一个 100u 和一个 的电容接电源和电源正极。 如下图: 图 9 电源端口接线原理图 串口通讯端的设计 此设计目的是为了能够使系统在硬件上得到扩展型设计,方便通过串口RS485 或者 RS232 上传数据。 图 10 串口设计图 17 如图显示有两个引脚,分别是数据发送和接收。 1脚 RXD连接到单片机 mega16港口 PD0,引脚 2连接到端口 TXD 单片机 mega16 PD1。 这里的 mega16 单片机 PD0口和 PD1 口是一种特殊的串行通信口, 这俩 端口可实现计算机与单片机之间的串口通信。 报警设计 采用的是声光报警的方式来提示实时温度已经达到设定的温度。 硬件上,利用一个有源蜂鸣器和一个 led 灯来进行声光报警。 当实时温度到了设定的温度,那么蜂鸣器响 led 灯亮。 如下图 11 是蜂鸣器部分, 1 脚接单片机的 PD4 端口, 2脚接电源地 ,这里用单片机高电平驱动蜂鸣器的方法。 如图 12 是 led 灯部分,连接电源正极和单片机的 PB4 端口,这里用单片机低电平驱动 led 的方法。 图 11 蜂鸣器 图 12 LED 灯 按键设计 本设计采用 4 个按钮,其中之一是用于重置。 其他三个按钮用来设置设定温度。 2 键是用来设置温度增加, 3 键来设定温度下降, 而 4 键是用于切换位数。 18 4 系统软件设计 开始 初始化芯片 声光报警 初始化 DS18B20 设定数值加 1 设定数值减 1 设定数值位数切换 键 4 是否按下 键 2 是否按下 键 3 是否按下 判断数值是否达到设定数值 初始化 LCD1602 19 5 温度 数据处理函数 初始化函数 程序代码如下: void init_18b20(void) { DQ_OUT。 //设置 PB3 为输出 DQ_SET。 //拉高 PB3 电平 delay_10us(1)。 //延时 DQ_CLR。 //拉低 PB3 电平 delay_10us(75)。 //延时 DQ_SET。 //再次拉高 PB3 电平 delay_10us(6)。 //延时 DQ_IN。 //设置 PB3为输入 while(DQ_R)。 //等待 DS18B20 返回来的高电平 while(!(DQ_R))。 //等待 DS18B20 初始化完毕 DS18B20 的子函数 程序代码如 下: uint read_18b20_temp(void) { uchar temp1,temp2。 int temp。 init_18b20()。 //复位 18b20 20 write_18b20_(0xcc)。 //忽略 rom 配置 write_18b20_(0x44)。 //发出转换命令 init_18b20()。 write_18b20_(0xcc)。 write_18b20_(0xbe)。 //发出读温度命令 temp1=read_18b20_byte()。 //读取到温度的前两个字节 temp2=read_18b20_byte()。 init_18b20()。 //复位 18b20 temp=(((temp28)|temp1)*)。 //设置输出形式为小数点后一位 return temp。 这是一个有返回值的函数。 由单片机发出信号,等待传感器返回温度数值,再将返回的数值进行处理。 这里首先要初始化传感器,等待初始化完毕,我们发送转换命令 0x44。 这里有个需要注意的是命令 0xcc,这是一个忽略单片机 rom配 置噶命令,原本 rom 配置命令是当有多个传感器的时候要用到选择传感器的ID,但设计中只有一个传感器,所以就不需要理会 rom配置了。 接着发出转换命令之后,再次初始化传感器,再发出读温度命令 0xbe。 接着就是将读回来两次数据分别装进两个全部变量里面。 接着是初始化传感器,说明一次的温度转换完成了。 传感器 DS18B20 写命令子函数 程序代码如下: void write_18b20_(uchar ) { uchar i。 for(i=0。 i8。 i++) //分别写 8次,这里一次写一位 { DQ_OUT。 //设置 PB3 为输出 21 DQ_CLR。 //拉低 PB3 电平 NOP()。 if(amp。 0x01) //当命令的最低位为 1 { DQ_SET。 //拉高 PB3电平 } else //当命令的最低位不为 1 { DQ_CLR。 //拉低电平 } delay_10us(5)。 //延时 DQ_SET。 //拉高电平 =1。 //命令右移一位 } delay_10us(5)。 //延时 这个是单片机向传感器写 命令的函数。 这里我们一开始就是一个循环语句,因为这里需要传送的命令都为 8 位,一次只能传送一位到传感器,所以需要分别传送 8次。 进入循环语句之后,我们将引脚设置为输出并拉低引脚电平。 之后就是进入一个判断语句,判断命令的最后一位是否为 1,当为 1拉高引脚电平,但不为 1拉低引脚电平。 接着就是延时 50us 等待传感器反应,再接着是拉高电平指示这次的传送完毕,后面跟着就是需要将命令右移一位。 这样直到整个命令完全传送到传感器中,再然后延时等待传感器反应。 DS18B20 读一个字节数据子函数 程序代码如下: uchar read_18b20_byte(void) { 22 uchar i,retd=0。 for(i=0。 i8。 i++) //分别读 8次,这里一次读一位 { retd=1。 //数据右移一位 DQ_OUT。 //设置 PB3 为输出 DQ_CLR。 //拉低电平 DQ_SET。 //拉高电平 NOP()。 NOP()。 NOP()。 NOP()。 //延时 DQ_IN。 //设置 PB3 为输入 if(DQ_R) //判断输入数据是否为 1 { retd|=0x80。 //数据变量的最高位为 1 } delay_10us(5)。 } return retd。 //返回数据变量 } 这个函数是用于读取传感器一个字节的数据,就是一个 8 位数据。 首先,定义一个 8位局部变量用于数值的返回。 这里有一个循环语句,同样是 8次,一次只能读一位的数据。 进入循环语句之后,首先要将变量右移一位,这里值得注意的是这个变量不需要给一个它初始值,因为无论初始值是什么并不影响数据的读出。 右移一位之后,设置引脚为输出并拉低电平,紧接就是拉高电平,延时等待传感器反应。 再之后是设置引脚为输入,读一位 数据,当这位数据是 1,我们便将变量的最高位设置为 1。 延时 50us 等待传感器,当循环语句结束,返回数据变量给相关的函数、语句使用。 23 显示函数 LCD1602 初始化子函数 程序代码如下: void lcd_init(void) { lcd_w_(0x38,0)。 //8 位数据传输, 2 行显示, 5*7 字形,不检测忙信号 delay_ms(5)。 //延时 5ms lcd_w_(0x38,0)。 delay_ms(5)。 lcd_w_(0x38,0)。 delay_ms(5)。 lcd_w_(0x38,1)。 //8 位数据传输, 2 行显示, 5*7 字形,检测忙信号 lcd_w_(0x08,1)。 //关闭显示,检测忙信号 lcd_w_(0x01,1)。 //清屏,检测忙信号 lcd_w_(0x06,1)。 //显示光标右移设置,检测忙信号 lcd_w_(0x0c,1)。 //显示屏打开,光标不显示,不闪烁,检测忙信号 delay_ms(5)。 display_str(0,0,realtime T:)。 //第一行要显示的初始内容 delay_ms(5)。 display_str(0,1,set T:)。 //第二行要显示的初始内容 24 delay_ms(5)。 } LCD1602 写数据子函数 程序代码如下: void lcd_w_data(uchar w_data) { lcd_busy()。 //检测 lcd 是否处于忙状态 lcd_rs_1。 //拉高 rs 电平 lcd_rw_0。 //拉低 rw 电平 _NOP()。 //空命令,用于延时 dataport=w_data。 //将要输入到 lcd1602 的数据放到 PC端口 _NOP()。 lcd_en_1。 //拉高 en 电平 _NOP()。 _NOP()。 lcd_en_0。 //拉低 en 电平 } 此功能的作用,微控制器,显示数据输入到 LCD1602。 检测 LCD1602 是在一个繁忙的状态,当 LCD1602 闲置无效的 RS 级别(对应引脚查找表 ),并拉低的 RW 级延时等待 LCD1602 反应。 lcd1602 的成在写入数据的状态,将准备写入的数据 分配给 PC 口,延迟等待写数据,然后连接到一个下降沿完整的 lcd1602。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。