Proteus平台下基于Arduino的通过UART串口可靠通信系统仿真、传感器数据采集、以及LCD屏幕二级菜单功能实现(附工程源码、设计报告)

这篇具有很好参考价值的文章主要介绍了Proteus平台下基于Arduino的通过UART串口可靠通信系统仿真、传感器数据采集、以及LCD屏幕二级菜单功能实现(附工程源码、设计报告)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

arduino uart,proteus,单片机,mcu,Powered by 金山文档
arduino uart,proteus,单片机,mcu,Powered by 金山文档

若需要运行源码,需要将控制温湿度传感器以及LCD屏幕(TFTv2.h DHT.h)的头文件添加进工程

主程序初始化

#include <stdint.h>
#include "TFTv2.h"
#include <SPI.h>
#include <DHT.h>
#define DHTPIN 8     // 温湿度传感器连接的引脚
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE,4);
char sensorPrintout[4];//存储
int count=0;
const int interruptA = 3;// 设置中断Interrupt引脚
const int interruptB = 2;
const int interruptD = 19;
int F[2] = {0,0};//初始化页面状态参量
int S[2] = {0,0};//初始化页面参量
int R = -1;//页面索引参量
int button1 = 3;//管脚号定义,下同
int button2 = 2;
int button4 = 19;
//LED 代码初始化部分
const int ledPin = 13; // led连接的引脚
int ledState = LOW; // led状态,亮或者灭,可以修改 
long previousMillis = 0; // 存储最后一次的led状态
// 这里使用了长整型变量,因为使用了ms,瞬间的数值变化非常大。 
long interval = 500; // 间隔闪烁的时间长度 
unsigned long time_find = 0;

void setup() 
{ 
 Serial.begin(9600); //串口初始化
 Serial2.begin(9600);//串口初始化
 dht.begin();
 /*  LCD 初始化  */ 
 SPSR |= (1 << SPI2X);                       // 2x SPI speed 
 TFT_BL_ON;                                  // turn on the background light
 Tft.TFTinit();                              //init TFT library
 Tft.drawLine(0,0,239,319,RED);              //start: (0, 0) end: (239, 319), color : RED
 Tft.drawVerticalLine(60,100,100,GREEN);     // Draw a vertical line
                                               // start: (60, 100) length: 100 color: green
 Tft.drawHorizontalLine(30,60,150,BLUE);     //Draw a horizontal line
                                               //start: (30, 60), high: 150, color: blue
 Tft.drawCircle(100, 100, 30,YELLOW);        //center: (100, 100), r = 30 ,color : YELLOW   
 Tft.drawCircle(100, 200, 40,CYAN);          // center: (100, 200), r = 10 ,color : CYAN  
 Tft.fillCircle(200, 100, 30,RED);           //center: (200, 100), r = 30 ,color : RED    
 Tft.fillCircle(200, 200, 30,BLUE);          //center: (200, 200), r = 30 ,color : BLUE     
 Tft.drawString("Hello",0,180,3,CYAN);       // draw string: "hello", (0, 180), size: 3, color: CYAN
 Tft.drawString("World!!",60,220,4,WHITE);    // draw string: "world!!", (80, 230), size: 4, color: WHITE
 delay(500);
/*  LCD 初始化结束  */
 pinMode(button1, INPUT); //管脚输入输出方式
 pinMode(button2, INPUT);
 pinMode(button4, INPUT);
 pinMode(ledPin, OUTPUT); 
 digitalWrite(button1, HIGH);//数字写为高电平
 digitalWrite(button2, HIGH);
 digitalWrite(button4, HIGH); 
 attachInterrupt(digitalPinToInterrupt(interruptA), Choose1, FALLING);//中断下降沿触发
 attachInterrupt(digitalPinToInterrupt(interruptB), Choose2, FALLING);
 attachInterrupt(digitalPinToInterrupt(interruptD), Return_, FALLING);
} 

部分运行效果(完整工程在资源里)

二级菜单

arduino uart,proteus,单片机,mcu,Powered by 金山文档
arduino uart,proteus,单片机,mcu,Powered by 金山文档

三个按键控制菜单,功能分别为:选择功能1,选择功能2,以及返回上一级;

通过三个外部中断对页面状态参量进行控制:

void Choose1(){//确认选择第一个功能
R = R+1;//对状态参量进行操作,进入下一页,即F数组加一位
F[R] = F[R]+1;
}

void Choose2(){//确认选择第二个功能
R = R+1;//对状态参量进行操作,进入下一页,即S数组加一位
S[R] = S[R]+1;
}

void Return_(){//返回上一级
if(F[R] == 1){//将状态参量退回到上一级
F[R] = F[R]-1;}
else if(S[R] == 1){
S[R] = S[R]-1;}
R = R-1;
}

温湿度传感器

arduino uart,proteus,单片机,mcu,Powered by 金山文档
while(F[0] == 1 & F[1] ==0 & S[0] == 0 & S[1] == 1){//进入温湿度传感器界面
 float h = dht.readHumidity();// 读温度湿度的取值
  // Read temperature as Celsius
 float t = dht.readTemperature();
  // Read temperature as Fahrenheit
 float f = dht.readTemperature(true);
  // Check if any reads failed and exit early (to try again).
 float hi = dht.computeHeatIndex(f, h);
 Tft.fillScreen();                               //清屏
 Tft.drawString("Humidity: ",0,0,2,CYAN);       // 可修改坐标 大小 颜色等
 Tft.drawFloat(h,3,60,50,1,WHITE);
 Tft.drawString("Temperature: ",0,100,2,CYAN);
 Tft.drawFloat(t,3,60,150,1,WHITE);
 Tft.drawString("Heat index:",0,200,2,CYAN);
 Tft.drawFloat(hi,3,60,250,1,WHITE);
 delay(500);}

可靠通信(停止等待协议)

停止等待

当U1收到U2的ACK后才会发送下一次传感器采集到的数据

arduino uart,proteus,单片机,mcu,Powered by 金山文档

超时重传

当关闭U2后,U1到达设定的超时时间后,进行重传操作,直到收到U2的确认收到的信息

arduino uart,proteus,单片机,mcu,Powered by 金山文档
while(F[0] == 1 & F[1] == 1 & S[0] == 0 & S[1] == 0){//进入光敏传感器功能,同时进行串口可靠通信
 String sensorVal = String(analogRead(A0));//读取模拟值

 if(Serial2.find("ack")){//若收到接收端的ack确认信息
 time_find = millis();//记录更新最近一次收到确认的时间信息
 Serial2.print(sensorVal);
 Tft.fillScreen();
 Tft.drawString("Data Transmitted!",0,0,2,CYAN);//收到确认后,显示可视化信息,再发送下一次数据
 delay(125);
 }
  
 unsigned long time_now = millis();//读取现在时钟信息
  
 if(time_now - time_find > 3000){//设置超时时间3秒
 Serial2.print(sensorVal);//3秒后再发送一次
 Tft.fillScreen();
 Tft.drawString("Timeout!",50,0,2,CYAN);//显示超时可视化信息
 time_find = time_now;//存储最新一次执行超时重传的时间实现重新计时
 delay(125);}
 
 sensorVal.toCharArray(sensorPrintout, 4);//U1 LCD显示出现在传感器的值
 Tft.fillScreen();
 Tft.drawString("Sensor Data :",0,0,2,CYAN);//显示字符
 Tft.drawString(sensorPrintout,0,100,2,CYAN);
 delay(125);
 }

对于U1来说,只有收到ack确认后才发送下一次的数据,不然就会超时重传。设置变量time_now = millis() 来记录当前运行的总时间,这个变量主程序每循环一次就会更新一次。然后设置变量time_find = millis() (time_find初始化为0)来记录最新一次收到接收端发来的ack并传输数据的时间点。在主程序中每运行一次就会比较time_now – time_find 是否大于超时时间interval,本工程中设置超时时间为3秒,若大于超时时间则重传并LCD显示“Timeout!”,并将此时的time_now赋给time_find来存储最新一次执行超时重传的时间实现重新计时。

char sensorPrintout1[4];
void setup()
 { 
   Serial.begin(9600); 
   Serial1.begin(9600);
   //Serial.setTimeout(2000);
   Serial.print("ack");
 }

void loop()
 { 
   if(Serial.available()>0){
   Serial.readBytes(sensorPrintout1,4);
   Serial1.println(sensorPrintout1);
   Serial.print("ack");
   }
 }

当U2收到U1发来的数据时,使用readBytes函数读取U1通过串口发来的字符串数据,并存储到sensorPrintout1数组中,并将此数据通过串口1打印出来,通过连接的虚拟终端显示。同时通过串口向U1发送“ack”确认字段,并等待下一次数据的到来。文章来源地址https://www.toymoban.com/news/detail-569388.html

如有任何疑问可以留言

声明:只用作分享学习,共同进步,其他不做任何用途

到了这里,关于Proteus平台下基于Arduino的通过UART串口可靠通信系统仿真、传感器数据采集、以及LCD屏幕二级菜单功能实现(附工程源码、设计报告)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Proteus基于51单片机利用虚拟串口实现主从机的通信

    最近在学校做单片机课程实验时,需要在Proteus上实现串口的通信,具体要求如下: 在此记录一下本人的解题方案,首先Proteus中的原理图绘制如下 其中虚拟串口可在元件库中搜索COMPIM获得。 将原件按上图连接完毕后,将各个虚拟串口的收发波特率设置为19200,并分别赋予CO

    2024年02月08日
    浏览(25)
  • 132、仿真-基于51单片机主从串口通信家用防盗报警器设计(程序+Proteus仿真+流程图等)

    毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、设计功能 二、Proteus仿真图​编辑 三、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一:STM32系列单片机控制,该型号

    2024年02月16日
    浏览(28)
  • Proteus仿真之UART通信(点亮LED灯)

        1.UART通信简介:通用异步收发传输器UART(Universal Asynchronous Receiver/Transmitter)是负责处理数据总线和串口之间的串/并通信的设备。UART通信规定了数据帧的格式:起始位、数据位、校验位、停止位等。UART异步通信只需要通信双方设置好数据帧的格式和波特率即可完成通信。

    2024年02月09日
    浏览(26)
  • Proteus基于51单片机通过PWM脉冲调制控制电机转速_按键与串口控制转速_电机转速可测

    临近期末,学校的单片机课程需要做课程设计,主要内容是基于51单片机的可调速电机,具体要求如下,在此记录一下具体的一个解题方案。 要求利用单片机输出PWM波形,通过改变占空比,改变电枢两端电压的平均值,从而改变电动机的转速 通过按键进行手动速度调整(速度

    2023年04月14日
    浏览(49)
  • UART串口通信协议

    串行通信分为两种方式: 同步串行通信 和 异步串行通信 。 同步串行通信需要通信双方在同一时钟的控制下,同步传输数据。 异步串行通信是指通信双方使用各自的时钟控制数据的发送和接收过程。 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART)是一种 全双

    2024年02月03日
    浏览(27)
  • UART串口通信

    串口是“串行接口”的简称,即采用串行通信方式的接口。串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送,其特点是通信线路简单,但传输速度较慢。因此串口广泛应用于嵌入式、工业控制等领域中对数据传输速度要求不高的场合。 Serial communication是一个

    2024年02月10日
    浏览(21)
  • UART 串口通信

    第18.1讲 UART串口通信原理讲解_哔哩哔哩_bilibili 并行通信 一个周期同时发送8bit的数据,占用引脚资源多 串行通信 串行通信的通信方式: 同步通信 同一时钟下进行数据传输 异步通信 发送设备和接收设备的时钟不同 但是 需要约束波特率 (1s内传输的bit数) 串行通信的传输方

    2024年02月02日
    浏览(32)
  • UART串口通信(回环测试)

            UART(Universal Asynchronous Receiver-Transmitter)是采用异步串行通信方式的通用异步收发传输器,在发送数据时将并行数据转换为串行数据,在接收数据时将串行数据转换为并行数据。发送和接收的一帧数据由起始位、数据位、奇偶校验位和停止位组成,其数据帧格式如

    2024年02月05日
    浏览(46)
  • 串口通信(UART)

    串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。 51单片机

    2024年02月07日
    浏览(27)
  • UART串口通信实验

    不管是单片机开发还是嵌入式 Linux 开发,串口都是最常用到的外设。 可以通过串口将开发板与电脑相连,然后在电脑上通过串口调试助手来调试程序。 还有很多模块,比如蓝牙、GPS、GPRS等都使用串口与主控进行通信。 串口全称串行接口,通常也叫做COM接口,,串行接口指

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包