上节分享了定时器的综合应用实例程序,其他的视频课程的代码相对都比较简单,就不再单独的贴出了(如果有需要分享的,可以单独留言具体的视频课程的标题,后续再做相关的分享)。从本节开始,陆续分享关于串口通信的一些代码,这也是部分网友一直私信要求分享的,当然也是基于串口的重要性。比如我们平时在程序的调试过程中,经常使用串口来进行相关的调试,打印一些信息或数据到上位机,以便观察和判断程序的逻辑功能是否符合预期。另外在设备和设备之间,设备和上位机之间进行通信时,串口也是一个重要的外设,因此,掌握了串口相关的功能,可以说,单片机的入门就差不多了。本节代码对应的视频课程为:串口发送一串数据到上位机及Printf串口输出重定向的实现,视频链接为:https://www.ixigua.com/6842637474208940548。本节视频课程主要是介绍了如何实现printf重定向到串口的问题,感兴趣的同学可以翻看相关的视频了解具体的实现讲解,也可以直接参考下面的代码,进行相关的调试测试。需要注意的是使用ptintf重定向,格式化输出时,会增加代码的容量,效率不高,一般主要用于调试过程,调试完成后,可以注释掉相关的代码,如果是用于串口的通信,则不建议直接使用printf,可以自己编写相应的串口发送程序代码来实现具体的功能。另外需要注意的是,如果用于串口的数据通信,单片机的晶振最好选择11.0592MHz,因为用该晶振时,波特率计算时,定时器的初值是整数,不存在累积的传输误差。话不多说,下面是具体的代码实现,分为main.c和uart.c。
//main.c
/*********************************************
程序功能:printf串口输出重定向
配置串口,遵循“9600,N,8,1”。
波特率:9600bps @11.0592MHz
无校验位:N
数据位:8
停止位:1
***********************************************/
#include <reg51.h>
#include "delay.h"
#include "uart.h"
void main()
{
unsigned char dat = 88;//格式化输出测试用
unsigned int dat2 = 1250;//格式化输出测试用
float dat3 = 12.5;//格式化输出测试用
UartInit();//串口初始化
while(1)
{
printf("Hello World\r\n");
printf("dat = %bu\r\n",dat);
printf("dat2 = %u\r\n",dat2);
printf("dat3 = %f\r\n",dat3);
DelayXms(2000);
}
}
//uart.c
#include "uart.h"
//串口初始化,可借助视频中提到的工具进行配置
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
//串口发送一个字节数据
void sendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
//串口发送字符串
void sendString(unsigned char *dat)
{
while(*dat != '\0')
{
sendByte(*dat++);
}
}
char putchar(char c)
{
sendByte(c);
return c;
}
//uart.h
#ifndef __UART_H__
#define __UART_H__
#include <reg51.h>
#include <stdio.h>
void UartInit(void);
void sendByte(unsigned char dat);
void sendString(unsigned char *dat);
#endif
//delay.c
#include "delay.h"
/************************************
函数名:DelayXms
功 能:毫秒级延时函数
参 数:unsigned int (1 - 65535)
返回值:无
**************************************/
void DelayXms(unsigned int xms)
{
unsigned int i,j;
for(i = xms;i>0;i--)
for(j = 124;j>0;j--);
}
//delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void DelayXms(unsigned int xms);
#endif
仿真的效果图如下:
注意,如果使用的是proteus仿真的话,可以使用仿真工具虚拟终端进行测试,也可以安装虚拟串口软件,借助虚拟串口进行和上位机进行通信测试。具体的虚拟串口的使用,视频课程中有具体的介绍,可以打开视频进行了解。

proteus仿真测试效果

虚拟串口终端

借助虚拟串口和上位机串口助手进行通信测试
代码仅供有需要的同学参考,有问题可以留言交流。感谢关注,后续会继续分享课程视频的相关代码。