STC15不同配置模式下的串口输出方式总结

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15不同配置模式下的串口输出方式总结相关的知识,希望对你有一定的参考价值。

STC15不同配置模式下的串口输出方式总结


  • ✨基于STC15W408AS单片机。STC15W401AS系列单片机(含IRC15W415AS)有:2个普通定时器/计数器(T0T2)
  • 🔰晶振频率:11.0592MHz;波特率:115200

🌴串口配置模式1

在不开启串口中断情况下,仅作为一般调试信息输出,不能接收串口数据。

//STC15W408AS,512字节的RAM,8K FLASH
//晶振频率:11.0592MHz
//波特率:115200
#include <STC15F2K60S2.H>
#include "intrins.h"
//#include "stdio.h"

bit busy;
//#define     FOSC    11059200UL
//#define     BAUD    115200

//sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7


void Delay500ms();
void UartInit(void);        //115200bps@11.0592MHz
void SendData(unsigned char dat);
void SendString(char *s);

void main()

    P1M0 = 0x00;
    P1M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;

    UartInit();
	Delay500ms();
	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");

    while (1)
    
        P17 = 0x01;
        Delay500ms();
        P17 = 0x00;
        Delay500ms();
//        printf("Hello World /r/n");
	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");
    



void UartInit(void)     //115200bps@11.0592MHz

	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xFE;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时


/*----------------------------
发送串口数据
----------------------------*/
void SendData(unsigned char dat)

	 SBUF = dat;   
    while (!TI); //等待前一个数据发送完成
    TI = 0;//清除发送标志




/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)

    while (*s)                  //检测字符串结束标志
    
        SendData(*s++);         //发送当前字符
    



void Delay500ms()       //@11.0592MHz

    unsigned char i, j, k;
    _nop_();
    _nop_();
    i = 22;
    j = 36;
    k = 227;
    do
    
        do
        
            while (--k);
        
        while (--j);
    
    while (--i);




🌷串口配置模式2

在不开启串口中断情况下,实现printf输出。仅作为一般调试信息输出,不能接收串口数据。

//STC15W408AS,512字节的RAM,8K FLASH
//晶振频率:11.0592MHz
//波特率:115200

#include <STC15F2K60S2.H>
#include "intrins.h"
#include "stdio.h"

bit busy;
//#define     FOSC    11059200UL
//#define     BAUD    115200

//sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7


void Delay500ms();
void UartInit(void);        //115200bps@11.0592MHz
void SendData(unsigned char dat);
void SendString(char *s);

void main()

    P1M0 = 0x00;
    P1M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    UartInit();
	Delay500ms();
	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");

    while (1)
    
        P17 = 0x01;
        Delay500ms();
        P17 = 0x00;
        Delay500ms();
        printf("Hello World \\r\\n");
//	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");
    



void UartInit(void)     //115200bps@11.0592MHz

	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xFE;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时


/*----------------------------
发送串口数据
----------------------------*/
void SendData(unsigned char dat)

	 SBUF = dat;   
    while (!TI); //等待前一个数据发送完成
    TI = 0;//清除发送标志


char putchar(char dat)

    SendData(dat);
    return dat;

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)

    while (*s)                  //检测字符串结束标志
    
        SendData(*s++);         //发送当前字符
    


void Delay500ms()       //@11.0592MHz

    unsigned char i, j, k;
    _nop_();
    _nop_();
    i = 22;
    j = 36;
    k = 227;
    do
    
        do
        
            while (--k);
        
        while (--j);
    
    while (--i);




🌻串口配置模式3

开启串口中断情况下,仅作为一般调试信息输出,可以实现接收串口数据(接收部分需要代码完善)。

//STC15W408AS,512字节的RAM,8K FLASH
//晶振频率:11.0592MHz
//波特率:115200

#include <STC15F2K60S2.H>
#include "intrins.h"
//#include "stdio.h"

bit busy;
//#define     FOSC    11059200UL
//#define     BAUD    115200

//sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7


void Delay500ms();
void UartInit(void);        //115200bps@11.0592MHz
void SendData(unsigned char dat);
void SendString(char *s);

void main()

    P1M0 = 0x00;
    P1M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
//	ACC = P_SW1;
//    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
//    P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
    UartInit();
	Delay500ms();
	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");

    while (1)
    
        P17 = 0x01;
        Delay500ms();
        P17 = 0x00;
        Delay500ms();
	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");
    



void UartInit(void)     //115200bps@11.0592MHz

	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xFE;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
    ES = 1; //使能串口中断
    EA = 1;


/*----------------------------
        UART 中断服务程序
-----------------------------*/

void Uart() interrupt 4

    if (RI)
    
        RI = 0;                 //清除RI位
    
    if (TI)
    
        TI = 0;                 //清除TI位
        busy = 0;               //清忙标志
    


/*----------------------------
发送串口数据
----------------------------*/
void SendData(unsigned char dat)


		while (busy);               //等待前面的数据发送完成
    ACC = dat;                  //获取校验位P (PSW.0)
		busy = 1;
    SBUF = ACC;                 //写数据到UART数据寄存器



/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)

    while (*s)                  //检测字符串结束标志
    
        SendData(*s++);         //发送当前字符
    



void Delay500ms()       //@11.0592MHz

    unsigned char i, j, k;
    _nop_();
    _nop_();
    i = 22;
    j = 36;
    k = 227;
    do
    
        do
        
            while (--k);
        
        while (--j);
    
    while (--i);




🌼串口配置模式4

开启串口中断情况下,使用printf函数输出调试信息,可以实现接收串口数据(接收部分需要代码完善)。

//STC15W408AS,512字节的RAM,8K FLASH
//晶振频率:11.0592MHz
//波特率:115200

#include <STC15F2K60S2.H>
#include "intrins.h"
#include "stdio.h"

bit busy;
//#define     FOSC    11059200UL
//#define     BAUD    115200

//sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7


void Delay500ms();
void UartInit(void);        //115200bps@11.0592MHz
void SendData(unsigned char dat);
void SendString(char *s);

void main()

    P1M0 = 0x00;
    P1M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
//	ACC = P_SW1;
//    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
//    P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
    UartInit();
	Delay500ms();
	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");

    while (1)
    
        P17 = 0x01;
        Delay500ms();
        P17 = 0x00;
        Delay500ms();
        printf("Hello World \\r\\n");
//	SendString("STC15F2K60S2\\r\\nUart Test !\\r\\n");
    



void UartInit(void)     //115200bps@11.0592MHz

	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xFE;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
	  TI = 1;         // 很关键,使用printf函数时必须有此命令
    ES = 1; //使能串口中断
    EA = 1;


/*----------------------------
        UART 中断服务程序
-----------------------------*/

void Uart() interrupt 4

    if (RI)
    
        RI = 0;                 //清除RI位
    
    if (TI)
    
        TI = 0;                 //清除TI位
        busy = 0;               //清忙标志
    


/*----------------------------
发送串口数据
----------------------------*/
void SendData(unsigned char dat)


	while (busy);               //等待前面的数据发送完成
    ACC = dat;                  //获取校验位P (PSW.0)
	 busy = 1;
    SBUF = ACC;                 //写数据到UART数据寄存器


char putchar(char dat)

    SendData(dat);
    return dat;

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)

    while (*s)                  //检测字符串结束标志
    
        SendData(*s++);         //发送当前字符
    



void Delay500ms()       //@11.0592MHz

    unsigned char i, j, k;
    _nop_();
    _nop_();
    i = 22;
    j = 36;
    k = 227;
    do
    
        do
        
            while (--k);
        
        while (--j);
    
    while (--i);




以上是关于STC15不同配置模式下的串口输出方式总结的主要内容,如果未能解决你的问题,请参考以下文章

STC单片机3路PWM波形输出并串口打印当前脉冲值

STC单片机通过ADC外部输入调节PWM占空比输出并串口打印当前脉冲值

STC单片机不同数据类型串口打印输出示例程序

STC15系列STC15虚拟串口输出打印示例程序

STC15F408AS跑STC官方示例串口输出乱码问题解决方案

STC单片机如何快速配置和部署一个带串口调试输出的工程模板