单片机课程设计论文-基于51的温度报警器内容摘要:

点,只要将电压家在阳极和阴极之间相应的笔画就会发光。 8 个发光二极管的阳极并联在一起, 8 个阴极分开,因此成为共阳八段数码管。 课程设计说明书 9 其如图 7: A B C D E F G DP1 2 3 4 5 6 7 8 图 7晶体管显示电路 报警电路 由两个发光二极管组成和一个喇叭组成,分别是高温报警和低温报警,当高温超过 110 或低温低于 50 时,对应的二极管闪烁,同时喇叭发出警报。 如图 8 和图 9: D1高温报警D2低温报警R32 2 0R42 2 0 图 8二极管报警电路 L S 1S O UN D E R 图 9喇叭报警电路 课程设计说明书 10 4 程序设计 程序流程图 程序流程图如图 10 所示: 图 10 程序流程图 N 跳过读序列号的操作 Y N Y 读温度命令 将温度高、低位读出 处理数据到百、十、个、小数位,并在数码管上显示 超出限制。 喇叭响和二级管闪烁 初始化 DS18B20 开始 初始化 DS18B20 应答脉冲。 跳过读序列号的操作 发出温度转换的命令 等待温度转换完成 课程设计说明书 11 初始化子程序 使用 DS18B20 时,单片机先向 DS18B20 送出复位信号,单片机将数据拉低并保持 480~960μs;再释放数据 线,由上拉电阻拉高 15~60μs;然后再由 DS18B20 发出低电平 60~240μs,就完成了复位操作。 通过 init_ds18b20()函数来实现 18B20 的初始化 char init_ds18b20() { uchar status。 dq = 1。 delay(8)。 //高电平 dq = 0。 delay(90)。 dq = 1。 delay(8)。 //高电平 status = dq。 delay(100)。 dq = 1。 高电平 return status。 } 读子程序 读数据之前,单片机先将数据 线拉低,再释放。 DS18B20 在数据线从高电平跳低后 15μ s 内将数据送到数据线上。 单片机在 15μ s 后读数据线。 通过 read_temperature()函数读取温度值到 DS18B20 void read_temperature() { if( init_ds18b20() ==1) ds18b20_is_ok = 0。 //DS18B20故障 else { writeonebyte(0xcc)。 //跳过序列号 writeonebyte(0x44)。 //启动温度转 换 init_ds18b20()。 //DS18B20初始化 writeonebyte(0xcc)。 //跳过序列号 writeonebyte(0xbe)。 //读取温度寄存器 temp_value[0] = readonebyte()。 //温度低 8位 temp_value[1] = readonebyte()。 //温度高 8位 课程设计说明书 12 alarm_temp_hl[0] = readonebyte()。 //报警温度 DH alarm_temp_hl[1] = readonebyte()。 //报警温度 DL ds18b20_is_ok = 1。 //DS18B20正常工作 } } 写子程序 在单片机对 DS18B20 写数据时,应先将数据线拉低 1μ s 以上,再写入数据 (写1 为高,写 0 为低 )。 待单片机写入的数据变化 15~60μ s 后, DS18B20 将对数据线采样。 单片机写入数据到 DS18B20 的保持时间为 60~120μ s。 通过 writeonebyte()函数写入 8 位字节。 void writeonebyte(uchar dat) { uchar i。 for(i = 0。 i 8。 i++) {dq = 0。 dq = dat amp。 0x01。 delay(5)。 dq = 1。 dat =1。 } } 通过 set_alarm_temp_value()函数中的实现数据的读入 void set_alarm_temp_value() { init_ds18b20()。 初始化 DS18B20 writeonebyte(0xcc)。 //跳过序列号 writeonebyte(0x4e)。 //将设定的温度报警值写入 DS18B20 writeonebyte(alarm_temp_hl[0])。 //写入 TH writeonebyte(alarm_temp_hl[1])。 //写入 TL writeonebyte(0x7f)。 //12位精度 init_ds18b20()。 //初始化 DS18B20 writeonebyte(0xcc)。 //跳过序列号 writeonebyte(0x48)。 //温度报警值存入 DS18B20 } 数据处理子程序 课程设计说明书 13 先判断温度高 8 位,如果 CY 为 1,则将高、低 8 八位求 补;对高、低 8 位的数据按权整合称一个整数,判断是否在 50~110℃之间,超出范围则置报警灯为亮;将该数按百、十、个位分别存入相应的存储单元。 流程图如图 11 所示: 图 11 数据处理流程图 通过子函数 display_temperature()中的 uchar ng = 0 , np = 0。 char signed_current_temp。 if ( ( temp_value[1] amp。 0xf8) == 0xf8 )//如果是负数则取反加 1 {temp_value[1] = ~temp_value[1]。 temp_value[0] =~temp_value[0] + 1。 if ( temp_value[0] == 0x00 ) temp_value[1]++。 正数显示温度值加 1 ng = 1。 np = 0xfd。 //默认负号显示在左边第 2排 } display_digit[0] = df_table[temp_value[0] amp。 0x0f ]。 //查表得到温度小数部分 currentt = ((temp_value[0] amp。 0xf0)4) | ((temp_value[1] amp。 0x07)4)。 //获取温度整数部分 signed_current_temp = ng? currentt :currentt。 //有符号数当前温度值 Y Y N 符号为正。 求补码 N 高、低 8 位整合成为一个整数存入 A中 50~110 之间。 报警 分别存入百、十、个、小数位 取温度值 课程设计说明书 14 hi_alarm = signed_current_temp = alarm_temp_hl[0] ? 1 : 0。 //高温报警设置 lo_alarm = signed_current_temp = alarm_temp_hl[1] ? 1: 0。 //低温报警设置 // 将整数部分 分解为三位待显示数字 display_digit[3] = currentt /100。 //百位 display_digit[2] = currentt % 100 /10。 //十位 display_digit[1] = currentt % 10。 //个位 if (display_digit[3] == 0 ) { display_digit[3] = 10。 //高位是零则不显示 np = 0xfb。 //调整负号位置 if( display_digit[2] == 0) { display_digit[2] =10。 //高位是零则不显示 np = 0xf7。 //调整负号位置 } 语句实现温度数据处理,如果 温度数据是正,则直接分别显示百、十、个位,如果最高位是零,则最高位不显示。 如果温度是负,则取反后再显示。 显示子程序 将百、十、个、小数位的数据查表,送到对应的数码管显示,程序流程图如 12所示: 课程设计说明书 15 图 12 显示程序流程图 通过子函书中 display_temperature()中的 for (i = 0。 i 30。 i ++) { P0 = 0x39。 P2 = 0x7f。 delay(t)。 P2 = 0xff。 //显示 C。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。