关于stm8s单片机串口2的疑问

关于stm8s单片机串口2的疑问,第1张

首先,你看错程序了 你注意到句一最后有个“;”了吗 也就是说 如果UART2_FLAG_TXE为0,就一直执行这条语句,直到UART2_FLAG_TXE为1才跳过这条语句执行句2;

其次, TXE应该是发送数据寄存器为空的 标志位,也就是发送数据寄存器为空的时候为1,不为空也就是还没发送完的时候为0,;

所以刚进程序的时候 UART2_FLAG_TXE为1;然后跳过句1到句2,执行发送,发下一字节前先检查上一字节发送是否结束。

以下是宏晶用于STC15F4K60S4 系列的串口2代码示例,根据经验很可能可以用于STC12C60S2单片机,但未亲手验证

/*---------------------------------------------------------------------*/

/* --- STC MCU Limited ------------------------------------------------*/

/* --- STC15F4K60S4 系列 定时器2用作串口2的波特率发生器举例------------*/

/* --- Mobile: (86)13922805190 ----------------------------------------*/

/* --- Fax: 86-755-82905966 -------------------------------------------*/

/* --- Tel: 86-755-82948412 -------------------------------------------*/

/* --- Web: 

 --------------------------------------------*/

/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序   */

/* 如果要在文章中应用此代码,请在文章中注明使用了宏晶科技的资料及程序   */

/*---------------------------------------------------------------------*/ //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译

//假定测试芯片的工作频率为18.432MHz #include "reg51.h"

#include "intrins.h" typedef unsigned char BYTE

typedef unsigned int WORD #define FOSC 18432000L          //系统频率

#define BAUD 115200             //串口波特率 #define NONE_PARITY     0       //无校验

#define ODD_PARITY      1       //奇校验

#define EVEN_PARITY     2       //偶校验

#define MARK_PARITY     3       //标记校验

#define SPACE_PARITY    4       //空白校验 #define PARITYBIT EVEN_PARITY   //定义校验位 sfr AUXR  = 0x8e               //辅助寄存器

sfr S2CON = 0x9a               //UART2 控制寄存器

sfr S2BUF = 0x9b               //UART2 数据寄存器

sfr T2H   = 0xd6               //定时器2高8位

sfr T2L   = 0xd7               //定时器2低8位

sfr IE2   = 0xaf               //中断控制寄存器2 #define S2RI  0x01              //S2CON.0

#define S2TI  0x02              //S2CON.1

#define S2RB8 0x04              //S2CON.2

#define S2TB8 0x08              //S2CON.3 sfr P_SW2   = 0xBA             //外设功能切换寄存器2

#define S2_S0 0x01              //P_SW2.0 bit busy void SendData(BYTE dat)

void SendString(char *s) void main()

{

    P_SW2 &= ~S2_S0            //S2_S0=0 (P1.0/RxD2, P1.1/TxD2)

//  P_SW2 |= S2_S0             //S2_S0=1 (P4.6/RxD2_2, P4.7/TxD2_2) #if (PARITYBIT == NONE_PARITY)

    S2CON = 0x50               //8位可变波特率

#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)

    S2CON = 0xda               //9位可变波特率,校验位初始为1

#elif (PARITYBIT == SPACE_PARITY)

    S2CON = 0xd2               //9位可变波特率,校验位初始为0

#endif     T2L = (65536 - (FOSC/4/BAUD))   //设置波特率重装值

    T2H = (65536 - (FOSC/4/BAUD))>>8

    AUXR = 0x14                //T2为1T模式, 并启动定时器2

    IE2 = 0x01                 //使能串口2中断

    EA = 1     SendString("STC15F2K60S2\r\nUart2 Test !\r\n")

    while(1)

} /*----------------------------

UART2 中断服务程序

-----------------------------*/

void Uart2() interrupt 8 using 1

{

    if (S2CON & S2RI)

    {

        S2CON &= ~S2RI         //清除S2RI位

        P0 = S2BUF             //P0显示串口数据

        P2 = (S2CON & S2RB8)   //P2.2显示校验位

    }

    if (S2CON & S2TI)

    {

        S2CON &= ~S2TI         //清除S2TI位

        busy = 0               //清忙标志

    }

} /*----------------------------

发送串口数据

----------------------------*/

void SendData(BYTE dat)

{

    while (busy)               //等待前面的数据发送完成

    ACC = dat                  //获取校验位P (PSW.0)

    if (P)                      //根据P来设置校验位

    {

#if (PARITYBIT == ODD_PARITY)

        S2CON &= ~S2TB8        //设置校验位为0

#elif (PARITYBIT == EVEN_PARITY)

        S2CON |= S2TB8         //设置校验位为1

#endif

    }

    else

    {

#if (PARITYBIT == ODD_PARITY)

        S2CON |= S2TB8         //设置校验位为1

#elif (PARITYBIT == EVEN_PARITY)

        S2CON &= ~S2TB8        //设置校验位为0

#endif

    }

    busy = 1

    S2BUF = ACC                //写数据到UART2数据寄存器

} /*----------------------------

发送字符串

----------------------------*/

void SendString(char *s)

{

    while (*s)                  //检测字符串结束标志

    {

        SendData(*s++)         //发送当前字符

    }

}  


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12020384.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存