主从式温度监测报警与控制系统电子课程设计(编辑修改稿)内容摘要:

传感器 DS18B20 复位和读写操作。 对温度进行采集,按时序直接从温度传感器读入温度值的数字信号(这就是所测的温度值,因为 DS18B20 是最新单线数字温度传感器),最后存入内存。 由于精度准确、分辨率高、抗干扰性好、无需校验。 由于所读出的数据 格式为二进制数的补码,所以求出温度值的原码(当然正数是不必转换)。 在显示温度值时,还需要进行十进制的转换,字符代码的转换。 其温度采集流程图如图 所示。 主从式温度监测报警与控制系统 图 S18B20 温度采集流程图 LCD1602 显示模块程序设计 1) D1602 初始化 LCD1602 初始化流程图如图 所示 图 位总线借口模式初始化流程图 2)温度显示 LCD1602 温度显示流程图如图 所示 主从式温度监测报警与控制系统 图 LCD1602 温度显示流程图 RS232 串口通信模块程序设计 1)机端通信程序设计 AT89C52 单片机串行口是全双工串行通信口,有 4种工作方式,即:方式 0作移位寄存器使用;方式 1 是波特率可变的 8 位 UART;方式 2 是波特率固定为两种的 9位 UART;方式 3 是波特率可变的 9 位 UART。 在与 PC机通信时我们选用方式 1来循环。 向 PC 机发送数据,在电平转换的过程中用到 MAX232 这一核心芯片。 MAX232 芯片通过 DS18B20 温度传感器进行采集温度放入单片机内存,采集到的温度将以二进制补码的形式出现,然后通过编写程序将二进制补码的形式转换为字符的形式,通过字符型液晶显示模块将温度显示出来,最后利用 MAX232内部电荷汞电压转换器,完成电压转换,使温度在 PC 机界面显示出来。 2) PC 端通信程序设计 为方便进行远程控制可将采集到的温度数据发送到电脑,以便实时监测。 通过 RS_232 将数据发送至终端设备,采用 VC++ 作为开发平台。 五、设计方案电路图 主从式温度监测报警与控制系统 将 T89C52 单片机最小系统 、温度采集电路、温度显示报警电路、 PC 机与单片机通信接口电路等各子模块电路组合起来,就得到了最终的设计方案电路图如下所示: 图 5 主从式温度监测报警与控制系 统电路图 六、程序主要内容与流程图 程序主要包括 主程序设计、 DS18B20 模块程序设计、 LCD1602 显示模块程序设计、 RS232 串口通信模块程序设计等主要内容,具体参见《 系统的软件设计》这部分内容,程序设计的总体流程图如下所示: 主从式温度监测报警与控制系统 图 6 MCU 设计流程图 七、课程设计开展情况及总结 本次课程设计从 4 月中旬一直进行到 6月 20 日。 期间,也遇到过不少困难:元器件选择错误,不得不多次跑到赛格去重新买元器件;焊接出现错误,对着电路图苦苦寻找焊接错误的地方,通过仔细研究才发现是单片机引脚焊错, 但再次测试时还是不行,最终运用万用表才发现:即使是接了电源,单片机除了直接接电源的管脚外其他都是低电平,百思不得其解;程序运行错误,最终不得不通过翻阅大量资料来参考以及增补知识,改写程序,烧写程序也是历尽苦心,由于是买了 AT 的芯片,而大部分同学只有烧写 SAT,最终在电信同学的帮忙下才烧写成功。 虽然历尽千辛万苦,但很遗憾最终电路还是不能运行,估计有以下原因:模拟仿真的时候很成功,但焊接出来就实现不了,应该是模拟跟实际的有差主从式温度监测报警与控制系统 别造成,也有可能是焊接时还是出现了问题; 焊接是没有考虑液晶显示器的对比问题,因此 造成液晶显示器只能点亮不能显示数字。 下面再总结下我们的软硬件设计。 在硬件方面,前面已经详细介绍,这里就不再赘述。 展示下焊接好的电路板,如下图所示。 图 7 主从式温度监测报警与控制系统实物电路图 在软件方面,除了在 系统的软件设计部分提到的利用 c 编写程序外,我们还使用了 PROTUES 软件对电路进行了模拟仿真,经过多次模拟调试以后,模拟仿真的结果正确,也大大增强了我们完成电子设计的信心。 八、课程设计总结 本课程设计设计了一单片机 /PC 控制的测温 /传输系统。 前台由 DS18B20传感器将温度直接转 变成数字信号送入单片机中进行实时采集,通过 LCD1602液晶显示模块将结果在前台显示出来;另外,采集结果又通过 RS232,接口送入 PC 机后台中以便进行显示、存储或后续处理。 该系统体现了 数字化控制,智能化控制的特点, 实现了对温度的监测、报警和控制功能。 九、单片机系统源程序 主从式温度监测报警与控制系统 include main() { setds18b20(TH,TL,RS)。 //设置上下限报警温度和分辨率 UART_init()。 delay(100)。 while(1) { pt=ReadTemperature()。 //测温函数返回这个数组的头地址 //读取温度 ,温度值存放在一个两个字节的数组中 , temper_LCD()。 //实测温度转化为 ACSII 码 ,并送液晶显示缓冲区 alarm_LCD(TH,TL)。 //上下限报警温度转化为 ASCII码 ,并送液晶显示缓冲区 LCD_Initial()。 //第一个 参数列号 ,第二个为行号 ,为 0 表示第一行 //为 1表示第二行 ,第三个参数为显示数据的首地址 LCD_Print(0,0,TempBuffer0)。 LCD_Print(0,1,TempBuffer1)。 warning()。 //温度检测和报警 key_mand()。 COM_send()。 //发送实时温度 } } include include //测温头文件 include //液晶显示头文件 主从式温度监测报警与控制系统 include //键盘扫描头文件 sbit alarm=P2^6。 //报警信号 bit flag。 //温度正负号标志位 unsigned char warning_key。 //PC 报警标志位 unsigned char key_value。 //存放键盘扫描值 unsigned char temper1,temper2。 unsigned char TH=100,TL=0,RS=0x3f。 //上限温度 100,下限 20,分辨率 10 位 ,也就是 unsigned char t[2],*pt。 //用来存放温度值 ,测温程序就是通过这个数组与主函数通信的 unsigned char point。 //定义发送数据个数指示变量 unsigned char TempBuffer1[17]={0x2b,0x20,0x60,0x30,0x2e,0x30,0x30,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,39。 \039。 }。 //显示实时温度 ,上电时显示 + unsigned char TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x20,0x30,0x30,0x20, 0x54,0x4c,0x3a,0x2b,0x20,0x30,0x30,0x43,39。 \039。 }。 //显示温度上下限 ,上电时显示 TH:+ 100 TL:+ 00C unsigned char code dotcode[4]={0,25,50,75}。 /***因显示分辨率为 ,但小数运算比较麻烦 ,故采用查表的方法 ******* 再将表值分离出十位和个位后送到十分位和百分位 ********************/ /***************温度上下限转换为 LCD 显示数据 ************ *功能 :将上下限报警温度 ,分离出符号位 ,百、十、个位 并将它们转化为 ACSII 码 ,送到液晶显示缓冲区 ******************************************************/ void alarm_LCD( unsigned char TH, unsigned char TL) { TempBuffer0[3]=0x2b。 //0x2B 为 +的 ASCII 码 TempBuffer0[11]=0x2b。 TempBuffer0[4]=TH/100+0x30。 //分离出 TH 的百十个位 if(TempBuffer0[4]==0x30) TempBuffer0[4]=0xfe。 //百位数消隐 TempBuffer0[5]=(TH%100)/10+0x30。 //分离出十位 TempBuffer0[6]=(TH%100)%10+0x30。 //分离出个位 TempBuffer0[12]=TL/100+0x30。 //分离出 TL 的百十个位 if(TempBuffer0[12]==0x30) TempBuffer0[12]=0xfe。 //百位数消隐 主从式温度监测报警与控制系统 TempBuffer0[13]=(TL%100)/10+0x30。 //分离出十位 TempBuffer0[14]=(TL%100)%10+0x30。 //分离出个位 } /**********温度转换为 LCD 显示数据 **************** *功能 :将两个字节的温度值 ,分离出符号位 ,整数及小数 并将它们转化为 ACSII 码 ,送到液晶显示缓冲区 ************************************************/ void temper_LCD(void) { unsigned char x=0x00,y=0x00。 t[0]=*pt。 pt++。 t[1]=*pt。 if(t[1]0x07) //判断正负温度 { flag=1。 TempBuffer1[0]=0x2d。 //0x2d 为 的 ASCII 码 t[1]=~t[1]。 /*下面几句把负数的补码 */ t[0]=~t[0]。 /* 换算成绝对值 *********/ x=t[0]+1。 /***********************/ t[0]=x。 /***********************/ if(x255) /**********************/ t[1]++。 /*********************/ } else { flag=0。 TempBuffer1[0]=0x2b。 //0xfe 为变 +的 ASCII 码 } t[1]=4。 //将高字节左移 4 位 t[1]=t[1]amp。 0x70。 //取出高字节的 3个有效数字位 x=t[0]。 //将 t[0]暂存到 X,因为取小数部分还要 用到它 x=4。 //右移 4位 x=xamp。 0x0f。 //和前面两句就是取出 t[0]的高四位 t[1]=t[1]|x。 //将高低字节的有效值的整数部分拼成一个字节 temper1=t[1]。 TempBuffer1[1]=t[1]/100+0x30。 //+0x30 为变 0~9 ASCII 码 if( TempBuffer1[1]==0x30) TempBuffer1[1]=0xfe。 //百位数消隐 TempBuffer1[2]=(t[1]%100)/10+0x30。 //分离出十位 TempBuffer1[3]=(t[1]%100)%10+0x30。 //分离出个位 t[0]=t[0]amp。 0x0c。 //取有效的两位小数 主从式温度监测报警与控制系统 t[0]=2。 //左移两位 ,以便查表 x=t[0]。 temper2=x。 y=dotcode[x]。 //查表换算成实际的小数 TempBuffer1[5]=y/10+0x30。 //分离出十分位 TempBuffer1[6]=y%10+0x30。 //分离出百分位 } //。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。