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;
TMOD|=0x20;
TH1=0xFD;
TR1=1;
TI=1;
}
如果你用定时器2产生波特率,将上面的代码改为
#define FOSC 11059200L
#define BAUD 9600
void UART_init(void)
{
TL2 = RCAP2L=(65536-(FOSC/32/BAUD));
TH2 = RCAP2H=(65536-(FOSC/32/BAUD)) >> 8;
T2CON=0x34;
SCON=0x50;
TI=1;
}
主函数调用串口初始化函数。 在头文件上面。添加一个
#include <stdio.h>
如果你按照C51软件的时候,不对。出错,新建一个stdio.h文件,然后添加这个文件stdio到工程目录中,
stdio.h
#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>
#define FOSC 11059200L
#define BAUD 9600
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);
printf ("chardata0=0x%bx\n",data0);
while(1) ;
}
void UART_init(void)
{
TL2 = RCAP2L=(65536-(FOSC/32/BAUD));
TH2 = RCAP2H=(65536-(FOSC/32/BAUD)) >> 8;
T2CON=0x34;
SCON=0x50;
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);
printf ("char_0x%bx int_0x%x long_0x%lx\n",a,b,c);
printf ("a_int %d\n",(int)(a));
printf ("char %bd,int %d,long %ld\n",a,b,c);
}
void printf_float(void)
{
float a= 3.14159265798932;
float f = 10.0,g = 22.95;
printf("Max is %f\n",a);
printf("%.4f\n",a);
printf("%.12f\n",a);
printf ("%f , %g\n", f, g);
}
void printf_String(void)
{
char buf [] = "Test String";
char *p = buf;
printf ("String %s is at address %p\n",buf,p);
}
void Uart0_Ist() interrupt 4
{
if(RI)
{
RI= 0;
}
if(TI)
{
TI = 0;
}
}
编译,下载到单片机中。
打开串口助手。设置波特率9600.选择串口号。就是下载的时候那个串口号。
3、实验效果
|