找回密码
 立即注册
查看: 463|回复: 15

STC8A8K64D 定时器3中断和串口2中断同时开启,定时器3不工作

[复制链接]
  • TA的每日心情
    开心
    2024-1-2 11:42
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    3

    回帖

    31

    积分

    新手上路

    积分
    31
    发表于 2023-12-9 19:57:09 | 显示全部楼层 |阅读模式
    本帖最后由 huanghao_min 于 2023-12-9 20:18 编辑

    源程序:
    #include <stc8a8k64d4.h>
    #include <stdarg.h>
    #include <string.h>
    #include <stdio.h>
    static bit uart1SendBusy=0;
    static unsigned char timerFlag=0;

    void uart1Init(void)                //9600bps@22.1184MHz
    {
            SCON = 0x50;                //8位数据,可变波特率
            AUXR |= 0x40;                //定时器时钟1T模式
            AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
            TMOD &= 0x0F;                //设置定时器模式
            TL1 = 0xC0;                        //设置定时初始值
            TH1 = 0xFD;                        //设置定时初始值
            ET1 = 0;                        //禁止定时器中断
            TR1 = 1;                        //定时器1开始计时
            ES = 1   ;          //使能串口中断
    }

    void uart1SendChar(char dat)
    {
            while(uart1SendBusy);
            uart1SendBusy=1;
            SBUF=dat;
    }

    void uart1SendString(char *p)
    {
            while(*p!='\0')
            {
                    uart1SendChar(*p++);
            }
    }

    void uart1_isr() interrupt 4
    {
        if (TI)
        {
                    TI = 0;   
                    uart1SendBusy=0;               
        }
        if (RI)
        {
            RI = 0;                              
        }
    }


    void Timer3_Init(void)                //1秒@22.1184MHz
    {
            unsigned char psw2Value;
            unsigned char value;
            psw2Value =P_SW2;
            P_SW2  =psw2Value|0x80;        //使能访问XFR
            TM3PS = 0x1C;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
            P_SW2  =psw2Value;
            T4T3M &= 0xFD;                        //定时器时钟12T模式
            T3L = 0xB9;                                //设置定时初始值
            T3H = 0x07;                                //设置定时初始值
            T4T3M |= 0x08;                        //定时器3开始计时
            IE2 |=0x20;                        //使能定时器3中断
    }

    void Timer3_Isr(void) interrupt 19
    {
            timerFlag=0xaa;
    }


    void uart2Init(void)                //9600bps@22.1184MHz
    {
            S2CON = 0x50;                //8位数据,可变波特率
            AUXR |= 0x04;                //定时器时钟1T模式
            T2L = 0xC0;                        //设置定时初始值
            T2H = 0xFD;                        //设置定时初始值
            AUXR |= 0x10;                //定时器2开始计时
            IE2  |= 0x01;                //使能串口2中断
    }


    void main(void)
    {
            uart1Init();
            EA = 1;
            uart1SendString("program init\r\n");
            uart2Init();
            Timer3_Init();
                   
            while(1)
            {
                    if(timerFlag==0xaa)
                    {
                            timerFlag=0;
                            uart1SendString("this is a test\r\n");
                    }
            }
    }
    //=================================================================//
    1、当uart2Init函数中的IE2  |= 0x01;        //使能串口2中断   开启后,定时器3中断就不会产生,串口1不会提示字符串"this is a test";
    2、当屏蔽uart2Init函数中的IE2  |= 0x01;        //使能串口2中断   后,定时器3中断产生,串口1会连续打印提示字符串"this is a test";
    3、当IE2直接赋值  IE2= 0x21时,定时器3也不会产生中断,串口1不会提示字符串"this is a test";

    回复 送花

    使用道具 举报

    该用户从未签到

    552

    主题

    9520

    回帖

    1万

    积分

    管理员

    积分
    14094
    发表于 2023-12-9 20:00:18 | 显示全部楼层
    还是建议用 STC-USB Link1D 来仿真

    截图202312092000084666.jpg

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    552

    主题

    9520

    回帖

    1万

    积分

    管理员

    积分
    14094
    发表于 2023-12-9 20:01:25 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    552

    主题

    9520

    回帖

    1万

    积分

    管理员

    积分
    14094
    发表于 2023-12-9 20:01:50 | 显示全部楼层
    截图202312092001453770.jpg
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:37
  • 签到天数: 143 天

    [LV.7]常住居民III

    20

    主题

    1093

    回帖

    2603

    积分

    金牌会员

    积分
    2603
    发表于 2023-12-11 09:21:52 | 显示全部楼层
    话说为啥没看到你串口2的中断服务函数....加上去试一试?
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-2 11:42
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    3

    回帖

    31

    积分

    新手上路

    积分
    31
     楼主| 发表于 2023-12-11 09:25:35 | 显示全部楼层
    本帖最后由 huanghao_min 于 2023-12-11 09:27 编辑

    加入串口2的中断,还是一样的效果
    void uart2_isr() interrupt 8
    {

    }
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:37
  • 签到天数: 143 天

    [LV.7]常住居民III

    20

    主题

    1093

    回帖

    2603

    积分

    金牌会员

    积分
    2603
    发表于 2023-12-11 10:23:56 | 显示全部楼层
    加上这部分 你在尝试一下
    截图202312111023429106.jpg
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:37
  • 签到天数: 143 天

    [LV.7]常住居民III

    20

    主题

    1093

    回帖

    2603

    积分

    金牌会员

    积分
    2603
    发表于 2023-12-11 10:28:31 | 显示全部楼层
    这个是串口输出的结果
    截图202312111024166847.jpg
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-2 11:42
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    3

    回帖

    31

    积分

    新手上路

    积分
    31
     楼主| 发表于 2023-12-11 10:41:08 | 显示全部楼层
    本帖最后由 huanghao_min 于 2023-12-11 10:43 编辑

    谢谢老师,确实现在可以,这个程序必须加上
    void uart2_isr() interrupt 8
    {
            if(S2CON&0x02)
            {
                    S2CON &=~0x02;
            }
            if(S2CON&0x01)
            {
                    S2CON &=~0x01;
            }
    }
    接收中断和发送中断都必须处理;

    如果只处理发送中断,
    void uart2_isr() interrupt 8
    {
        if (S2CON & 0x02)
        {
                    S2CON &= ~0x02;   
                    uart2SendBusy=0;               
        }
    }
    也不能正常运行
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:37
  • 签到天数: 143 天

    [LV.7]常住居民III

    20

    主题

    1093

    回帖

    2603

    积分

    金牌会员

    积分
    2603
    发表于 2023-12-11 10:45:56 | 显示全部楼层
    huanghao_min 发表于 2023-12-11 10:41
    谢谢老师,确实现在可以,这个程序必须加上
    void uart2_isr() interrupt 8
    {

    照理说应该不会,,,我自己的工程里面用用轮询的方式 处理TI 也是可以的,,可能关键的地方在接收中断标志这里。。
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-19 16:30 , Processed in 0.072487 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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