标准c语言 串口 函数,串口printf系列函数

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 != '\0')//连续发送字符串数据,直到检测到结束符

{

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”之后要添加到工程文件中

747ed91fae7cceb59673439728465bcd.png

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

007ec44743d95016945b6f6beac078ea.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值