摘要:本文分享两个函数构成的STC单片机串口发送程序,代码占用空间极小。不想调用stdio.h和printf但是还想用串口发送简单的调试信息?那就试试它吧!
直接上代码 ,核心函数只有2个,如下所示
- void UartInit(void) //115200bps@11.0592MHz
- {
- SCON = 0x50; //8位数据,可变波特率
- AUXR |= 0x01; //串口1选择定时器2为波特率发生器
- AUXR |= 0x04; //定时器时钟1T模式
- T2L = 0xE8; //设置定时初始值
- T2H = 0xFF; //设置定时初始值
- AUXR |= 0x10; //定时器2开始计时
-
- TI=1;
- }
-
- void SendData(BYTE dat)
- {
- while (!TI); //等待前一个数据发送完成
- TI = 0; //清除发送标志
- SBUF = dat; //发送当前数据
- }
完整代码如下:
- /*************************************************
- 版权声明:
- 文件名:main.c
- 作者:花生
- 版本号:
- 完成日期:2023年10月25日13:54:54
- 文件描述:通过STC单片机串口定时20毫秒发送0x55的16进制数据,串口波特率是115200.
- 主要函数列表:void UartInit(void),void SendData(BYTE dat),void SendData(BYTE dat)
- 开发环境:win7 64位操作系统,编译软件,STC-ISP6.92烧录,SSCOM串口助理观察发送的信息
- 所需硬件:STC15W408AS,其他硬件应该也没有问题,请注意延时和串口初始化的参数需要根据芯片型号重新计算。
- 使用说明:
- 1.本文件编译成功后,会生成一个test-uart.hex文件;
- 2.通过USB串口连接单片机,注意TXD RXD收发要交叉连接;
- 3.使用STC-ISP烧录,烧录的时候,需要确认芯片时钟工作在11.0592MHz,STC单片机是有内置的时钟的,可以不用晶振就能工作起来;
- 4.烧录完成后,用串口助理打开对应的端口,用十六进制模式就可以看到定时发送的55 55 55 55 了
- 修改历史:
- *************************************************/
-
- #include "main.h"
-
-
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
-
-
- //==================================================================
- //函 数 名:void UartInit(void) //115200bps@11.0592MHz
- //功能描述:芯片时钟是11.0592MHz,串口波特率是115200bps。函数这些参数是STC-ISP软件“串口波特率计算”模块计算得来的
- //输入参数:无
- //返 回 值:无
- //作 者:STC-ISP
- //日 期:
- //修改记录:
- //==================================================================
- void UartInit(void) //115200bps@11.0592MHz
- {
- SCON = 0x50; //8位数据,可变波特率
- AUXR |= 0x01; //串口1选择定时器2为波特率发生器
- AUXR |= 0x04; //定时器时钟1T模式
- T2L = 0xE8; //设置定时初始值
- T2H = 0xFF; //设置定时初始值
- AUXR |= 0x10; //定时器2开始计时
-
- TI=1; //花生,请注意,这个TI一定要打开,否则发送不出去
- }
-
-
- //==================================================================
- //函 数 名:void SendData(BYTE dat)
- //功能描述:通过串口发送一个字节的数据
- //输入参数:unsigned char类型的一个字节的数据
- //返 回 值:无
- //作 者:STC-ISP
- //日 期:
- //修改记录:
- //==================================================================
- void SendData(BYTE dat)
- {
- while (!TI); //等待前一个数据发送完成
- TI = 0; //清除发送标志
- SBUF = dat; //发送当前数据
- }
-
-
- //==================================================================
- //函 数 名:void Delay20ms(void) //@11.0592MHz
- //功能描述:通过空语句延时20毫秒
- //输入参数:无
- //返 回 值:无
- //作 者:STC-ISP
- //日 期:
- //修改记录:
- //==================================================================
- void Delay20ms(void) //@11.0592MHz
- {
- unsigned char data i, j;
-
- i = 216;
- j = 37;
- do
- {
- while (--j);
- } while (--i);
- }
-
- //==================================================================
- //函 数 名:void main()
- //功能描述:主函数,初始化串口之后,延时20毫秒定时通过串口发送0x55数据
- //输入参数:无
- //返 回 值:无
- //作 者:
- //日 期:
- //修改记录:
- //==================================================================
- void main()
- {
-
- BYTE x = 0x55;
-
- UartInit();
-
- while(1)
- {
- SendData(x);
- Delay20ms();
-
- }//while
- }
-
-
去掉注释后的代码如下,您可以直接复制粘贴了
- #include "main.h"
-
-
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
-
-
- void UartInit(void) //115200bps@11.0592MHz
- {
- SCON = 0x50; //8位数据,可变波特率
- AUXR |= 0x01; //串口1选择定时器2为波特率发生器
- AUXR |= 0x04; //定时器时钟1T模式
- T2L = 0xE8; //设置定时初始值
- T2H = 0xFF; //设置定时初始值
- AUXR |= 0x10; //定时器2开始计时
-
- TI=1; //花生,请注意,这个TI一定要打开,否则发送不出去
- }
-
- void SendData(BYTE dat)
- {
- while (!TI); //等待前一个数据发送完成
- TI = 0; //清除发送标志
- SBUF = dat; //发送当前数据
- }
-
- void Delay20ms(void) //@11.0592MHz
- {
- unsigned char data i, j;
-
- i = 216;
- j = 37;
- do
- {
- while (--j);
- } while (--i);
- }
-
- void main()
- {
-
- BYTE x = 0x55;
-
- UartInit();
-
- while(1)
- {
- SendData(x);
- Delay20ms();
-
- }//while
- }
-
-
本段代码编译完成后的大小是:
Program Size: data=11.0 xdata=0 code=72
运行的截图如下所示,选择16进制显示,会一直显示55 55 55 55。其实实现这一步之后,我们需要
如果您需要工程文件,代码已经上传至gitee,请用下面连接下载