121、仿真-基于51单片机8路温度 ds18b20多路温度传感器检测仿真设计(Proteus仿真+程序+原理图+参考论文+任务书+流程图等)

摘  要

随着社会经济的高速发展和科技水平的不断进步,温度监控器的运用范围越来越广泛,也渐渐地发展到了核变站的温度监控。温度与人们的生活生产密切相关,比如在核变站的环境下,对温度的监控更是必不可少的,不但能保障人们的利益,还能减少不必要的资源浪费。

本文介绍一款基于上位机和下位机串口通信技术的温度监控器的设计方案,主要针对实现有线温度的实时监控,使得其运用在核变站中能拥有更利于工作的环境。监控器工作由现场采集系统和有线远程监控系统构成的。现场采集模块由8个温度传感器、AT89C52单片机、8个独立按键组成,采集数据由温度传感器实现。有线远程监控模块由232串口通信控制。两个系统通信由电脑端开发的上位机软件和用51单片机开发的下位机实现有线通信,并实现数据传送、接收、处理。

这套温度控制系统可以方便地实现温度测量、温度显示等功能,并通过与单片机连接的键盘可以实时切换,还可以连接相应的外围电路,在收到单片机发出的指令后对环境进行检测

本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件模块的功能和它的工作过程;其次,详细阐述了程序的各个模块及其实现过程。本系统的主要设计思想是以硬件为基础,软件和硬件相结合,最终实现各个模块的功能。

温度监控器的设计应用了当下较为流行的单片机技术和传感器技术,能够很好的实现温度监控器的控制。其电路结构简单、设计成本低廉、操作方便,能广泛的应用于各种各样的环境中,特别是在本文的核电站中,具有很大的实用价值。

关键词:单片机;温度传感器;上位机;核变站;232串口;硬件模块;显示屏

方案选择
单片机的选择

方案一:STM32系列单片机控制,该型号单片机为LQFP44封装,内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ,在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节的闪存程序存储器,也就是说代码量可以写到128k字节,本次设计足够,内部高达20K字节的SRAM。
 

方案二:51单片机STC89C52系列的指令系统和AT89C52系列的完全兼容,但实际操作起来却存在很多问题:

(1)AT89C52不带ISP下载,要用下载器才行,STC89C52可以用你的USB转串口下载,下载软件可以到STC厂家网上去下。

(2)STC单片机执行指令的速度很快,大约是AT的3-30倍,尽管快是好事,但这样一来,你在AT上好使的程序在STC上不一定好用,最典型的例子就是那些对时序有严格要求的模块,用STC时注意得加长延时,大约是AT的10—30倍就差不多,这一点自己调试就知道了。

(3)STC单片机对工作环境的要求比较低,电压低于5伏时仍然正常工作,甚至3伏到4伏之间都还可以工作,然而这样的环境下AT肯定不行了,所以当一个系统用STC单片机好用,但用AT的单片机不工作时,直接查最小系统,看单片机的供电是否正常。

比较这两种方案,由于在学校期间学过数字电路、单片机原理、C语言程序设计,综合考虑单片机的各部分资源和作为学生能够获得的资源,还有STM32价钱比较贵方面。经过对比此次设计要求,我选择用51单片机中的STC系列芯片完成。而且学校也提供了相应的硬件操作平台,实际操作起来比较方便,故STC为更合理的选择。本系统选择STC89C52单片机作为主控芯片。足够本设计运行,且价格便宜,下载程序方便。


显示器选择方案

方案一:采用12864液晶显示屏。液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。可与CPU直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等。

方案二:采用LCD1602液晶显示屏。LCD1602A 是一种工业字符型液晶,能够同时显示16x02 即32个字符。(16列2行)。1602只能显示字母、数字和符号能显示16*2个字符,但寄存器不止32个,有一些显示效果,如字符一个个显示、字符从左到右或从右到左显示等等,显示效果简单。

总结:在编程使用方面,两者难度差不多,原理差不多,都是写指令、写地址、写数据等等。当然12864液晶屏显示更全面、字符更多。相比于1602液晶屏、12864能更形象具体的实现显示功能。不过1602液晶屏也能实现设计的要求。网上买比较廉价,最低的六块钱左右。而12864液晶显示屏最便宜的也要四十块钱。从造价方面考虑,当然是价格低廉的优先。而LCD1602A就是最好的选择。

一、硬件方案

硬件电路组成:本系统采用51单片机最小系统电路(复位电路+晶振时钟电路+单片机电源电路)+232串口芯片+按键+ds18b20温度传感器+LCD1602液晶+电源设计而成。

二、设计功能

1、本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用)。

2、用LCD 1602液晶显示屏实时显示温度值。

3、采用ds18b20温度传感器采集温度。

4、可以通过按键切换监测哪路温度。

5、焊接实物可利用232串口可对8路温度值监测。

6、仿真可以定制。有需要可以拉到文章最后面加我。

三、Proteus仿真图

单片机模块设计

单片微型计算机是随着微型计算机的发展而产生和发展的。自从1975 年美国德克萨斯仪器公司的第一台单片微型计算机( 简称单片机)TMS-1000 问世以来,迄今为止,单片机技术已成为计算机技术的一个独特分支,单片机的应用领域也越来越广泛,特别是在工业控制中经常遇到对某些物理量进行定时采样与控制的问题,在仪器仪表智能化中也扮演着极其重要的角色。

如果将8位单片机的推出作为起点,那么单片机的发展历史大致可以分为以下几个阶段:

第一阶段(1976—1978):单片机的探索阶段。以Intel公司的MCS-48为代表。MCS-48的推出是在工控领域的探索,参与这一探索的公司还有Motorola、Zilog等。都取得了满意的效果。这就是SCM的诞生年代,“单片机”一词即由此而来。

第二阶段(1978—1982):单片机的完善阶段。Intel公司在MCS-48基础上推出了完善的、典型的单片机系列MCS-51。它在以下几个方面奠定了典型的通用总线型单片机体系结构。

(1)完善的外部总线。MCS-51设置了经典的8位单片机的总线结构,包括8位数据总线、16位地址总线、控制总线及具有多机通信功能的串行通信接口。

(2)CPU外围功能单元的集中管理模式。

(3)体现工控特性的地址空间及位操作方式。

(4)指令系统趋于丰富和完善,并且增加了许多突出控制功能的指令。

第三阶段(1982—1990):8位单片机的巩固发展及16位单片机的推出阶段,也是单片机向微控制器发展的阶段。Intel公司推出的MCS-96系列单片机,将一些用于测控系统的模数转换器、程序运行监视器、脉宽调制器等纳入片中,体现了单片机的微控制器特征。

第四阶段(1990—):微控制器的全面发展阶段。随着单片机在各个领域全面、深入地发展和应用,出现了高速、大寻址范围、强运算能力的8位/16位/32位通用型单片机,以及小型廉价的专用型单片机。

单片机是在集成电路芯片上集成了各种元件的微型计算机,这些元件包括中央处理器CPU、数据存储器RAM、程序存储器ROM、定时/计数器、中断系统、时钟部件的集成和I/O接口电路。由于单片机具有体积小、价格低、可靠性高、开发应用方便等特点,因此在现代电子技术和工业领域应用较为广泛,在智能仪表中单片机是应用最多、最活跃的领域之一。在控制领域中,现如今人们更注意计算机的底成本、小体积、运行的可靠性和控制的灵活性。在各类仪器、仪表中引入单片机,使仪器仪表智能化,提高测试的自动化程度和精度,提高计算机的运算速度,简化仪器仪表的硬件结构,提高其性能价格比。


四、原理图

在本设计做的过程中,硬件和软件方面都遇到了许多问题,但是相比于软件,在硬件方面还是比较快解决的方面,因为硬件是比较容易检查出来错误的,软件比较晦涩难懂,还是有一定难度。
在硬件调试问题上,首先焊接好了元器件实物板后,先用万用表测量这个工业板子的电源方面,电源方面是最重要的问题,应该是特别需要检查的地方,以防止电源的短路和正负极的错误。然后在仔细检查电路的连接是否有问题,或者有没有虚焊或者没有焊接到的地方,然后核对一下元器件的安装是否有问题,安装上去是否符合规定,由于已经是大学四年都是做过了很多实训过来了,对于这些还是游刃有余的,但是在上机调试后还是发现了很多的问题。

 

五、部分程序源码

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

DS18B20_Init();  //DS18B20初始化
	 while(1){
	 	/*获取各个站点温度值*/
	 	tem[0] = DS18B20_GetTem1() + 55;	
	 	tem[1] = DS18B20_GetTem2() + 55;
	 	tem[2] = DS18B20_GetTem3() + 55;
	 	tem[3] = DS18B20_GetTem4() + 55;
	 	tem[4] = DS18B20_GetTem5() + 55;
	 	tem[5] = DS18B20_GetTem6() + 55;
	 	tem[6] = DS18B20_GetTem7() + 55;
	 	tem[7] = DS18B20_GetTem8() + 55;
		LCD_Clear();
		Scan_Key();
		switch(Key_Code){
			case 0 : LCD_LineFeed1();                  //换屏幕第一行
					 LCD_DisplayText("The first is "); //显示文字
					 LCD_LineFeed2();                  //换屏幕第二行
					 LCD_DisplayNum(tem[Key_Code] - 55, 1); //显示温度数据
					 WriteDat(0xdf);					//显示温度单位
					 LCD_DisplayText("C");              //显示温度单位
					 break;
			case 1 : LCD_LineFeed1();
					 LCD_DisplayText("The second is ");
					 LCD_LineFeed2();
					 LCD_DisplayNum(tem[Key_Code] - 55, 1);
					 WriteDat(0xdf);					//显示温度单位
					 LCD_DisplayText("C");              //显示温度单位
					 break;
					 
			case 2 : LCD_LineFeed1();
					 LCD_DisplayText("The third is ");
					 LCD_LineFeed2();
					 LCD_DisplayNum(tem[Key_Code] - 55, 1);
					 WriteDat(0xdf);					//显示温度单位
					 LCD_DisplayText("C");              //显示温度单位
					 break;
					 
			case 3 : LCD_LineFeed1();
					 LCD_DisplayText("The fourth is ");
					 LCD_LineFeed2();
					 LCD_DisplayNum(tem[Key_Code] - 55, 1);
					 WriteDat(0xdf);					//显示温度单位
					 LCD_DisplayText("C");              //显示温度单位
					 break;
			case 4 : LCD_LineFeed1();
					 LCD_DisplayText("The fifth is ");
					 LCD_LineFeed2();
					 LCD_DisplayNum(tem[Key_Code] - 55, 1);
					 WriteDat(0xdf);					//显示温度单位
					 LCD_DisplayText("C");              //显示温度单位
					 break;
			case 5 : LCD_LineFeed1();
					 LCD_DisplayText("The sixth is ");
					 LCD_LineFeed2();
					 LCD_DisplayNum(tem[Key_Code] - 55, 1);
					 WriteDat(0xdf);					//显示温度单位
					 LCD_DisplayText("C");              //显示温度单位
					 break;
			case 6 : LCD_LineFeed1();
					 LCD_DisplayText("The seventh is ");
					 LCD_LineFeed2();
					 LCD_DisplayNum(tem[Key_Code] - 55, 1);
					 WriteDat(0xdf);					//显示温度单位
					 LCD_DisplayText("C");              //显示温度单位
					 break;
			case 7 : LCD_LineFeed1();
					 LCD_DisplayText("The eighth is ");
					 LCD_LineFeed2();
					 LCD_DisplayNum(tem[Key_Code] - 55, 1);
					 WriteDat(0xdf);					//显示温度单位
					 LCD_DisplayText("C");              //显示温度单位
					 break;
		}
		SendOneByte(0x55);	    //发送起始字节


 

资料包括:

 

需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 以下是基于51单片机+DS18B20温度传感器+LCD1602显示器的程序: ```c #include <reg52.h> #include <intrins.h> #define LCD1602_DATAPORT P0 // LCD1602数据口定义 sbit LCD1602_RS = P2^0; // LCD1602 RS引脚定义 sbit LCD1602_RW = P2^1; // LCD1602 RW引脚定义 sbit LCD1602_EN = P2^2; // LCD1602 EN引脚定义 #define DS18B20_DQ P3_7 // DS18B20数据线定义 unsigned char str[16]; // 存储温度字符串 void delay(unsigned int t) // 延时函数 { unsigned int i,j; for(i=0;i<t;i++) { for(j=0;j<125;j++); } } void LCD1602_WriteCmd(unsigned char cmd) // 命令函数 { LCD1602_RS = 0; // RS置低 LCD1602_RW = 0; // RW置低 LCD1602_DATAPORT = cmd; // 将命令入数据口 LCD1602_EN = 1; // EN置高 _nop_(); // 空操作 _nop_(); _nop_(); LCD1602_EN = 0; // EN置低 } void LCD1602_WriteData(unsigned char dat) // 数据函数 { LCD1602_RS = 1; // RS置高 LCD1602_RW = 0; // RW置低 LCD1602_DATAPORT = dat; // 将数据入数据口 LCD1602_EN = 1; // EN置高 _nop_(); // 空操作 _nop_(); _nop_(); LCD1602_EN = 0; // EN置低 } void LCD1602_Init() // LCD1602初始化函数 { LCD1602_WriteCmd(0x38); // 8位数据总线,2行显示,5*7点阵字符 delay(5); LCD1602_WriteCmd(0x0c); // 关闭光标显示 delay(5); LCD1602_WriteCmd(0x06); // 右移光标 delay(5); LCD1602_WriteCmd(0x01); // 清屏 delay(5); } unsigned char DS18B20_Init() // DS18B20初始化函数 { unsigned char flag = 0; DS18B20_DQ = 1; // DQ置高 delay(10); DS18B20_DQ = 0; // DQ置低 delay(80); DS18B20_DQ = 1; // DQ置高 delay(10); flag = DS18B20_DQ; // 读取DS18B20应答信号 delay(10); return flag; } void DS18B20_WriteByte(unsigned char dat) // DS18B20字节函数 { unsigned char i; for(i=0;i<8;i++) { DS18B20_DQ = 0; // DQ置低 _nop_(); // 空操作 _nop_(); DS18B20_DQ = dat&0x01; // 入数据,从低位开始 delay(10); DS18B20_DQ = 1; // DQ置高 dat >>= 1; // 右移一位 } } unsigned char DS18B20_ReadByte() // DS18B20读字节函数 { unsigned char i,dat = 0; for(i=0;i<8;i++) { dat >>= 1; // 右移一位 DS18B20_DQ = 0; // DQ置低 _nop_(); // 空操作 _nop_(); DS18B20_DQ = 1; // DQ置高 delay(2); if(DS18B20_DQ) // 判断数据位 { dat |= 0x80; // 入数据,从高位开始 } else { dat &= 0x7f; } delay(10); } return dat; } void DS18B20_GetTemp() // DS18B20读取温度函数 { unsigned char TL,TH; float temp; DS18B20_Init(); // DS18B20初始化 DS18B20_WriteByte(0xcc); // 跳过ROM操作 DS18B20_WriteByte(0x44); // 启动温度转换 delay(750); // 等待转换完成 DS18B20_Init(); // DS18B20初始化 DS18B20_WriteByte(0xcc); // 跳过ROM操作 DS18B20_WriteByte(0xbe); // 读取温度寄存器数据 TL = DS18B20_ReadByte(); // 读取低温度字节 TH = DS18B20_ReadByte(); // 读取高温度字节 temp = TH; temp *= 256; temp += TL; temp *= 0.0625; // 计算温度值 sprintf(str,"Temp:%.2fC ",temp); // 将温度值转换为字符串 } void main() { LCD1602_Init(); // LCD1602初始化 while(1) { DS18B20_GetTemp(); // 获取温度值 LCD1602_WriteCmd(0x80); // 设置光标位置为第一行第一列 for(unsigned char i=0;i<16;i++) // 温度字符串 { LCD1602_WriteData(str[i]); } delay(1000); // 延时1秒 } } ``` 以上程序实现了基于51单片机+DS18B20温度传感器+LCD1602显示器的温度监测功能。具体实现过程为:初始化LCD1602和DS18B20,循环读取DS18B20温度值,将温度值转换为字符串并在LCD1602上显示,然后延时1秒后继续循环读取温度值。 ### 回答2: 这是一个基于51单片机DS18B20温度传感器和LCD1602显示器的程序,用于测量环境温度并在LCD显示器上显示。 首先,我们需要连接硬件设备。将DS18B20温度传感器的VCC引脚连接到51单片机的5V电源引脚,将GND引脚连接到GND引脚,将DQ引脚连接到P0口(可以根据需要更改引脚)。然后,将LCD1602显示器的VCC引脚连接到5V电源引脚,将GND引脚连接到GND引脚,将SCL引脚连接到51单片机的P2口,将SDA引脚连接到P3口。 接下来,打开编程软件,创建一个新的项目。首先,我们需要引入51单片机的头文件和宏定义。然后,我们需要定义DS18B20传感器的一些常量和变量,包括温度传感器的ROM码和温度值。接着,我们需要一些函数用于初始化DS18B20传感器和LCD1602显示器,并读取温度值。 在主函数中,我们首先需要调用初始化函数来初始化DS18B20传感器和LCD1602显示器。然后,我们可以通过调用读取温度值的函数来获取当前环境温度,并将其存储到温度变量中。最后,我们可以通过调用LCD显示函数来在LCD显示器上显示温度值。 程序的基本逻辑是,当主函数运行时,首先初始化DS18B20传感器和LCD1602显示器。然后,通过读取温度传感器的值并将其转换为实际温度值,将实际温度值存储在温度变量中。最后,通过将温度值转换为字符串,并调用LCD显示函数将其显示在LCD1602显示器上。 以上是一个简单的基于51单片机DS18B20温度传感器和LCD1602显示器的程序程序的功能是测量环境温度并在LCD显示器上显示。 ### 回答3: 基于51单片机DS18B20温度传感器和LCD1602显示器的程序如下: 首先,我们需要包含头文件 #include <reg51.h> #include <lcd.h> #include <ds18b20.h> 然后,定义所需的变量 sbit LCD_RS = P2^0; // 设置LCD_RS引脚 sbit LCD_RW = P2^1; // 设置LCD_RW引脚 sbit LCD_EN = P2^2; // 设置LCD_EN引脚 定义主函数 void main() { float temperature; // 存储温度值 char display[16]; // 存储显示在LCD上的字符串 LCD_Init(); // 初始化LCD1602显示器 DS18B20_Init(); // 初始化DS18B20传感器 while (1) // 无限循环 { temperature = DS18B20_GetTemp(); // 获取温度值 sprintf(display, "Temperature: %.2fC", temperature); // 格式化温度值字符串 LCD_Clear(); // 清除LCD屏幕 LCD_Write_String(display); // 显示温度值 Delay(500); // 延迟500毫秒 } } 程序的逻辑是:首先,我们初始化LCD和DS18B20传感器。然后,在无限循环中,我们不断获取温度值,并将其格式化为字符串。然后,我们清除LCD屏幕并在LCD上显示温度值。最后,我们延迟500毫秒,以便能够看到温度在LCD上的显示。该程序可以实时显示DS18B20传感器测量到的温度值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ENGLISH_HHZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值