YangHY 发表于 2026-1-28 09:41:27

这个工具可以帮助我们自动生成

波特率发生器:定时器2(16位自动重载)

否则我们还不知道应该用那个定时器来做波特率发生器!

YangHY 发表于 2026-1-28 10:32:59

本课的任务:

YangHY 发表于 2026-1-28 11:17:29

运行结果:

YangHY 发表于 2026-1-28 11:20:19

#include "usart.h"
#include "io.h"


u8 Rec_Dat;                //接收缓冲区
u8 Rec_Num = 0;                //接收计数
bit B_TX2_Busy=0;
void Uart2_Isr(void) interrupt 8
{
        if (S2CON & 0x02)        //检测串口2发送中断
        {
                S2CON &= ~0x02;        //清除串口2发送中断请求位
                B_TX2_Busy = 0;
        }
        if (S2CON & 0x01)        //检测串口2接收中断
        {
                S2CON &= ~0x01;        //清除串口2接收中断请求位
               
                //S2BUF
                Rec_Dat = S2BUF;
        }
}


void Uart2_Init(void)        //9600bps@24.000MHz
{
                                                                //UART2/USART2: RxD2(P4.2), TxD2(P4.3)
       
        P_SW2 |= 0x01;                          //UART2/USART2: RxD2(P4.2), TxD2(P4.3)
       
        S2CON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x04;                //定时器时钟1T模式
        T2L = 0x8F;                        //设置定时初始值
        T2H = 0xFD;                        //设置定时初始值
        AUXR |= 0x10;                //定时器2开始计时
        IE2 |= 0x01;                //使能串口2中断
       
        Rec_Num = 0;
        B_TX2_Busy = 0;
}

void Uart2_SendStr( u8 *puts )                //串口数据发送函数
{
    for (; *puts != 0;puts++)   //遇到停止符0结束
    {
      S2BUF = *puts;
      B_TX2_Busy = 1;
      while(B_TX2_Busy);
    }       
}

//1.发送OPEN\r\n打开数码管,数码管显示“- - - -” 11 22 OPEN\r\n
//2.发送CLOSE\r\n打开数码管,数码管全部熄灭


void Usart2_RunTask(void)
{
        if( Rec_Num >= 6 )                //是否接收到了6位以上的数据
        {
                if(( Rec_Dat == '\n' ) && ( Rec_Dat == '\r' ) )        //末尾判断
                {
                        if( ( Rec_Dat == 'O' ) && ( Rec_Dat == 'P' ) && ( Rec_Dat == 'E' ) && ( Rec_Dat == 'N' ))
                        {
                                passward = 16;
                                passward = 16;
                                passward = 16;
                                passward = 16;
                                Uart2_SendStr( "打开成功!\r\n" );
                        }
                        else if( ( Rec_Dat == 'C' ) && ( Rec_Dat == 'L' ) && ( Rec_Dat == 'O' ) && ( Rec_Dat == 'S' ) && ( Rec_Dat == 'E' ))
                        {
                                passward = 17;
                                passward = 17;
                                passward = 17;
                                passward = 17;
                                Uart2_SendStr( "关闭成功!\r\n" );
                        }
                        Rec_Num = 0;
                }
        }
}


关键程序:

YangHY 发表于 2026-1-28 11:22:02

STC的CDC串口助手,可以修改按钮名称哦:

YangHY 发表于 2026-1-28 11:45:16

烧录后一切正常:

YangHY 发表于 2026-1-28 11:46:46

课后小练习:

那么十七课就学到这里结束!

YangHY 发表于 2026-1-29 12:09:27

今天我们学校第十八集 串口高级应用

YangHY 发表于 2026-1-29 12:11:24

奇偶校验:

YangHY 发表于 2026-1-29 12:12:26

为什么需要校验?
页: 78 79 80 81 82 83 84 85 86 87 [88] 89 90 91 92 93 94 95 96 97
查看完整版本: 第一课 序言《AI8051U的特点》