找回密码
 立即注册
楼主: YangHY

第一课 序言《AI8051U的特点》

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-2-27 20:29:29 | 显示全部楼层
首先模式改成可变波特率的9位方式:

截图202602272029265132.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-2-27 20:37:40 | 显示全部楼层
我们直接用STC的ISP工具:

自动生成代码

截图202602272037245668.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-2-27 20:40:16 | 显示全部楼层
void Uart2_Init(void)        //9600bps@24.000MHz
{
               

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

接着改接收数据部分:
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-2-27 20:49:17 | 显示全部楼层
void Uart2_SendStr( u8 *puts )                //串口数据发送函数
{
        u8 dat;
    for (; *puts != 0;  puts++)     //遇到停止符0结束
    {
                dat = *puts;
                ACC = dat;
                if( P )
                        S2TB8 = 0;
                else
                        S2TB8 = 1;
               
        S2BUF = dat;
        B_TX2_Busy = 1;
        while(B_TX2_Busy);
    }       
}

这里的if(P) 实际就是if(S2RB8) ,S2RB8 这是接收到的第9位数据

原来是if(S2RBB==(!P)) 就是奇校验  (第9位和前面8位加起来刚好取反)

就是奇校验成立,那就保存接收到是数据:

if (S2CON & 0x01)        //检测串口2接收中断
        {
                S2CON &= ~0x01;        //清除串口2接收中断请求位
               
                dat = S2BUF;
                ACC = dat;
               
                //S2BUF
                if( S2RB8 == (!P)  )        //奇校验,P是奇偶校验位
                        Rec_Dat[Rec_Num++] = dat;
        }


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-2-27 20:53:32 | 显示全部楼层
发送的时候也要处理一下:

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

要看懂这几句是处理第9位数据:
if( P )
                        S2TB8 = 0;  //第9位数据为0
                else
                        S2TB8 = 1; //第9位数据为1

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-2-27 20:56:49 | 显示全部楼层
编译下载后,先试一下无校验
没有任何反应

改成奇校验:我们再发送一下数据


截图202602272056475262.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-2-27 20:57:44 | 显示全部楼层
串口助手发送OPEN:
截图202602272057417899.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-2-27 21:02:41 | 显示全部楼层
串口通信的超时中断
当我们在做串白接收的程序的时候,往往需要当接收到一串数据的时候需要及时的响应。但是响应的第一步就是我们得先判断这一包数据是否已经接收完成,必须要接收完成了才能进行下一步动作;

超时中断是用的非常多的

一包数据是否结束,要么有回车,要么时间超时

截图202602272102393808.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-2-27 21:04:28 | 显示全部楼层
很多方法比较,最好还是超时:
截图202602272104267028.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2026-2-27 21:05:50 | 显示全部楼层
看看超时中断相关寄存器:

截图202602272105481011.jpg
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-30 05:40 , Processed in 0.120856 second(s), 80 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表