用C编写51单片机的串口打印程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C编写51单片机的串口打印程序相关的知识,希望对你有一定的参考价值。

哪位大虾给个示例程序供小弟参考参考!

#include "Include/c8051f120.h" // SFR declarations
#include "Include/system.h" // SFR declarations
void UART0_Init (void)

unsigned char T1_PRESCALE;
unsigned char T1_RELOAD;
unsigned long BAUD;

BAUD = 38400;

if ((SYSCLK/BAUD/32/1)<256)

T1_PRESCALE = 0x10;
T1_RELOAD = -((SYSCLK/BAUD/16/1+1)/2);

else if ((SYSCLK/BAUD/32/4)<256)

T1_PRESCALE = 0x01;
T1_RELOAD = -((SYSCLK/BAUD/16/4+1)/2);

else if ((SYSCLK/BAUD/32/12)<256)

T1_PRESCALE = 0x00;
T1_RELOAD = -((SYSCLK/BAUD/16/12+1)/2);

else if ((SYSCLK/BAUD/32/48)<256)

T1_PRESCALE = 0x02;
T1_RELOAD = -((SYSCLK/BAUD/16/48+1)/2);


SFRPAGE = UART0_PAGE;
SCON0 = 0x50; // SCON0: 8-bit variable bit rate
// RX enabled
// SCON0 |= 0xd0; // SCON0: 8-bit variable bit rate
SFRPAGE = TIMER01_PAGE;
CKCON &= ~0x1B; // clear T1M, SCA1, SCA0
CKCON |= T1_PRESCALE; // set T1M, SCA1, SCA0 according to BAUD
TH1 = T1_RELOAD; // reload value calculated from BAUD
TL1 = T1_RELOAD; // also load into TL1
TMOD &= ~0xf0; // clear T1 bits in TMOD
TMOD |= 0x20; // set TMOD for 8 bit reload
TR1 = 1; // START Timer1
//added by edward to test the priority settings of UART0. If this line is here, means good.
IP |= 0x10;
SFRPAGE = UART0_PAGE;
TI0 = 1; // Indicate TX0 ready
ES0 = 1;


void UartRun(void)

unsigned char Receive_userData;

if (RI0)

Receive_userData = SBUF0;

UART0_SEND(Receive_userData);

RI0 = 0;


if (TI0)

TI0 = 0;



void UART0_ISR (void) interrupt 4

_push_(SFRPAGE);
SFRPAGE = UART0_PAGE;

UartRun();

_pop_(SFRPAGE);

这个是串口输入什么就显示什么的例子,如果需要打印的话你可以加入打印的函数print();
UartRun();

放在主函数体里就可以
参考技术A 你需要用串口驱动打印机还是通过串口在PC机屏幕上打印

STC单片机不同数据类型串口打印输出示例程序

STC单片机不同数据类型串口打印输出示例程序


  • 串口监视器打印

程序代码

#include "STC15W4K.H"
#include <stdio.h> 	       // 为使用KEIL自带的库函数printf而加入
void printf_char_int_long(void)

	char a=-100;
	int b=-2000;
	long c=6553600;

	printf ("char %bd  int %d  long %ld\\n",a,b,c); 	       // 10进制输出
	// 输出带符号10进制整数(正数不输出符号)
    // 实际输出:char -100  int -2000 long 6553600 

	printf ("char_0x%bx  int_0x%x  long_0x%lx\\n",a,b,c);   // 16进制输出	
	// 输出无符号16进制整数,x表示按小写输出,X表示按大写输出
    // 实际输出:char_0x9c  int_0xf830 long_0x640000  
	
	printf ("a_int %d\\n",(int)(a)); 	           // 不用宽度标识符
	// 实际输出:a_int -100	

	printf ("char %bd,int %d,long %ld\\n",a,b,c);   // %bd后也可以有其它普通字符
	// 输出带符号10进制整数(正数不输出符号)
    // 实际输出:char -100,int -2000,long 6553600 


void printf_float(void) 		

	float a= 3.14159265798932;
	float  f = 10.0,g = 22.95;

	printf("Max is %f\\n",a);    // Max is 3.141593,	默认小数点后6位
	printf("%.4f\\n",a);	 		// 3.1416
	printf("%.12f\\n",a);	    // 3.140593000000
	//%.4f 表示按小数点后4 位数据输出,%.12f表示按小数点后12位数据输出
	
	printf ("%f , %g\\n", f, g);	  //输出:10.000000 , 22.95 
 

void printf_String(void) 

	char buf [] = "Test String";
	char *p = buf;
	printf ("String %s is at address %p\\n",buf,p);
   //输出:String Test String is at address i:0022    
 	

void UART_init(void)
		  
	//下面代码设置定时器1
	TMOD = 0x20;	// 0010 0000 定时器1工作于方式2(8位自动重装方式)
	TH1  = 0xFD;	// 波特率:9600 /11.0592MHZ
	TL1  = 0xFD;	// 波特率:9600 /11.0592MHZ
	TR1  = 1;
	//下面代码设置定串口
	AUXR = 0x00;             // 很关键,使用定时器1作为波特率发生器,S1ST2=0
	SCON = 0x50; 	// 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接受)
	TI=1;			// 很关键,使用printf函数时必须有此命令
 

void main()
		
	UART_init();	 // 初始化串口
	printf_char_int_long();
	printf_float() ;
	printf_String() ;
	while(1) ;		 // 停在这里

以上是关于用C编写51单片机的串口打印程序的主要内容,如果未能解决你的问题,请参考以下文章

51单片机怎么用串口调试工具打印寄存器的地址和值

我看的是郭天祥老师的51单片机C语言教程,关于“串行口打印在调试程序中的应用”一节中

单片机C8051在Keil C51环境下使用printf函数打印,发现打印值和实际不对应

单片机的串口输入总是中断

求用keilc编写一串口通信程序

基于51单片机的无线测温系统