Qt5实现与单片机ATS89S51通信

news/2024/11/9 10:03:20/

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

  • 测试环境
  • 项目目标
  • 实现效果
  • 关键通信类 QSerialport
  • 总结

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

测试环境

开发环境: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 0000TMOD=0X20;			//设置计数器工作方式2PCON=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.


http://www.ppmy.cn/news/258362.html

相关文章

UCC21755QDWRQ1引脚图TPS92667QPHPRQ1汽车级驱动芯片

UCC21755QDWRQ1汽车栅极驱动器专为SiC mosfet和最高2121Vpk的igbt设计。该器件提供先进的保护功能&#xff0c;一流的动态性能和健壮性。 UCC21755QDWRQ1 具有高达10A的峰值源和汇聚电流。输入端与输出端采用SiO2电容隔离技术隔离&#xff0c;支持高达1.5kVRMS的工作电压&#…

LT9211芯片资料分享

MIPI发射机 符合DCS1.02、D-PHY1.2、DSI1.2和CSI-21.00 1时钟通道和1~4可配置数据通道 两个端口同时显示支持 1.8Gb/s/数据通道 分辨率高达1920x120060Hz或任何其他像素盘小于200MHz 数据通道和极性交换 非突发和突发视频模式支持 支持RGB666&#xff0c;松散RGB666&am…

LT8619C中文简介

1.功能 HDMI/双模式DP输入接口 –符合DVIV1.0和HDMIV1.4 –支持DVI接口,速率可达1.65Gbps –支持HDMI接口,速率可达3.4Gbps ,分辨率可达4K30; –支持8/10/12位(bpc) –支持CEC –支持HDCP解密 –支持芯片EDID –接收器端均衡高达25dB LVDS输出接口 –兼容VESA和JEIDA标…

stc89C51系列单片机介绍

STC89C51 是一款基于 8051 内核的高性价比单片机&#xff0c;由国内的 STC 微电子公司生产。STC89C51 系列单片机的特点是具有高速运行、丰富的外设接口、广泛的应用领域等优点。本文将从以下几个方面介绍 STC89C51 系列单片机。 一、STC89C51 系列单片机概述 STC89C51 系列单…

Appium利用xpath查找同级节点兄弟节点方法

当页面存在两个文件夹&#xff0c;结构相同&#xff0c;只有文件夹名称不同时&#xff0c;想要点击某一个文件夹上的某个控件。这个时候需要使用xpath定位。 1.由父节点定位子节点 driver.findElementByXPath(//XCUIElementTypeCell/XCUIElementTypeStaticText[name"标签…

Numpy、Pandas使用大全与各参数详解

目录 一、numpy 1、属性、方法与操作 &#xff08;1&#xff09;属性 &#xff08;2&#xff09;方法 &#xff08;3&#xff09;操作 2、文件读取与保存 &#xff08;1&#xff09;文件读取 &#xff08;2&#xff09;文件保存 3、矩阵生成 二、Pandas 1、属性与方…

【Java se】为什么大部分小数在计算机中是不精确的

目录 一、什么是小数 二、浮点数在计算机中的转换规则 &#xff08;1&#xff09;整数部分转换步骤 &#xff08;2&#xff09; 小数部分转换步骤 三、使用代码说明 四、手动转换小数 一、什么是小数 在计算机中&#xff0c;也称小数为浮点数&#xff0c;因为在使用科学计…

常见的USB VID

常见的USB VID&#xff1a;&#xff08;遇到再更新&#xff09; 03f0 Hewlett-Packard040a Kodak Co.04b8 Seiko Epson Corp.0eef D-WAV Scientific Co., Ltd1234 附所有VID&#xff1a;&#xff08;来自http://www.linux-usb.org/usb.ids&#xff09; ## List of USB ID…