51 マイクロコントローラーはシリアル ポートを使用してプログラム実行のデータを表示します
1。概要
この記事では、プログラムのデバッグを支援し、コードの問題を特定する効率を向上させるために、シリアル ポートを使用してプログラム実行データを出力する方法を紹介します。
2.ハードウェア回路原理
3. プログラムデータを表示するためのシリアルポートアシスタント
シリアルポートのデータ出力方式はCPUクエリ方式と割り込み方式に分かれます。それぞれに長所と短所があり、実際のプロジェクトでは柔軟に選択できます。
CPU クエリ方式: シリアル ポートは常にデータを送受信し、CPU リソースを占有します。
割り込みモード: シリアル ポートによるデータの送受信により割り込みがトリガーされ、CPU リソースは割り込みが発生した場合にのみ使用されます。ただし、割り込みプログラムの処理時間が長い場合、通常のプログラムの実行に影響を与えます。
3.1. 割り込みモードでのシリアルポートデータの表示
1.手順
割り込み初期化機能ではトータル割り込みとシリアルポート割り込みをONに設定しており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 電源をオフにしてからオンにし、外部水晶発振器に切り替えます。
上記 2 点に注意してください。そうしないと、シリアル ポート アシスタントで送受信されるデータが不整合になります。
クリックして串口助手
次のようにステップを設定します
- 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ソフトウェア上で入力情報を確認することができます。
回路図および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.手紙や漢字を送る
上記 2 つの例は 16 進数 (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. シリアルポートアシスタント
シリアル ポート アシスタントが文字型データを表示するときは、受信領域を次のように設定します。文本模式