这里分享一下我在调试程序时常用的方法(一):串口调试
(这部分代码只是作为调试的一种手段,只在需要测试的地方和不影响MCU和控制芯片通信的地方在使用,不可随意使用,随意使用可能会因为串口传输数据而错过MCU和控制芯片的通信数据而导致通信失败或异常,我就遇到过这样的问题,一定要注意!)
/*################uart.h start ################*/
#ifndef __UART_H__ #define __UART_H__ #include "common.h" /*****************外部接口函数******************/ extern void UartInit(void) ; extern void UartSendChar(UB8 dataCode) ; extern void UartSendString(UB8 *str) ; /**********************************************/ #endif /*__UART_H__*/
/*################uart.h end################*/
/*################uart.c start ################*/
/***************************************************************************
Module :uart.c
Purpose :Implementation of uart module.
Version :0.01 2014/02/03 12:00(OK)
Complier:Keil 8051 C complier V9.01
MCU :STC12C5A60S2
Author :yangrui
QQ :279729201
Email :yangrui90s@163.com
Modification:
=================
2014/03/29 13:48
Reason:
1.修改
void UartSendChar(UB8 dataCode)
{
ES = 0 ;
SBUF = dataCode ;
while( !TI ) ;
TI = 0 ;
ES = 1 ;
}
为:
void UartSendChar(UB8 dataCode)
{
bit previousStatus = ES ;
ES = 0 ;
SBUF = dataCode ;
while( !TI ) ;
TI = 0 ;
ES = previousStatus ;
}
因为在使用本函数,并不知道是否打开了串口中断使能ES,如果直接
像上面那样操作,可能会导致错误。所以安全的做法是,用一个变量
保存ES的初始状态,然后使用轮询法发送完字节数据后,再还原ES的
状态。
=================
***************************************************************************/
#include <reg52.h>
#include "common.h"
#include "uart.h"
/******************************************************
Function :UartInit
Input :N/A
Output :N/A
Return :N/A
Description :11.0592MHZ,9600KPS
Note :注意定时器1的使用,不要产生资源竞争
******************************************************/
void UartInit(void)
{
SCON |= 0x50 ;
PCON = 0x00 ;
TMOD |= 0x20 ;
TH1 = 0xfd ; /*11.0592MHZ,9600kps*/
TL1 = 0xfd ;
TR1 = 1 ;
ES = 1;
EA = 1 ;
}
/******************************************************
Function :UartSendChar
Input :byte-data
Output :N/A
Return :N/A
Description :串口发送字节数据
Note :这里借助于变量previousStatus先来记住ES的值,
然后使用轮询法发送字节数据后,再将ES还原到之
前的状态,这里的previousStatus是非常有必要的。
******************************************************/
void UartSendChar(UB8 dataCode)
{
bit previousStatus = ES ;
ES = 0 ;
SBUF = dataCode ;
while( !TI ) ;
TI = 0 ;
ES = previousStatus ;
}
/******************************************************
Function :UartSendString
Input :string-data
Output :N/A
Return :N/A
Description :串口发送字符串数据
Note :N/A
******************************************************/
void UartSendString(UB8 *str)
{
while(*str)
{
UartSendChar(*str++) ;
}
}
/******************************************************
Function :UartISR
Input :N/A
Output :N/A
Return :N/A
Description :串口中断服务程序
Note :N/A
******************************************************/
void UartISR(void) interrupt 4
{
if(TI)
{
TI = 0 ;
}
if(RI)
{
RI = 0 ;
/*其他操作,等待补充*/
}
}
/*################uart.c end################*/
补充:common.h
#ifndef __COMMON_H__ #define __COMMON_H__ typedef unsigned char UB8 ; typedef unsigned short int UW16 ; typedef unsigned long UL32 ; typedef char SB8; typedef short int SW16 ; typedef long SL32 ; #define HIGH_LEVEL 1 #define LOW_LEVEL 0 #endif /*__COMMON_H__*/
单片机程序协助调试方法(一)串口调试(持续更新中),布布扣,bubuko.com
原文:http://blog.csdn.net/yagnruinihao/article/details/22662145