qt跟51单片机使用串口通信点亮8个LED灯

一、51的硬件代码,使用keil5软件编写

//main.c
#include <REGX52.H>
#include "Uart.h"

int main()
{
	UART_Init();
	while(1)
	{
	}

	return 0;
}

void UART_Routine() interrupt 4
{
	if(RI == 1)
	{
		//当接收到数据的时候,让控制led的P2端口等于串口数据缓冲寄存器中的值,从而实现串口控制led灯
		P2 = SBUF; //LED点亮
		
		UART_SendByte(SBUF);//将接收到的数据发送给串口
		
		RI = 0; //软件复位
	}
}
//Uart.h
#ifndef __UART_H__
#define __UART_H__

void UART_Init();
void UART_SendByte(unsigned char Byte);

#endif
//Uart.c
#include <REGX52.H>

void UART_Init()
{
	/**串口寄存器配置**/
	SCON = 0x50; //初始化串行口控制寄存器,REN位为1
	PCON |= 0x80;		//使能波特率倍速位SMOD
	/**定时器寄存器配置**/
	TMOD &= 0x0f; //这段代表TMOD低四位保持不变,高四位清0
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xf4;		//设定定时初值
	TH1 = 0xf4;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
  TR1 = 1;		//启动定时器1
 
  EA=1; //启动所有中断
	ES=1; //启动串口中断
}

void UART_SendByte(unsigned char Byte)
{
	SBUF = Byte; //将数据写入串口数据缓存寄存器
	while(TI == 0); //等待TI置1,即发送完成前一直等待,TI=1即为发送完成
	TI = 0; //发送完成后,需要软件复位
}



二、QT界面

接收框和发送框需要注意一下其他都一样就行

三、QT配置和代码

按钮控件的使用直接右键选择转到槽就很方便
//widget.cpp
//按钮控件的使用直接右键选择转到槽就很方便

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QSerialPortInfo>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{ 
    ui->setupUi(this);

    QStringList seriaPortNameList;

    connect(serialPort,SIGNAL(readyRead()),this,SLOT(on_serialPort_readyRead()));

    //自动查找串口
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        seriaPortNameList<<info.portName();
    }
    ui->comboBox_Serial->addItems(seriaPortNameList);
}

Widget::~Widget()
{
    delete ui;
}

//打开串口
void Widget::on_pushButton_Open_clicked()
{
    QSerialPort::BaudRate baudRate;
    QSerialPort::DataBits dataBits;
    QSerialPort::StopBits stopBits;
    QSerialPort::Parity checkBits;

    if(ui->comboBox_Baudrate->currentText()=="4800")
    {
        baudRate = QSerialPort::Baud4800;
    }else if(ui->comboBox_Baudrate->currentText()=="115200")
    {
        baudRate = QSerialPort::Baud115200;
    }
    else if(ui->comboBox_Baudrate->currentText()=="9600")
    {
        baudRate = QSerialPort::Baud9600;
    }

    if(ui->comboBox_Data->currentText()=="8")
    {
        dataBits = QSerialPort::Data8;
    }
    if(ui->comboBox_Data->currentText()=="5")
    {
        dataBits = QSerialPort::Data5;
    }

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

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

    serialPort->setPortName(ui->comboBox_Serial->currentText());
    serialPort->setBaudRate(baudRate);
    serialPort->setDataBits(dataBits);
    serialPort->setStopBits(stopBits);
    serialPort->setParity(checkBits);

    if(serialPort->open(QIODevice::ReadWrite)==true)
    {
        QMessageBox::information(this,"提示","成功");
    }else
    {
        QMessageBox::information(this,"提示","失败");
    }
}

//关闭串口
void Widget::on_pushButton_Close_clicked()
{
    serialPort->close();
}


//接收数据
void Widget::on_serialPort_readyRead()
{
    //用十六进制接收数据
    QByteArray recvBuf = serialPort->readAll();

    //将十六进制转换为字符串需要显示在界面上
    QString recvStr = recvBuf.toHex().toUpper();//.data();


    //添加空格,方便查看
    QString str2;
    for(int i = 0; i<recvStr.length(); i+=2)
    {
        str2 += recvStr.mid (i,2);
        str2 += " ";
    }

    //字符串小写转换为大写
//    str2.toUpper();
//    qDebug() << "str2 = 小写转大写=" <<str2 << endl;
    //挨着每一行显示数据
    ui->plainTextEdit_recve->insertPlainText(str2);
}

//发送数据
void Widget::on_pushButton_Send_clicked()
{
    //发送数据获取textEid框内的数据并转换为十六进制发送
    QString msg = ui->textEdit_send->toPlainText();
    QByteArray hexStr = QByteArray::fromHex(msg.toLatin1());

    //通过串口类把数据发送出去
    serialPort->write(hexStr);


    qDebug() << hexStr <<endl;

}

//清空接收到的数据
void Widget::on_pushButton_clear_clicked()
{
    ui->plainTextEdit_recve->clear();
}

四、运行效果

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,您需要将QT串口通信库添加到您的QT项目中。然后,您需要配置串口参数,例如波特率、数据位、停止位和校验位。接下来,您可以使用串口发送指令来控制单片机上的LED。 在单片机端,您需要编写一个程序来接收串口指令并控制LED。您可以使用单片机的UART串口模块来接收指令,并使用输出端口来控制LED的开关。 下面是一个简单的示例代码,可以在QT端发送指令来控制单片机上的LEDQT端代码: ```c++ QSerialPort serial; serial.setPortName("COM1"); serial.setBaudRate(QSerialPort::Baud9600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.open(QIODevice::ReadWrite); // 发送控制指令 char cmd[] = {0x01}; // 控制LED亮 serial.write(cmd, sizeof(cmd)); ``` 单片机端代码: ```c #include <reg52.h> sbit LED = P0^0; // LED连接的输出端口 void main() { unsigned char cmd; TMOD = 0x20; // 定时器1工作在模式2,8位自动重载 TH1 = 0xFD; // 波特率9600,定时器1初值 SCON = 0x50; // 串口工作在模式1,8位数据,无校验位,1位停止位 TR1 = 1; // 启动定时器1 TI = 1; // 发送允许位置1 while(1) { if(RI) // 接收到一个字符 { cmd = SBUF; // 读取接收到的字符 RI = 0; // 清除接收中断标志 if(cmd == 0x01) // 控制LED亮 { LED = 1; } else if(cmd == 0x02) // 控制LED灭 { LED = 0; } } } } ``` 上述代码仅作为示例,实际项目中需要根据具体情况进行修改和完善。同时,需要注意串口通信的稳定性和可靠性,避免数据丢失或错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值