51单片机-串口printf系列函数

发布者:WhisperingWave最新更新时间:2021-10-14 来源: eefocus关键字:51单片机  串口 手机看文章 扫描二维码
随时随地手机看文章

1.printf系列的函数实现


懂得了单片机通过串口传输数据给电脑端窗口查看,那么,有时我们需要发送字符串,有时需要发送一个变量的数值是多少,以及还要发送回车换行这三种情况。所以我们把这三个功能函数封装起来,方便后续的串口使用。


首先笔者写的“void printf_str(u8 *str)”函数就是专门用来发送字符串给电脑端的。


其次“void printf_num(u32 num)”发送的变量的数值只支持显示十进制数0~4294967295,也就是参数是u32类型。


最后“void printf_rn()”就是发送回车换行符了。


关于这三部分的代码大家可以尝试去阅读一下是怎么实现的,如果有很多地方看不懂那么可以不用深究,往下学,笔者会在后面的知识点中讲解其中的运用。


我们希望串口这部分功能模块也能像定时器那样封装一个单独文件来使用。


所以创建好“uart.c”和“uart.h”文件,复制以下代码


2.uart.c的代码


#include

#include //详见第六章第8讲

   

void ConfigUART(u16 baud)

{

    SCON  = 0x50;  //配置串口为模式1

    TMOD &= 0x0F;  //清零T1的控制位

    TMOD |= 0x20;  //配置T1为模式2

    TH1 = 256 - (11059200/12/32)/baud;//计算T1重载值

    TL1 = TH1;     //初值等于重载值

    ET1 = 0;       //禁止T1中断

    ES  = 1;       //使能串口中断

    TR1 = 1;       //启动T1

    

void printf_str(u8 *str)

    while(*str != '')//连续发送字符串数据,直到检测到结束符

    {

        SBUF=*str++;

        while(!TI);    //等待字节发送完成TI被置1就退出这个while循环

        TI = 0;        //清0标志位

    }  

}

   

void printf_num(u32 num)

{

    u8 buf[10];

    char i;//取值范围为-128~127

    

    for (i=0; i<10; i++)       //把长整型数转换为10位十进制的数组

    {

        buf[i] = num % 10;

        num = num / 10;        //舍掉个位数,重新装载

    }

    

    for (i=9; i>=1; i--)  

    {

        if (buf[i] != 0)break; //从最高位起,遇到0不理会,遇到非0则退出循环

    }

    

    while(i>=0)          //剩余低位都如实发送出去

    {   

        SBUF='0'+buf[i]; //如果此时的buf[i]的值是1,那么电脑端窗口在“字符格式”模式下要想显示字符“1”,只需'0'+1,因为‘0’就是ASCII码值48

        while(!TI);      //等待字节发送完成TI被置1就退出这个while循环

        TI = 0;          //清0标志位

        i--;   

    }

}

   

void printf_rn() //发送回车换行符

{

    SBUF='r';

    while(!TI);  //等待字节发送完成TI被置1就退出这个while循环

    TI = 0;      //清0标志位

    

    SBUF='n';

    while(!TI);  //等待字节发送完成TI被置1就退出这个while循环

    TI = 0;      //清0标志位

}


3.uart.h的代码


#ifndef __UART_H__

#define __UART_H__

   

void ConfigUART(u16 baud);

void printf_str(u8 *str);//发送字符串

void printf_num(u32 num);//发送参数的数值

void printf_rn();        //发送回车换行符

   

#endif


4.main.c的代码


#include  

#include //详见第六章第8讲

#include

 

void main()

{  

    u8 key;

    u32 value=65535;

    LED_Init();//初始化LED硬件模块

    KEY_Init();//初始化按键模块

    EA = 1;    //闭合总中断开关

    ConfigUART(9600);

   

    while(1)

    {  

        key=KEY_Scan(0,1000);

        if(key==4)

        {

            printf_str("value=");//发送字符串

            printf_num(value);   //发送变量的数值

            printf_rn();         //发送回车换行符

            value++;

        }

    } 

}

  

void InterruptUART() interrupt 4

{

    if (RI)    //接收到字节

    {

        RI = 0;//手动清零接收中断标志位                     

    }

}


在串口中断函数中我们没有再写“if(TI){ TI = 0; }”,那是因为我们在所有的发送函数中都做了TI的清0处理,所以可以在串口中断函数中不用再书写TI。


大家别忘了创建好“uart.c”和“uart.h”之后要添加到工程文件中

10.9.png


打开串口,选择“字符格式显示”模式,不断按K4,不停打印出如下内容

10.10.png

关键字:51单片机  串口 引用地址:51单片机-串口printf系列函数

上一篇:51单片机-详细理解ASCII码
下一篇:51单片机-液晶屏代码讲解

推荐阅读最新更新时间:2024-11-10 09:55

单片机之串口数据处理
随着硬件系统的模块化发展,很多电子产品都做出模块并采用串口进行数据通信。例如:GPRS模块、GPS模块、语音模块、热敏微型打印机、串口摄像头等等。在与这些模块进行数据通信都离不开串口,而对于串口的操作,由于串口本身没有标准的通信协议,所以很难做到非常统一的操作过程。一般来说,不同的模块其有着特殊的通信协议,我们只能根据其协议进行数据解码。 虽然说串口没有标准协议,但是我们却可以把它们的相似部分提取出来,做成模块化的程序,方便代码的移植和理解。下面我们简单谈到串口数据的处理方法。。。。。 串口数据处理流程: 一般来说,串口数据的接收都是采用中断方式,中断中只复制把串口发送的数据放入数据缓冲区中。而
[单片机]
单片机之<font color='red'>串口</font>数据处理
8051单片机的复位状态
  复位就是指通过某种手段使单片机内部某些资源一种固定的初始状态,以确保单片机每次复位后都能在某一固定的环境中从某一固定的入口地址处开始运行,8051复位后片内各特殊功能寄存器状态如下:   PC内容为0000H,使单片机从起始地址0000H开始执行程序。所以单片机运行出错或进入死循环,可以按复位键重启。   ACC内容为00H。   PSW内容为00H,意义为复位后,上次运算没有产生进位或借位,也没有产生半进位或半借位,工作寄存器组R0—R7定位在内部RAM的00-07单元,上次运算没有溢出,累加器中“1”的个数为偶数。   SP内容为07H,意义为堆栈指针SP指向内部数据存储器的07单元,即堆栈从08单元开始。   DPT
[单片机]
80<font color='red'>51单片机</font>的复位状态
MSP430串口接收程序(使用中断)
使用接收中断,将接收到的字符再发送出去。每次接收到字符之后都会退出低功耗模式,从而在主函数中将接收到的字符再发送出去。 /********************************************** *程序描述:单片机的P3.4、P3.5作为串口接收字符,将接受到的字符再发送出去 *作者 :Zhenhua Liu *时间 :2017.11.02 18:00 ***********************************************/ #include msp430x14x.h void usartInit(void); //串口初始化 void main(v
[单片机]
STM32串口接收数据卡死问题解决办法
在使用STM32串口时,有时候串口接受一段时间数据之后便会卡死不在进入中断接收数据。原因是串口中断标志没有清除,导致终端锁死,此时需要判断对应的标志位,重新启动中断。 if((huart1.Instance- CR1 & 0x20)==0) { HAL_UART_Receive_IT(&huart1,bsp_uart1.rx_tmp,1); }
[单片机]
MCS-51单片机指令快速记忆方法总结
单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。 MCS-51是指由美国INTEL公司生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品。 学习单片机,除了搞清单片机内部功能、存储空间分配及I/O接口外,还应掌握其指令系统。MCS-51共有111条指令,现介绍我们总结出的快速记忆MCS-51指
[单片机]
基于51单片机串口中断发送数据帧
很少看到有资料写如何以中断的方式发送一帧数据,如果以等待的发送数据帧,对高速运行的单片机来说是很浪费时间的,下面就介绍一种使用中断方式发送数据帧,操作平台采用51 mcu 首先定义一个数据帧的结构体,该结构体可以做为一个全局变量,所有的发送都要经过这个结构体: //结构体 struct { char busy_falg;//忙标志,若在发送数据时置位1,即在开始发送置位1,发送结束置位0 int index;//索引,指向需要发送数组的位置 int length;//整个数据帧的长度 char *buf;//指向需要发送的数据帧,建议为全局变量,否则一旦开始发送,必须等到发送结束,即判断busy_falg为0
[单片机]
基于<font color='red'>51单片机</font>的<font color='red'>串口</font>中断发送数据帧
MSP430 串口通讯
MSP430 串口1 实现即时通讯 芯片:430F169 现在市面上大多数单片机都自带串口,本章介绍如何建立430串口通讯 单片机通过接收口(URXD)和发送口(UTXD)和外界进行通讯 430F169自带串口0和串口1两个通讯口 串口通讯是基于系统时钟上进行的,系统时钟的配置可以参考我之前的系统时钟进行配置。 1 串口控制各种寄存器 1 UxCTL,串口控制寄存器 2 UxTCTL,串口传输控制寄存器 3 UxRCTL,串口接收控制寄存器 4 UxBR0,波特率控制寄存器0 5 UxBR1,波特率控制寄存器1 6 UxMCTL,调制控制寄存器 7 UxRXBUF,接收缓存寄存器 8 UxTXBUF,传
[单片机]
MSP430 <font color='red'>串口</font>通讯
【STM32】串口通信基本原理
通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。它们的区别是: 并、串行通信的区别 串行通信的分类 1、按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输; 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。 全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。 2、按照通信方式,分为: 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口。 异步通信:不
[单片机]
【STM32】<font color='red'>串口</font>通信基本原理

推荐帖子

STM32L476RG Nuleo 评测二 STM32L476RG+MBED会是什么样子
本帖最后由damiaa于2015-10-2111:29编辑 STM32L476RGNuleo评测二STM32L476RG+MBED会是什么样子现在我们接续STM32L476RGNuleo评测一开始我们新的话题:STM32L476RG+MBED会是什么样子呢?我们先回顾一下MBED,进入https://www.mbed.com/zh-cn/,ARM公司就给我们规划了一副蛮吸引人的蓝图:2016年估计就蛮完善了。MBED涵盖了物联网所
damiaa stm32/stm8
P89LPC932 勘误
给机个典型了例子P89LPC932勘误
rain RF/无线
友精DE2-70 出售
友晶DE2-70出售,基本全新,少用,2K本站强荐:185娱乐◥城.足球◥真_人.彩票齐全◥手机可投◥注任何游戏.首次开户送10元.首存送58元.信誉绝对保证185.cc友精DE2-70出售附图本站强荐:185娱乐?城.足球?真_人.彩票齐全?手机可投?注任何游戏.首次开户送10元.首存送58元.信誉绝对保证185.cc附图。联系QQ:3115381388,注明:买DE2-70本站强荐:185娱乐у城.足球у真_人.彩票齐全у手机可投у注
fishcan_Q02Jq 淘e淘
【2024 DigiKey 创意大赛】用esp32-s3-lcd-ev-board制作华容道拼图游戏
这次参与2024DigiKey感知万物,乐享生活大赛,我选择的板子是esp32-s3-lcd-ev-board。这块板子非常豪华地配备了一块480*480的触摸屏,这么大的屏幕,能够非常好滴让单片机与人交互。 作品简介 ESP32-S3-LCD-EV-Board是一款基于ESP32-S3芯片的屏幕交互开发板,通过搭配不同类型的LCD子板,可以驱动IIC、SPI、8080以及RGB接口的LCD显示屏。同时它还搭载双麦克风阵列,支持语音识别和近/远
aramy DigiKey得捷技术专区
移动通信终端电源管理设计原理
当电池电压高于3.0V时,预充电模式结束,进入全速充电模式。此时,电源管理电路将S1及S2打开,并使S1工作在饱和模式,充电器提供全速充电电流给电池充电。但是,电源管理电路将限制最大充电电流小于1.5A。这种充电模式对充电器也有一定的要求,要求其实现限流输出。这样做的目的是便于移动通信终端厂商,在产品设计时可以根据产品的定义,选择不同的充电电流,实现对具体锂电池快速有效的充电。在典型应用中,一般要求充电器提供的输出电流限制在1A以内,具体的电流可以根据所用锂电池厂商推荐使用的充电电流,以便
cxmstrawberry 电源技术
stm8l151C6 RC522 物理SPI没有SCK时钟
调试好几天了,在网上试了好多方法还是不通,希望有大神给看下到底代码写的对不对,大家往下看:硬件连接:使用的单片机为stm8l151C6,物理SPI和一个RC522芯片进行连接PB4:NSS片选PB5:SCKPB6:MOSIPB7:MISOPC4:RST(复位)PD6:pwr(电源,自己为低功耗设计)问题:物理SPI初始化使能之后一直写数据,用示波器检测SCK引脚时钟,发现没有时钟信号程序一直卡在while(SPI_
lmy11224433 stm32/stm8
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved