当前位置: 首页 > article >正文

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工作方式2
	SCON = 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{ //切换寄存器组到1
	unsigned char UART_data; //定义串口接收数据变量
	RI = 0;			//令接收中断标志位为0(软件清零)
	UART_data = SBUF;	//将接收到的数据送入变量 UART_data
		
	SBUF = 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工作方式2
	SCON = 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工作方式2
	SCON = 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.kler.cn/a/149067.html

相关文章:

  • DeBiFormer实战:使用DeBiFormer实现图像分类任务(二)
  • 【秋招笔试-支持在线评测】11.13花子秋招(已改编)-三语言题解
  • 高频 SQL 50 题(基础版)连接部分
  • 【系统设计】数据库压缩技术详解:从基础到实践(附Redis内存优化实战案例)
  • nginx部署H5端程序与PC端进行区分及代理多个项目及H5内页面刷新出现404问题。
  • Linux设置Nginx开机启动
  • 【SpringCloud】为什么选择微服务?
  • linux常见命令合集
  • Linux文件随机抽取N行并取json的某个字段
  • qt实现一个安卓测试小工具
  • PTA-6-48 使用面向对象的思想编写程序描述动物
  • 开题答辩稿
  • ffmpeg 音视频转化
  • Maven——Maven发展历程
  • Java程序连接 nacos集群
  • Taro3+Vue3重构Mpvue小程序项目踩坑记
  • 一台服务器能放多少个网站?
  • 西南科技大学模拟电子技术实验二(二极管特性测试及其应用电路)预习报告
  • (2)(2.1) Lightware SF40/C(360度)
  • 一文搞定XMLHttpRequest,AJAX,Promise,Axios及操作实战
  • 解密Long型数据传递:Spring Boot后台如何避免精度丢失问题
  • 探索亚马逊云科技云存储服务的性能
  • 封装Vue中的axios请求库
  • 【Spark基础】-- RDD 转 Dataframe 的三种方式
  • 231128 刷题日报
  • 【精选】Spring整合MyBatis,Junit 及Spring 事务Spring AOP面向切面详解