Qt5实现与单片机ATS89S51通信

2023-11-19

Qt实现与单片机直接的通信上位机+单片机代码


这是我大二下学期的单片机课设做的一个小项目,实现上位机与下位机之间的通信.

测试环境

开发环境:Qt5.96 Mingw32-bit keil3

项目目标

1、实现下位机基于STC单片机控制LED灯模块、独立键盘模块.
2、实现基于Qt的上位机与下位机进行串口通信.
3、通过上位机发送指令对下位机进行控制,如对LED灯进行亮灭控制,并通过界面方式显示.

实现效果

参数配置窗口
在这里插入图片描述
上位机控制界面 与窗口建立连接
在这里插入图片描述
上位机向单片机送消息 选择 模式1 流水灯 单片机响应
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上位机同步流水灯效果
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
单片机按下 key2 向上位机发送消息上位机显示时时时间
在这里插入图片描述

关键通信类 QSerialport

这个类实现上位机和下位机通信的通信具体的关于这个类的说明可以看官方文档 https://doc.qt.io/archives/qt-5.9/qserialport.html
Qt的QSerialPortInfo类来搜寻可用的串口号

foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){
    serialNamePort<<info.portName();
}

这个地方有一个千万注意上位机和单片机的波特率必须要是一样的但是同时要注意单片机的晶振频率是不是 11.0592MHz必须要是一样的否则发送信息会出现误差. 就是在这个地方搞了我好久由于单片机的晶振频率不是11.0592Mhz,弄了我两天才偶然发现,我的单片机频率是 12.526Mhz就是短短的0.1Mhz不到的误差导致一直发送乱码 后来我用一个串口误差计算器算得,当单片机的定时计数器的溢出值 0XF4 才会没有误差所以一定要注意这个
在这里插入图片描述
单片机参考代码

#include<reg52.h>
//--声明全局函数--//

//void UsartConfiguration();

unsigned char ch[10]="Press_Key1";
unsigned char GET[5];
unsigned int i,j,n,flag;
unsigned char receiveData;

	
//这几个位定义是我的板子

sbit LED0 = P0^0;
sbit LED1 = P0^1;
sbit LED2 = P0^2;
sbit LED3 = P0^3;
sbit LED4 = P0^4;
sbit LED5 = P0^5;
sbit LED6 = P0^6;
sbit LED7 = P0^7;

sbit KEY_1 = P3^2;
sbit KEY_2 = P3^3;
sbit KEY_3 = P3^4;
sbit KEY_4 = P3^5;
				   


void Delay10ms(unsigned int z){
	  
	 unsigned x,y;

	for(x = z;x>0;x--)
	for(y = 114;y>0;y--);

}

void Lighting(){

	LED0 = 0;

	LED1 = 0;
	LED2 = 0;
	LED3 = 0;
	LED4 = 0;
	LED5 = 0;
	LED6 = 0;
	LED7 = 1;

}
  


/*******************************************************************************
* 函 数 名         :UsartConfiguration()
* 函数功能		   :设置串口
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
 
void UsartConfiguration()
{
	SCON=0X50;			//设置为工作方式1			  0101 0000
	TMOD=0X20;			//设置计数器工作方式2
	PCON=0X80;			//波特率加倍,波特率加倍加快传输速率但是如果232总线太长时有可能出现丢帧
	TH1=0XF4;		    //计数器初始值设置,注意波特率是4800的,因为单片机的串口波特率不是15.092要特殊的来算
	TL1=0XF4;
	
	
	//TH1=0XFC;	
   	//TL1=0XFC;


	//REN = 1;			 //允许接受
	

	ES=1;						//打开接收中断
	EA=1;						//打开总中断
	TR1=1;					    //打开计数器 T1
}
 
void flowLight(){

	P0 =0Xff;
	Delay10ms(100);
	P0 =0Xfe;
	Delay10ms(100);
	P0 =0Xfc;
	Delay10ms(100);
	P0 =0Xf8;
	Delay10ms(100);
	P0 =0XE0;
	Delay10ms(100);
	P0 =0XC0;
	Delay10ms(100);
	P0 =0X80;
	Delay10ms(100);
	P0 =0;
	Delay10ms(100);
}

//闪光灯
void flahlight(){
	P0 = 0;
	Delay10ms(100);
	P0 = 0Xff;
	Delay10ms(100);
}

//熄灯
void stoplight(){
	P0 =0xff;
}

/*******************************************************************************
* 函 数 名         : Usart() interrupt 4
* 函数功能		   : 串口函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Usart() interrupt 4
{		
	
	
	unsigned char date[6] ="I get!"	;

	unsigned char num;
	Lighting();		

	num = SBUF;	

	RI = 0;
	n = num;
	if(num=='A'){


	for( i=0;i<6;i++){
	
	SBUF = date[i];
	ES = 0;
	while(TI==0);
    TI=0;
	ES =1;
	
		}
	
	}

	



}

//流水灯


void main()
{
	UsartConfiguration();
	//flag=0;//标记为0;为1时候发送" THE END ",当然不用flag直接在中断函数里写也可以
   	
	KEY_1=1;
	KEY_2=1;
	KEY_3=1;
	KEY_4=1;

	
	flag = 0;		       
	
//	Lighting();	//照亮你的	


	while(1)
	{

	//4个键实现四种功能  键盘1 我要打开计算器  键盘2我要打开5子棋  键盘3打开推箱子  键盘4打开  动态图像

	
	if(n=='f') 
	{

		flahlight();
	
	}
	  
	
	if(n=='F'){

	   flowLight();
		
	}   
	
	if(n=='s'){ 
	
		stoplight();	
	}


	if(KEY_1==0){
	
	flag = 1;
	ch[9] ='1';
	Delay10ms(300);
	
	}
	
	else if(KEY_2==0){
	flag = 1;
	ch[9] ='2';
	Delay10ms(300);
	}
	
	else if(KEY_3==0){
	

	flag = 1;
	ch[9] ='3';
	Delay10ms(300);
	}
	else if(KEY_4==0){
	

	flag =1;
	ch[9] ='4';
	Delay10ms(300);
	}

	if(flag==1){

	for( i=0;i<10;i++){
	SBUF = ch[i];
	ES = 0;
	while(TI==0);
    TI=0;
	ES =1;
	
		}
	}
	flag = 0;
 


	}
}

上位机通信代码

void Widget::on_openBtn_clicked()
{
    //初始化按钮
    QSerialPort::BaudRate bauRate;  //波特率
    QSerialPort::DataBits dataBits; //数据位
    QSerialPort::StopBits stopBits; //停止位
    QSerialPort::Parity  checkBits; //校验位


    if(ui->baundrateCb->currentText()=="4800"){
        bauRate = QSerialPort::Baud4800;
    }else if(ui->baundrateCb->currentText()=="9600"){
        bauRate = QSerialPort::Baud9600;

    }else if(ui->baundrateCb->currentText()=="115200"){
        bauRate = QSerialPort::Baud115200;

    }else if(ui->baundrateCb->currentText()=="2400"){
        bauRate = QSerialPort::Baud2400;

    }else if(ui->baundrateCb->currentText()=="1200"){
        bauRate = QSerialPort::Baud1200;


    }

    if(ui->dateCb->currentText()=="5"){

        dataBits = QSerialPort::Data5;
    }else  if(ui->dateCb->currentText()=="6"){
        dataBits = QSerialPort::Data6;

    }else  if(ui->dateCb->currentText()=="7"){
        dataBits = QSerialPort::Data7;

    }else  if(ui->dateCb->currentText()=="8"){

        dataBits = QSerialPort::Data8;
    }

    if(ui->stopCb->currentText()=="1"){
        stopBits =QSerialPort::OneStop;

    }else if(ui->stopCb->currentText()=="1.5"){
        stopBits = QSerialPort::OneAndHalfStop;

    }else if(ui->stopCb->currentText()=="2"){

         stopBits = QSerialPort::TwoStop;
    }


    if(ui->checkCb->currentText()=="none"){
        checkBits = QSerialPort::NoParity;

    }

    //设置端口号
    serialPort->setPortName(ui->serialCb->currentText());

    serialPort->setBaudRate(bauRate);

    serialPort->setDataBits(dataBits);

    serialPort->setStopBits(stopBits);

     bauRate = QSerialPort::Baud4800;
     dataBits =QSerialPort::Data8;      //数据位
     stopBits =QSerialPort::OneStop;    //停止位
     checkBits = QSerialPort::NoParity; //校验位

    serialPort->setParity(checkBits);
    serialPort->setFlowControl(QSerialPort::NoFlowControl);//设置为无流控制

    qDebug()<<serialPort->portName();
    qDebug()<<serialPort->baudRate();
    qDebug()<<serialPort->dataBits();
    qDebug()<<serialPort->parity();

    //QIODevice::open();

    if(serialPort->open(QIODevice::ReadWrite)==true){
        //串口打开成功
        QMessageBox::information(this,"提示","串口打开成功");


    }else{

        QMessageBox::critical(this,"提示","串口打开失败");

    }

}

上位机所有程因为代码量较多和 ui文件不能直接复制出来,所以我将上位机的所有代码打包存入网盘:链接:https://pan.baidu.com/s/15vHZcHRiiYiHnGYAWpP3DQ
提取码:6666

总结

Qt 使用 QSerialport 十分方便的与单片机进行通信,通信的过程中注意的关键问题之一就是信息同步性的问题.注意通信过程中的波特率要设置对应,不仅仅是要注意波特率还有注意单片机的晶振频率是不是11.0592Mhz.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt5实现与单片机ATS89S51通信 的相关文章

  • 如何设置 Xcode 来代替 Qt Creator 工作?

    我不使用 Qt Creator 的 UI 设计功能 对于一个新项目 我想体验一下使用 Xcode 的工作 这将是一个常规的 Qt 项目 使用 C 和 Qt 库开发 就像在 Qt Creator 中一样 我没有使用 OS X 尤其是 Xcod
  • Qt 远程文件浏览器

    我想知道是否有人使用过 Qt 远程文件浏览器 根据我的理解 我有两个选择 当涉及到远程文件时 将 QFileDilaog 与自定义代理模型结合使用 该模型将负责提供远程文件 目录结构 使用自定义对话框 并为本地文件提供标准文件系统模型 为远
  • 将项目添加到自定义组件的布局

    我有一个习惯Footer Component我想在 QML 应用程序的不同位置重用它 Rectangle color gold height 50 anchors bottom parent bottom left parent left
  • Qt + win32 + mingw 上的原生 Windows API 链接问题

    我正在尝试使用 mingw 工具集将本机 Windows API 与 Qt 结合使用 部分功能存在链接问题 会发生什么 这是 mingw 名称修改的错误吗 ifdef Q WS WIN HWND hwnd QWidget winId HDC
  • QT 应用程序运行时错误?

    我已经在 Windows 7 的 Qt5 1 上开发了一个应用程序 现在我想分发它 由于我使用了 MINGW 编译器 因此无法静态构建它 我使用dependency walker找出所有dll并打包 当我在未安装 QT 开发环境的计算机上运
  • 通过对 XmlHttpRequest (REST) 的响应在 QML 中显示图像

    我需要从 REST API 调用中获取 jpeg 图像 我使用 XMLHttpRequest 因为请求需要身份验证标头 即我不能只创建一个图像并将源设置为带有 user passwd url 的 URL 我认为我可以通过将 REST 数据设
  • QToolBar 的菜单延迟

    我通过制作 QAction 并向其添加 QMenu 在 QToolBar 上有一个菜单 如何消除单击图标时出现菜单之前的延迟 QToolBar myToolBar new QToolBar this QAction myAction new
  • Windows 消息循环而不是 QApplication::exec() / QApplication::processEvents()

    我是否想念任何一个Qt如果我替换功能QApplication exec 使用标准 Windows 消息循环实现 这应该可以澄清我的意思 运行事件处理的常用 Qt 方式 int main int argc char argv QApplica
  • 调整 QML 图像显示尺寸

    我有一个带有嵌套的 QML 窗口RowLayout 在内排我有两个图像 来源 png这些图像的文件 故意 相当大 当我尝试设置height这些图像上的属性使它们变小 但它们仍然被画得很大 Desired Appearance Actual
  • qt项目如何设置安装路径

    我正在寻找与 qmake configure prefix 等效的内容 基本上 我想覆盖默认的安装 部署目录 这是如何用命令行 qmake 指定的 我还使用 QtCreator 构建了很多 gui 项目 并且我想知道如何在 QtCreato
  • 仅将非模态 QDialog 窗口放置在我的应用程序顶部,而不是所有应用程序顶部

    我有一个 QDialog 窗口 它应该始终位于我的应用程序顶部 它不是模态的 用户可以随时与对话框和主应用程序进行交互 使用窗口保持在顶部提示在某种程度上实现了这一点 但是 该对话框仍然位于所有其他正在运行的应用程序 例如记事本 chrom
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 当我尝试构建 Qt 4.7.1 静态库时,“找不到 -ljscore”

    我尝试从最新的源构建静态 Qt 库 但出现以下错误 usr bin ld cannot find ljscore collect2 ld returned 1 exit status 如何解决这个问题呢 这是 Qt 构建系统中自 4 7 0
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod

随机推荐

  • 问题解决——使用串口调试助手发送控制字符 协议指令 <ESC>!?

    问题解决 使用串口调试助手发送控制字符 协议指令 参考文章 1 问题解决 使用串口调试助手发送控制字符 协议指令 2 https www cnblogs com wlsandwho p 4202094 html 备忘一下
  • 丁鹏:多角度回顾因果推断的模型方法

    来源 集智俱乐部 本文约23000字 建议阅读20 分钟 本文整理自丁鹏老师的8篇短文 从多角度回顾了因果推断的各种模型方法 导读 推断因果关系 是人类思想史与科学史上的重要主题 现代因果推断的研究 始于约尔 辛普森悖论 经由鲁宾因果模型
  • 云服务器是什么? 云服务器有哪些选择?

    欢迎前往我的个人博客云服务器查看更多关于云服务器和建站等相关文章 随着互联网技术的发展和云计算技术的应用 越来越多的企业倾向于使用云服务器来满足其不断增长的计算需求 云服务器是一种基于云计算技术的虚拟服务器 它能够为企业提供高性能 可靠 灵
  • 【算法竞赛】Python快速入门指南

    该指南由GPT4编写 用于快速入门蓝桥杯Python组 当然 仅限入门而已 本指南由GPT 4生成 我只是负责引导 并对内容进行整理和补充 一直以来我都是使用C 作为算法竞赛语言 但是奈何C 组太卷 自己又太菜 于是另谋他路 Prompt模
  • 【AD20】快速且只选中部分自己想要的同类型的元件

    在project属性框里面 可以选择所有如下图所示内容 这个是一个过滤器 里面有多种小选项 比如 Components 元件 Pads 焊盘 Texts 文本 选择哪个就只能选择对应的部分 比如 只选择文本 在画图区域 框选 发现只有文本才
  • 数位拆分

    4 数位拆分v1 0 现有一个4位数的正整数n 4321 即n是一个已知的数 固定为4321 编写程序将其拆分为两个2位数的正整数43和21 计算并输出拆分后的两个数的加 减 乘 除和求余的结果 例如n 4321 设拆分后的两个整数为a b
  • 【目标检测】OneNet: Towards End-to-End One-Stage Object Detection

    label assignment是指 在训练过程中如何将某个prediction指定给某个GT 用于计算损失 训练网络 对于上一篇文章 他们首先用one to one label assignment替换了one to many label
  • 生信学习——Linux必做20题(附详细答案解读)

    题目列表 1 在任意文件夹下面创建形如 1 2 3 4 5 6 7 8 9 格式的文件夹系列 2 在创建好的文件夹 home qiime2 Desktop test 1 2 3 4 5 6 7 8 9 下创建文本文件 me txt 3 在文
  • C#中unsafe的使用

    1 unsafe在C 程序中的使用场合 实时应用 采用指针来提高性能 引用非 net DLL提供的如C 编写的外部函数 需要指针来传递该函数 调试 用以检测程序在运行过程中的内存使用状况 2 使用unsafe的利弊 好处是 性能和灵活性提高
  • python 分段拟合 判别_利用Python检验你的策略参数是否过拟合(转)

    过拟合现象 一般来说 量化研究员在优化其交易策略参数时难免会面临这样一个问题 优化过后的策略在样本内表现一般来说均会超过其在样本外的表现 即参数过拟合 对于参数优化来说 由于优化时存在噪音 过拟合是不可避免的现象 然而为了追求策略的稳定性
  • unity期末作业-插针游戏

    unity期末作业 插针游戏 附下载链接 鼠标控制针的发射 圆盘可以显示接住的针数目 若两根针碰到则界面变红 游戏结束 详细情况如下动态图 点我下载 https download csdn net download weixin 43474
  • 从云到「链」,京东云成为中国第四朵云背后

    在产业加速到数实融合加速的今年 云计算不再是云厂商的唯一考校指标 作者 叶子 出品 产业家 京东云再次破圈 信号来自接连发布的几份报告 在国际权威研究机构Forrester发布的名为 The Forrester Wave Public Cl
  • maven官网下载bin.tar.gz和bin.zip以及src.tar.gz和src.zip的区别

    maven官网http maven apache org download cgi 去官网下载的时候不知道选哪个 现在记录一下 首先弄清楚各后缀的含义 1 bin代表二进制class文件 由java文件编译而成 src代表源码 java源码
  • 天池数据竞赛docker提交操作学习

    天池数据竞赛docker提交操作学习 由于最近天池的比赛都要求使用docker来提交结果 所以在此记录一下docker提交到天池的整个流程 目前正在做的 全球人工智能技术创新大赛 热身赛二 比赛链接 https tianchi aliyun
  • 高效计算基础与线性分类器

    七月算法5月深度学习班课程笔记 No 2 1 深度学习与应用 1 图像上的应用 可以根据图片 识别图片的内容 描述图像 模仿人的创造性生成画作 相册自动归类等 2 NLP上的应用 用RNN学习某作家的文笔风格进行写作 学习代码写作等 下图为
  • 使用 gperftools 分析程序cpu性能

    一 gperftools 简介 gperftools 是 google 开源的一组套件 提供了高性能的 支持多线程的 malloc 实现 以及一组优秀的性能分析工具 二 安装 gperftools 2 1 下载源码 从 gperftools
  • DockerCompose的安装以及使用

    docker compose的安装以及使用 docker compose的定义 docker compose是docker容器的单机编排工具 它是一个可以管理多容器的工具 比如可以解决多容器之间的依赖关系 比如启动nginx前端服务的时候会
  • redis使用Jackson2JsonRedisSerializer序列化问题

    一 spring boot 集成Redis方法 依赖
  • /proc/modules分析

    参考 redhat linux deployment guide 5 2 21 proc modules This file displays a list of all modules loaded into the kernel Its
  • Qt5实现与单片机ATS89S51通信

    Qt实现与单片机直接的通信上位机 单片机代码 测试环境 项目目标 实现效果 关键通信类 QSerialport 总结 这是我大二下学期的单片机课设做的一个小项目 实现上位机与下位机之间的通信 测试环境 开发环境 Qt5 96 Mingw32