不知道各位刚入门51单片机的朋友们是不是和我一样,不清楚在工程中定义的变量值的变化是否和自己想的一致,刚学C语言的时候我们都能利用printf函数检查代码的运行情况,今天,我来介绍C51单片机如何使用printf函数,从而实现调试。
思路:将打印结果显示在串口助手上。
main函数代码如下:
#include <REGX51.H>
#include <delay.h>
#include <stdio.h>
void Uart_SendChar(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
char putchar(char c)//重定向
{
Uart_SendChar(c);
return c;
}
void UART_init() //设置串行通信 本晶振为11.0592MHZ,其他的就自己算一下应该设置多少
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd; //波特率9600
SM0 = 0;
SM1 = 1; // 串口工作方式1 10位异步
REN = 1; //串口允许接收
TR1 = 1;
EA = 1;
ES =1 ; //串口中断
}
void main()
{
UART_init();
while(1)
{
printf("hello world");
Delay(2000);
}
}
代码解析:
串口初始化,实现单片机与PC端的通信。
void UART_init() //设置串行通信 本晶振为11.0592MHZ
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd; //波特率9600
SM0 = 0;
SM1 = 1; // 串口工作方式1 10位异步
REN = 1; //串口允许接收
TR1 = 1;
EA = 1;
ES =1 ; //串口中断
}
头文件<stdio.h>用于使用printf()函数。
头文件<delay.h>进行延时,代码可在生成器中自主生成,如下图:

在C语言中putchar函数只能输出单个字符,而printf函数可输出多个字符以及各种类型的数据;printf()函数在格式化输出的时候调用了putchar()函数,在头文件stdio.h中两个函数都有,我们需修改putchar函数,用SBUF接收输入的数据,则可传到PC端。以下两函数实现:
void Uart_SendChar(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
char putchar(char c)//重定向
{
Uart_SendChar(c);
return c;
}
结果:

存在的疑问:
我想比如发送int m=15;printf("%d",m);此时m为整型,难道格式化输出的时候也用到putchar函数了吗?类型不一样也可以吗?经过实验,数据15可打印。
如果有朋友知道,非常期待您的解答。
掌握了此方法后,我们只需要利用一个串口调试器就可以打印数据,进而调试代码了。
文章如有不对的地方,期待您的指正。