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

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、实验效果

 

您好!对于51单片机串口打印电机调速的问题,我可以为您提供一些基本的思路和步骤。首先,您需要明确使用的是哪种型号的51单片机,以及电机的类型和控制方式(比如直流电机、步进电机等)。 下面是一个基本的步骤: 1. 连接电机:将电机与51单片机进行连接。如果是直流电机,您可以使用H桥驱动电路来控制电机的转速和方向。如果是步进电机,您可以使用步进电机驱动模块来控制电机的步进角度和转速。 2. 初始化串口:在单片机上初始化串口通信,设置波特率和其他参数。您可以使用UART通信模块进行串口通信。 3. 编写程序:根据您的需求,编写相应的程序来控制电机的转速。您可以通过串口接收PC端发送的指令,然后根据接收到的指令来调整电机的转速。 4. 数据处理:在单片机上接收PC端发送的指令,解析指令并根据指令来调整电机的转速。您可以使用串口中断或者轮询的方式来接收和处理数据。 5. 控制电机:根据接收到的指令,使用合适的控制算法来调整电机的转速。您可以使用PWM信号来控制直流电机的转速,或者使用适当的步进电机驱动方式来控制步进电机的步进角度和转速。 需要注意的是,以上只是一个基本的框架,具体的实现方式还需要根据您的具体需求和硬件环境来进行调整。希望这些信息对您有所帮助!如果您有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值