IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 51单片机通过串口打印调试信息。 -> 正文阅读

[嵌入式]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、实验效果
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 12:04:50  更:2021-09-03 12:05:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:41:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码