1、实验目的
有时候单片机程序运行的时候我们不知道当前程序行某个变量的数据是多少,我们想像学习C语言的时候,打印出来信息,比如变量的值等等。这里就是起到这个调试作用。但是,要注意变量范围。是全局变量,还是局部变量等。如果用模块化编程,串口在其他文件中,还需要进行代码的引用等。
2、实验原理和步骤
.2.1原理
利用stc89C52的单片机的串口发送数据到电脑的串口助手中,打印出来信息;这里如果换没学到串口的知识,那么可以跳过,或者简单学习下串口的知识。直接调用一个函数就行,这个函数是利用51单片机的定时器,产生串口的波特率;51单片机的定时器一般用定时器1或者定时器2;如果你项目中用了定时器1,那就不能定时器1产生波特率了。根据实际情况而定。我这里假如你其他地方没用用到定时器1,那么我就用定时器1产生9600的波特率。什么是波特率,就是A和B通信的速度。单片机和电脑进行通信。所以要约定一些东西。这里约定了对话的速度,等等。
2.2步骤
一、接线;
这里就是你下载的线和电脑接上就行了。一般51单片机就是通过串口下载程序的。接上线之后。
打开stc-ISP下载软件。看到串口号。
二、编程。
1.在编程的时候,这里用了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.如果你用定时器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;
}
3.主函数调用串口初始化函数,在头文件上面,添加一个stdio.h函数:
#include <stdio.h> // 为使用KEIL自带的库函数printf而加入
4.如果你按照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
5.全部代码。主函数的全部代码:
代码:
#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、实验效果