基于51单片机的双机通信温度检测报警系统的仿真设计

一、设计要求

主机、从机均以AT89C52单片机为控制核心。从机利用DS18B20检测温度,并将温度值通过串口发送给主机。主机将从机发送的温度值与报警上下阈值比较后,发送控制命令给从机,从机收到控制命令后执行相应的动作。

二、设计内容

从机利用DS18B20数字温度传感器检测温度,并将温度值(保留两位小数)在LCD1602的第一行显示,同时将温度值通过串口发送给主机。主机接收从机发送的温度值,并将温度值显示在LCD1602的第一行。主机通过矩阵按键输入温度报警上下限的阈值,上下阈值在LCD1602的第二行显示。主机将从机发送的温度值与上下阈值比较,当温度值在上下阈值范围内(不包括上下阈值)时,主机发送命令,从机接收命令控制直流电机转动;当温度值等于或超出上下阈值时,主机发送命令,从机接收命令控制直流电机停转、蜂鸣器报警。

三、设计方案

本次设计主要包括两个LCD1602显示模块、矩阵键盘输入模块、直流电机模块、蜂鸣器模块、DS18B20测温模块,串口通信模块。

LCD1602显示模块:主机和从机的LCD1602显示模块相同,下面以主机为例说明。主机的P0端口连接LCD1602的D0~D7引脚控制数据的输入输出;主机的P2^5、P2^6、P2^7引脚分别连接LCD1602的RW、RS、E引脚控制LCD1602的读/写选择、数据/指令选择和使能信号。如下图所示:

<think>我们使用51单片机实现双机通信,并进行电压采集和报警功能。方案如下:###1.系统总体设计系统由两个51单片机(MCU1和MCU2)组成:-**MCU1**:负责电压采集、数据处理、报警判断,并通过串口将数据发送给MCU2。-**MCU2**:负责接收来自MCU1的数据,并实现显示和报警功能(如通过LED或蜂鸣器报警)。###2.硬件设计####(1)电压采集电路-使用ADC(模数转换器)将模拟电压转换为数字量。51单片机通常没有内置ADC,因此需要外接ADC芯片(如ADC0804、ADC0809等)。-输入电压范围:0~5V(根据ADC参考电压设定)。-电路连接:模拟电压信号经过调理电路(如分压、滤波)后送入ADC的输入通道,ADC的数据输出端口连接到MCU1的P0口(或其他端口),控制信号(如启动转换、读取数据等)由MCU1的IO口控制。####(2)双机通信-采用**串口通信**(UART),使用51单片机的内置UART模块。-连接方式:MCU1的TXD(发送端)连接MCU2的RXD(接收端),MCU1的RXD连接MCU2的TXD,两机共地。-通信参数:波特率(如9600bps)、数据位(8位)、停止位(1位)、无校验位。####(3)报警电路-MCU2控制报警电路:使用一个IO口驱动蜂鸣器或LED。-当接收到MCU1发送的报警标志(如电压超限)时,MCU2触发报警。####(4)显示电路-MCU2连接显示模块(如LCD1602、数码管等)用于显示电压值。###3.软件设计####(1)MCU1程序(电压采集与发送)-初始化ADC和串口(设置波特率等)。-循环执行:-启动ADC转换,读取电压值(数字量)。-将数字量转换为实际电压值(例如:ADC为8位,参考电压5V,则电压值=(数字量/256)*5.0)。-判断电压是否超出设定范围(如上限4.5V,下限1.0V),若超限则设置报警标志。-通过串口发送数据包(包含电压值和报警标志)。-延时一定时间(如200ms)后重复。数据包格式(示例):```|起始字节(0xAA)|电压值字节|电压值低字节|报警标志(0x00正常,0xFF报警)|结束字节(0x55)|```(注:若ADC结果用2字节表示,则需分低字节发送)####(2)MCU2程序(接收与报警)-初始化串口(与MCU1相同波特率)和显示模块,初始化报警IO口(输出模式)。-循环执行:-接收串口数据,按数据包格式解析。-若接收到有效数据包,则提取电压值和报警标志。-在显示模块上显示电压值。-根据报警标志控制报警电路:若报警标志为0xFF,则触发报警(蜂鸣器响或LED亮);否则关闭报警。###4.关键代码示例####MCU1发送端(电压采集与发送)```c#include<reg52.h>#include<intrins.h>//假设ADC0804连接定义sbitADC_CS=P2^0;//片选sbitADC_RD=P2^1;//读信号sbitADC_WR=P2^2;//写信号(启动转换)sbitADC_INTR=P2^3;//转换结束信号(低电平有效)#defineADC_DATAP0//ADC数据端口//串口初始化voidUART_Init(){SCON=0x50;//串口工作方式1,允许接收TMOD|=0x20;//定时器1工作方式2(8位自动重装)TH1=0xFD;//波特率9600(11.0592MHz晶振)TL1=0xFD;TR1=1;//启动定时器1EA=1;//开总中断ES=1;//开串口中断}//ADC读取(返回16位ADC值,实际根据ADC位数调整)unsignedintADC_Read(){unsignedintadc_value;ADC_CS=0;//选中ADCADC_WR=0;//启动转换(WR由到低产生启动信号)_nop_();ADC_WR=1;while(ADC_INTR==1);//等待转换结束ADC_RD=0;//读取数据(RD由到低产生读取信号)_nop_();adc_value=ADC_DATA;//读取低8位(假设ADC0804是8位,实际读取一次即可)ADC_RD=1;ADC_CS=1;//取消选中returnadc_value;}//串口发送一个字节voidUART_SendByte(unsignedchardat){SBUF=dat;while(TI==0);TI=0;}//主函数voidmain(){unsignedintadc_value;floatvoltage;unsignedcharalarm_flag;UART_Init();while(1){adc_value=ADC_Read();voltage=(adc_value*5.0)/256.0;//计算电压值(8位ADC,参考电压5V)//报警判断(假设正常范围1.0V~4.5V)if(voltage<1.0||voltage>4.5){alarm_flag=0xFF;//报警}else{alarm_flag=0x00;//正常}//发送数据包UART_SendByte(0xAA);//起始字节UART_SendByte(adc_value>>8);//字节(如果ADC是8位,则只需发送一个字节,这里假设16位)UART_SendByte(adc_value);//低字节UART_SendByte(alarm_flag);//报警标志UART_SendByte(0x55);//结束字节//延时delay_ms(200);}}//串口中断服务函数(接收部分在MCU1中不需要,但保留框架)voidUART_ISR()interrupt4{if(RI){RI=0;//接收处理(本机为发送,可不处理)}}```####MCU2接收端(显示与报警)```c#include<reg52.h>//显示模块定义(假设使用LCD1602,具体引脚根据实际连接)sbitLCD_RS=P2^0;sbitLCD_RW=P2^1;sbitLCD_EN=P2^2;#defineLCD_DATAP0//报警引脚sbitBUZZER=P2^3;//串口初始化(同MCU1)voidUART_Init(){//同上}//LCD初始化及显示函数(省略,根据实际显示模块编写)voidLCD_Init(){/*...*/}voidLCD_DisplayString(unsignedcharx,unsignedchary,unsignedchar*str){/*...*/}//主函数voidmain(){unsignedcharrecv_buf[5];//接收缓冲区(假设数据包5字节)unsignedcharcnt=0;unsignedintadc_value;floatvoltage;unsignedcharalarm_flag;UART_Init();LCD_Init();BUZZER=0;//初始关闭报警while(1){if(RI){//如果接收到数据(在中断中接收,这里用查询方式示例,实际可用中断接收)RI=0;recv_buf[cnt]=SBUF;cnt++;if(cnt>=5){//收到5个字节//检查起始和结束字节if(recv_buf[0]==0xAA&&recv_buf[4]==0x55){adc_value=(recv_buf[1]<<8)|recv_buf[2];//合成ADC值alarm_flag=recv_buf[3];voltage=(adc_value*5.0)/256.0;//计算电压//显示电压(转换为字符串显示)//...省略显示代码//报警控制if(alarm_flag==0xFF){BUZZER=1;//报警}else{BUZZER=0;//关闭报警}}cnt=0;//重置计数器}}}}//串口中断服务函数(也可用中断方式接收)voidUART_ISR()interrupt4{if(RI){RI=0;//接收处理(可在此进行数据包接收)}}```###5.注意事项1.**ADC选择**:根据实际
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值