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

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-01-02 11:42:35

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";

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

截图202312092000084666.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-01-02 11:42:35

1

主题

3

回帖

31

积分

新手上路

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

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

}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-01-02 11:42:35

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;               
    }
}
也不能正常运行
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:58 , Processed in 0.166983 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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