51单片机使用串口查看程序执行的数据

51单片机使用串口查看程序执行的数据

1.概述

这篇文章介绍利用串口输出程序执行的数据,辅助我们调试程序,提高代码定位问题的效率。

2.硬件电路原理

在这里插入图片描述

3.串口助手查看程序数据

输出串口数据的方式分为CPU查询方式和中断方式。他们各有优缺点,在实际的项目中可以灵活选择。
CPU查询方式:串口收发数据时刻都在占用CPU资源。
中断方式:串口收发数据触发中断,只有发生中断才会使用CPU资源。但是如果中断程序处理时间较长,则会影响正常程序的执行。

3.1.中断方式查看串口数据

1.程序

UART_init中断初始化函数中设置打开了总中断和串口中断,当我们在STC-ISP软件中输入信息时候,就会触发UART_R中断函数,在串口助手中就可以看到输入的信息。

/*********************************************************************************************
程序名:    UART串口中断方式程序实例
编写人:    bruce 
编写时间:  2023年11月27日
硬件支持:  STC12C2052AD 外部12MHZ晶振
接口说明:  连接串口ISP下载线  
修改日志:  NO.1-								
/*********************************************************************************************
说明:
用Windows系统中的“超级终端”软件,将串口端设置 [ 4800,8,无,1,无 ]
或采用STC-ISP软件中的串口助手功能,将串口端设置 [ 4800,8,无,1,无 ]向串口发送数据,单片机将数据发还给PC端并显示。/*********************************************************************************************/#include<STC12C2052AD.H> //51头文件/*********************************************************************************************
函数名:UART串口初始化函数
调  用:UART_init();
参  数:无
返回值:无
结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){//打开和关闭中断,打开时使用中断,关闭时使用CPU查询方式。EA = 1; //允许总中断(如不使用中断,可用//屏蔽)ES = 1; //允许UART串口的中断TMOD = 0x20;	//定时器T/C1工作方式2SCON = 0x50;	//串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xF3;	//定时器初值高8位设置TL1 = 0xF3;	//定时器初值低8位设置PCON = 0x80;	//波特率倍频(屏蔽本句波特率为2400)TR1 = 1;	//定时器启动    
}/*********************************************************************************************
函数名:UART串口接收中断处理函数
调  用:[SBUF收到数据后中断处理]
参  数:无
返回值:无
结  果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
备  注:过长的处理程序会影响后面数据的接收
/**********************************************************************************************/
void UART_R (void) interrupt 4  using 1{ //切换寄存器组到1unsigned char UART_data; //定义串口接收数据变量RI = 0;			//令接收中断标志位为0(软件清零)UART_data = SBUF;	//将接收到的数据送入变量 UART_dataSBUF = UART_data;	//将接收的数据发送回去(删除//即生效)while(TI == 0);	//检查发送中断标志位TI = 0;		//令发送中断标志位为0(软件清零)
}
/*********************************************************************************************
函数名:主函数
调  用:无
参  数:无
返回值:无
结  果:程序开始处,无限循环
备  注:
/**********************************************************************************************/
void main (void){UART_init();while(1){}
}
2.串口助手查看数据

将单片机通过USB链接到电脑,打开STC-ISP软件,将上面的程序烧录到单片机。
烧录程序注意:

1.烧录程序时一定要选择外部晶振,因为我们的电路中给单片机外接了12MHZ晶振。
2.烧录完成后将单片机20引脚的VCC,5V电源断电在上电,这样就切换为外部晶振。
以上两点要注意,否则在串口助手中会出现发送和接收的数据不一致。

点击串口助手设置步骤如下

  • 1.接收缓存区设置HEX模式
  • 2.发送缓存区设置HEX模式
  • 3.串口选择与烧录程序时同一个串口号
  • 4.波特率程序中设置的是4800,因此这里也要设置4800
  • 5.校验位选择无
  • 6.停止位选择1
  • 7.打开串口
  • 8.在发送区域输入内容,点击发送数据
  • 9.在接收区域可查看到发送的数据

在这里插入图片描述

3.2.CPU查询方式查看串口数据

1.程序

UART_init中断初始化函数中去掉中断和串口中断代码,当我们在STC-ISP软件中输入信息时候,CPU就会实时处理,在串口助手中就可以看到输入的信息。

电路原理图和STC-ISP软件操作方法同上面一致。

/*********************************************************************************************
程序名:    UART串口中断方式程序实例
编写人:    bruce 
编写时间:  2023年11月27日
硬件支持:  STC12C2052AD 外部12MHZ晶振
接口说明:  连接串口ISP下载线  
修改日志:  NO.1-								
/*********************************************************************************************
说明:
用Windows系统中的“超级终端”软件,将串口端设置 [ 4800,8,无,1,无 ]
或采用STC-ISP软件中的串口助手功能,将串口端设置 [ 4800,8,无,1,无 ]向串口发送数据,单片机将数据发还给PC端并显示。/*********************************************************************************************/#include<STC12C2052AD.H> //51头文件/*********************************************************************************************
函数名:UART串口初始化函数
调  用:UART_init();
参  数:无
返回值:无
结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){//打开和关闭中断,打开时使用中断,关闭时使用CPU查询方式。//EA = 1; //允许总中断(如不使用中断,可用//屏蔽)//ES = 1; //允许UART串口的中断TMOD = 0x20;	//定时器T/C1工作方式2SCON = 0x50;	//串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xF3;	//定时器初值高8位设置TL1 = 0xF3;	//定时器初值低8位设置PCON = 0x80;	//波特率倍频(屏蔽本句波特率为2400)TR1 = 1;	//定时器启动    
}/*********************************************************************************************
函数名:主函数
调  用:无
参  数:无
返回值:无
结  果:程序开始处,无限循环
备  注:
/**********************************************************************************************/
void main (void){unsigned char UART_data; //定义串口接收数据变量UART_init();while(1){if (RI == 1){		//接收中断标志位为1时UART_data = SBUF;	//接收数据 SBUF 为单片机的接收发送缓冲寄存器RI = 0;			//令接收中断标志位为0(软件清零)SBUF = UART_data;	//将接收的数据发送回去(删除//即生效)while(TI == 0);	//检查发送中断标志位,为1表示在发送数据,0为发送结束。TI = 0;		//令发送中断标志位为0(软件清零)}}
}

3.3.发送字母和中文字符

上面两个实例发送和接收是十六进制(HEX),不能显示字母和汉字,下面介绍发送字母和汉字显示的方式。

1.程序
  • 在代码开始增加了#include <string.h>头文件显示中文和字母
  • UART_T函数用来接收输入的数据,然后在串口助手中输出
/*********************************************************************************************
程序名:    UART串口中断方式程序实例
编写人:    bruce 
编写时间:  2023年11月27日
硬件支持:  STC12C2052AD 外部12MHZ晶振
接口说明:  连接串口ISP下载线  
修改日志:  NO.1-								
/*********************************************************************************************
说明:
用Windows系统中的“超级终端”软件,将串口端设置 [ 4800,8,无,1,无 ]
或采用STC-ISP软件中的串口助手功能,将串口端设置 [ 4800,8,无,1,无 ]向串口发送数据,单片机将数据发还给PC端并显示。/*********************************************************************************************/#include<STC12C2052AD.H> //51头文件
#include <string.h>/*********************************************************************************************
函数名:UART串口初始化函数
调  用:UART_init();
参  数:无
返回值:无
结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){//打开和关闭中断,打开时使用中断,关闭时使用CPU查询方式。//EA = 1; //允许总中断(如不使用中断,可用//屏蔽)//ES = 1; //允许UART串口的中断TMOD = 0x20;	//定时器T/C1工作方式2SCON = 0x50;	//串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xF3;	//定时器初值高8位设置TL1 = 0xF3;	//定时器初值低8位设置PCON = 0x80;	//波特率倍频(屏蔽本句波特率为2400)TR1 = 1;	//定时器启动    
}/*********************************************************************************************
函数名:UART串口发送函数
调  用:UART_T (?);
参  数:需要UART串口发送的数据(8位/1字节)
返回值:无 
结  果:将参数中的数据发送给UART串口,确认发送完成后退出
备  注:
/**********************************************************************************************/
void UART_T (unsigned char UART_data){ //定义串口发送数据变量SBUF = UART_data;	//将接收的数据发送回去while(TI == 0);		//检查发送中断标志位TI = 0;			//令发送中断标志位为0(软件清零)
}/*********************************************************************************************
函数名:UART串口发送字符串函数
调  用:UART_TC (?);
参  数:需要UART串口发送的数据(8位/1字节)
返回值:无 
结  果:向串口发送一个字符串,长度不限。
备  注:例:UART_TC("d9887321$"); 此函数需要#include <string.h>头文件支持。
/**********************************************************************************************/
void UART_TC (unsigned char *str){while(*str != '\0'){UART_T(*str);*str++;}*str = 0;
}
/*********************************************************************************************
函数名:主函数
调  用:无
参  数:无
返回值:无
结  果:程序开始处,无限循环
备  注:
/**********************************************************************************************/
void main (void){unsigned char UART_data;UART_init();while(1){UART_TC("value:");UART_T(0X30+5);}
}
2.串口助手

串口助手查看字符类型数据时,将接收区域设置为文本模式
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/227963.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0-1背包的初始化问题

题目链接 这道题的状态转移方程比较易于确定。dp[i][j]表示能放前i个物品的情况下&#xff0c;容量为j时能放物品的数量&#xff08;这道题歌曲数量对应物品数量&#xff0c;容量对应时间&#xff09;。 技巧&#xff08;收获&#xff09; 二维dp数组可以视情况优化为一维dp数组…

Vue3-目录调整

默认生成的目录结构不满足我们的开发需求&#xff0c;所以这里需要做一些自定义改动。 主要是以下工作&#xff1a; 1.删除一些初始化的默认文件 2.修改剩余代码内容 3.新增调整我们需要的目录结构 在src文件夹下创建两个新文件夹&#xff0c;一个叫api&#xff08;请求模…

经典滑动窗口试题(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、水果成篮1、题目讲解2、讲解算法思路3、代码实现 二、找到字符串中所有字母异位词1、题目…

解析javascript数组方法 find 和 filter 有何区别

首先用一个案例可以很直观的看到 find 和 filter 的区别&#xff1b; 相同点&#xff1a; 两者分别可以接受三个参数&#xff1a;当前元素、当前索引、整个数组&#xff1b;两者都可以用来查找数组中符合条件的元素&#xff1b; 不同点&#xff1a; find&#xff1a; 用于查…

OpenCV数字图像处理——检测出图像中的几何形状并测量出边长、直径、内角

一、简介 在传统的自动化生产尺寸测量中&#xff0c;常用的方法是利用卡尺或千分尺对被测工件的某个参数进行多次测量&#xff0c;并取这些测量值的平均值。然而&#xff0c;这些传统的检测设备或手动测量方法存在着一些问题&#xff1a;测量精度不高、测量速度缓慢&#xff0…

【Python3】【力扣题】367. 有效的完全平方数

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;Python函数。num的平方根 或者 num的0.5次幂。 知识点&#xff1a;float.is_integer(...)&#xff1a;判断浮点数的值是否等于整数。也可以&#xff1a;浮点数.is_integer()。 pow(a,b)&…

排序算法:n个0~1000之间的整数,将他们从大到小排序

上榜理由&#xff1a; 如果没见过这种排序题&#xff0c;可能首先想到的就是常用的排序算法&#xff0c;比如快速排序&#xff0c;归并排序&#xff0c;那如果输入的n足够大&#xff0c;时间复杂度肯定比较高。其实题目0-1000的范围是一个题眼&#xff0c;所以一定有更优的排序…

PAT-10道题

PAT算法刷题 1002 1002 一&#xff1a;对于每一的1到6都进行枚举&#xff0c;进行递归操作 二&#xff1a;如果位数到了指定的n的时候&#xff0c;递归的条件&#xff0c;进行判断是否可以整除操作 #include<iostream> #include<algorithm> using namespace std; l…

没有预装Edge浏览器的Windows系统安装Edge正式版的方法,离线安装和在线安装

一、在线安装 没有预装Edge浏览器的Windows系统安装Edge正式版的方法 二、离线安装 进入到下面这个目录 C:\Program Files (x86)

vue3+ts 全局函数和变量的使用

<template><div>{{ $env }}<br />{{ $filters.format("的飞机") }}</div> </template><script setup lang"ts"> import { getCurrentInstance } from "vue"; const app getCurrentInstance(); console.log…

SELinux(一) 简介

首发公号&#xff1a;Rand_cs 前段时间的工作遇到了一些关于 SELinux 的问题&#xff0c;初次接触不熟悉此概念&#xff0c;导致当时配置策略时束手束脚&#xff0c;焦头烂额&#xff0c;为此去系统的学习了下 SELinux 的东西。聊 SELinux 之前&#xff0c;先来看看什么叫做访…

UE5学习(游戏存档,两种适应性的射线检测,时间膨胀)

游戏存档 0.建立游戏存档类 1.建立存档 命名要用规律&#xff0c;读档时根据命名调用 2.读取存档 这里是用存档时间&#xff08;秒&#xff09;验证是否有存档成功。 两种鼠标位置射线检测方法 两种适用性未使用大量项目验证&#xff0c;为个人观点 1.适用于游戏中 2.适用于…