单片机利用串口打印变量进行快速调试(附代码)

1/代码部分

serve.h

#ifndef __SERVE_H__
#define __SERVE_H__

/*
datatype
*/

typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
typedef unsigned long uint32_t;

typedef signed char int8_t;
typedef signed int int16_t;
typedef signed long int32_t;

typedef float fp32;

typedef unsigned char bool_t;

/*
funtion:delay
explanation:
    model:stc89
	crystal frequency:11.0592MHz
*/

extern void delay_ms(uint32_t ms);

/*
funtion:for quick debugging
explanation:
		bps:9600
		timer1:mode2
		UART:mode1
		switch:#define _DEBUG_(before #include"serve.h")
		remember to use uart_init before!
*/

#ifdef _DEBUG_

#include<stdio.h>
#include<reg52.h>

#define debug_d8(x)                                      \
        do{                                              \
					    TI = 1;                          \
					    printf("%s\n", __FILE__);        \
              printf("%s\n", __DATE__);                  \
              printf("%s\n", __TIME__);                  \
					    printf("%s = %bd\n\n", #x, x);   \
					    while(!TI);                      \
							TI = 0;                      \
          }while(0U)
#define debug_d16(x)                                     \
        do{                                              \  
					    TI = 1;                          \
					    printf("%s\n", __FILE__);        \
              printf("%s\n", __DATE__);                  \
              printf("%s\n", __TIME__);                  \
					    printf("%s = %d\n\n", #x, x);    \
					    while(!TI);                      \
					    TI = 0;                          \
          }while(0U)
#define debug_d32(x)                                     \
				do{                                      \
					    TI = 1;                          \
					    printf("%s\n", __FILE__);        \
              printf("%s\n", __DATE__);                  \
              printf("%s\n", __TIME__);                  \
					    printf("%s = %ld\n\n", #x, x);   \
					    while(!TI);                      \
					    TI = 0;                          \
          }while(0U)
#define debug_f32(x)                                     \
				do{                                      \
					    TI = 1;                          \
					    printf("%s\n", __FILE__);        \
              printf("%s\n", __DATE__);                  \
              printf("%s\n", __TIME__);                  \
					    printf("%s = %f\n\n", #x, x);    \
					    while(!TI);                      \
					    TI = 0;                          \
          }while(0U)

#else
					
#define debug_d8(x) 
#define debug_d16(x)
#define debug_d32(x)
#define debug_f32(x)
			
#endif		
/*
explanation:
        crystal frequency:11.0592MHz
        bps:9600
	    timer1:mode2
	    UART:mode1
*/

extern void uart_init(void);

#endif

serve.c

void uart_init(void)
{
		TMOD = 0x20;    
		TH1 = 0xfd;     
		TL1 = 0xfd;     
		TR1 = 1;       
		REN = 1;       
		SM0 = 0;      
		SM1 = 1;       
		EA = 1;         					
		ES = 1;        
}

void delay_ms(uint32_t ms)
{
	  uint32_t i,j;
      for( i = ms; i > 0; i--)
	  {
	      for( j = 110; j > 0; j--);
	  }
}

main.c(demo)

#define _DEBUG_
#include<reg52.h>
#include"serve.h"

int main(void)
{
      uint8_t a = 1;
	  uint16_t b = 2;
	  uint32_t c = 3;
	  fp32 d = 4.5;
	  uart_init();
	  while(1)
		{
		      debug_d8(a);
			  debug_d16(b);
			  debug_d32(c);
			  debug_f32(d);
			  delay_ms(500);
		}
}

2/效果展示

在这里插入图片描述

3/解释说明

1.单片机中的很多函数和我们标准c语言中的函数都略有不同,我们可以去keil的帮助区中搜索某个函数的用法,很方便。

2.作者是采用宏定义的方式实现打印变量,之所以这样做,是为了方便考虑。在程序中我们想要查看变量值的地方,只需要调用debug函数就可以了,而宏定义开关的优点就是,当我们不想调试时只需要把程序第一行的#define _DEBUG_注释掉即可,而不需要跑到程序里,把所有debug函数删掉。

3.但是串口初始化的函数作者并没有使用宏定义,那是因为不少功能都需要串口的初始化,如果我们都写进宏定义里面,显然会造成重复定义。我们只需要把串口初始化的实现放到源文件中,然后在头文件中声明该函数,这样我们想要初始化串口只需要在主函数中调用该函数即可。

4.我串口初始化的各种参数都在头文件的注释中。作者采用的是stc89c52单片机,其余型号的单片机可能需要稍作修改。

发布了10 篇原创文章 · 获赞 0 · 访问量 2058

猜你喜欢

转载自blog.csdn.net/weixin_45467056/article/details/104096306