51单片机通过串口打印调试信息。

1、实验目的
有时候单片机程序运行的时候我们不知道当前程序行某个变量的数据是多少,我们想像学习C语言的时候,打印出来信息,比如变量的值等等。
这里就是起到这个调试作用。
但是,要注意变量范围。是全局变量,还是局部变量等。
如果用模块化编程,串口在其他文件中,还需要进行代码的引用等。

2、实验原理和步骤

.2.1原理
利用stc89C52的单片机的串口发送数据到电脑的串口助手中,打印出来信息;
这里如果换没学到串口的知识,那么可以跳过,或者简单学习下串口的知识。

直接调用一个函数就行,这个函数是利用51单片机的定时器,产生串口的波特率;
51单片机的定时器一般用定时器1或者定时器2

如果你项目中用了定时器1,那就不能定时器1产生波特率了。根据实际情况而定。

我这里假如你其他地方没用用到定时器1,那么我就用定时器1产生9600的波特率。

什么是波特率,就是A和B通信的速度。单片机和电脑进行通信。所以要约定一些东西。这里约定了对话的速度,等等。

2.2步骤
一、。接线;
这里就是你下载的线和电脑接上就行了。
一般51单片机就是通过串口下载程序的。
接上线之后。
打开stc-ISP下载软件。看到串口号。
在这里插入图片描述
二、编程。
在编程的时候。
这里用了51单片机的定时器1做为波特率发生器。所以其他地方不能用定时器1
如果其他地方用定时器1.那么就改成定时器2作为波特率产生器,也一样。波特率9600

void UART_init(void)
{		  

 	SCON=0x50;	    //串口选择模式1, 8-bit UART, 使能接收    
  TMOD|=0x20;     //用定时器1设置波特率
  TH1=0xFD;     
  TR1=1;           
	TI=1; 			//开启串口中断
} 

如果你用定时器2产生波特率,将上面的代码改为

#define FOSC 11059200L      //System frequency
#define BAUD 9600       //UART baudrate
//定时器2作为波特率发生器。调试的时候用。
void UART_init(void)
{		  
  TL2 = RCAP2L=(65536-(FOSC/32/BAUD));//9600波特率对应 FFD9,低位为D9(65536-26)%256
   TH2 = RCAP2H=(65536-(FOSC/32/BAUD)) >> 8;//高位为FF(65536-26)/256
   T2CON=0x34;//RCLK、TCLK、TR2置1
   SCON=0x50;//串口工作模式1,接收使能
   TI=1;
   
} 

主函数调用串口初始化函数。
在头文件上面。添加一个

#include <stdio.h> 	       // 为使用KEIL自带的库函数printf而加入

如果你按照C51软件的时候,不对。出错,新建一个stdio.h文件,然后添加这个文件stdio到工程目录中,

stdio.h

/*--------------------------------------------------------------------------
STDIO.H

Prototypes for standard I/O functions.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __STDIO_H__
#define __STDIO_H__

#ifndef EOF
 #define EOF -1
#endif

#ifndef NULL
 #define NULL ((void *) 0)
#endif

#ifndef _SIZE_T
 #define _SIZE_T
 typedef unsigned int size_t;
#endif

#pragma SAVE
#pragma REGPARMS
extern char _getkey (void);
extern char getchar (void);
extern char ungetchar (char);
extern char putchar (char);
extern int printf   (const char *, ...);
extern int sprintf  (char *, const char *, ...);
extern int vprintf  (const char *, char *);
extern int vsprintf (char *, const char *, char *);
extern char *gets (char *, int n);
extern int scanf (const char *, ...);
extern int sscanf (char *, const char *, ...);
extern int puts (const char *);

#pragma RESTORE

#endif


全部代码。主函数的全部代码。

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

#define FOSC 11059200L      //System frequency
#define BAUD 9600       //UART baudrate

void UART_init(void);
void printf_char_int_long(void);
void printf_float(void); 		
void printf_String(void);

void main()
{		
	unsigned char data0=0x10;
	TI=0;
	UART_init();	 // 初始化串口
	printf_char_int_long();
	printf_float() ;
	printf_String() ;
	
	printf ("chardata0= %bd \n",data0); 	       // char进制输出
 	printf ("chardata0=0x%bx\n",data0);   // 16进制输出	
	while(1) ;		 // 停在这里
}

定时器1作为波特率发生器。调试的时候用。
// void UART_init(void)
// {		  

//  	SCON=0x50;	    //串口选择模式1, 8-bit UART, 使能接收    
//   TMOD|=0x20;     //用定时器1设置波特率
//   TH1=0xFD;     
//   TR1=1;           
// 	TI=1; 			//开启串口中断
// } 

//定时器2作为波特率发生器。调试的时候用。
void UART_init(void)
{		  

	 TL2 = RCAP2L=(65536-(FOSC/32/BAUD));//9600波特率对应 FFD9,低位为D9(65536-26)%256
   TH2 = RCAP2H=(65536-(FOSC/32/BAUD)) >> 8;//高位为FF(65536-26)/256
   T2CON=0x34;//RCLK、TCLK、TR2置1
   SCON=0x50;//串口工作模式1,接收使能
   TI=1;
   
} 
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 Uart0_Ist() interrupt 4 //中断函数

{
       if(RI)

    {
        RI= 0;

        //Do whatever you want;

    }

       if(TI)

    {
        TI = 0;

        //Do whatever you want;

    }

}

编译,下载到单片机中。

打开串口助手。设置波特率9600.选择串口号。就是下载的时候那个串口号。
在这里插入图片描述

3、实验效果
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值