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单片机,其余型号的单片机可能需要稍作修改。