找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1843|回复: 5
收起左侧

STC8A8K64S4A12单片机 当打开比较器的时候,再开定时器0,就会开不了

[复制链接]
ID:510170 发表于 2021-9-16 13:32 | 显示全部楼层 |阅读模式
当打开比较器的时候,再开定时器0,就会开不了。就算是开其它定时器的时候也会造成一些问题。
源代码

#include "stc8.h"
#include <stdio.h>

unsigned char flag10ms,flag100ms;
unsigned int  flag1s,flag10s;
bit flag1ms,readcard;

void init(void)
{
    SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
        T2L = 0xE0;                //设定定时初值
        T2H = 0xFE;                //设定定时初值
        AUXR |= 0x10;                //启动定时器2
//    TR1 = 1;
    TI = 1;
        printf("Start\n");

}
void PWMInt(void)
{
    P_SW2 = 0x80;
    PWM1CR = 0x00;                              //PWM0/P2.0
    PWMCKS = 0x00;                              // PWM时钟为系统时钟
    PWMC   = 0x0058;                              //设置PWM周期为1000H个PWM时钟
    PWM1T1 = 0x0000;                             //在计数值为100H地方输出低电平
    PWM1T2 = 0x002C;                             //在计数值为500H地方输出高电平
    PWM1CR = 0x80;                               //使能PWM1输出
    P_SW2  = 0x00;
    PWMCR  |= 0x80;                               //启动PWM模块
}
void CMPInt(void)
{
    CMPCR2 = 0x00;
    CMPCR2 &= ~0x80;                            //比较器正向输出
    CMPCR2 &= ~0x40;                            //使能0.1us滤波
    CMPCR2 |= 0x3E;                             //比较器结果经过63个去抖时钟后输出
    CMPCR1 = 0x00;
    CMPCR1 |= 0x30;                             //使能比较器边沿中断
    CMPCR1 &= ~0x08;                            //P3.6为CMP+输入脚
    CMPCR1 |= 0x04;                             //P3.7为CMP-输入脚
    CMPCR1 &= ~0x02;                            //禁止比较器输出
    CMPCR1 |= 0x80;                             //开启比较器模块
//    EA = 1;

}

void Timer0Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xCD;                //设置定时初值
        TH0 = 0xD4;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
    ET0 = 1;        //使能定时器中断
    EA = 1;
}

void TM0_Isr() interrupt 1
{
    flag1ms=1;
}
/*

void TM1_Isr() interrupt 3
{
    flag1ms=1;                                //测试端口
}
void Timer1Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x40;                //定时器时钟1T模式
        TMOD &= 0x0F;                //设置定时器模式
        TL1 = 0xCD;                //设置定时初值
        TH1 = 0xD4;                //设置定时初值
        TF1 = 0;                //清除TF1标志
        TR1 = 1;                //定时器1开始计时
    ET1 = 1;                                    //使能定时器中断
    EA = 1;
}/*
void TM3_Isr() interrupt 19
{
    flag1ms=1;                                 //测试端口
    AUXINTIF &= ~T3IF;                          //清中断标志
}

void Timer3Init(void)                //1毫秒@11.0592MHz
{
        T4T3M |= 0x02;                //定时器时钟1T模式
        T3L = 0xCD;                //设置定时初值
        T3H = 0xD4;                //设置定时初值
        T4T3M |= 0x08;                //定时器3开始计时
    IE2 = ET3;          //使能定时器中断
    EA = 1;
}
*/


main()
{
        //初始化
    flag1ms=readcard=0;
    flag10ms=flag100ms=flag1s=flag10s=0;
    PWMInt();
    CMPInt();
        init();
    Timer0Init();


    while (1)
    {
       if(flag1ms)
       {
           flag1ms=0;      
           if(++flag10ms>=10)
            {
                flag10ms=0;   
                printf("10MS\n");   
            }
            if(++flag100ms>=100)
            {
                flag100ms=0;
                printf("100MS\n");
            }
            if(++flag1s>=1000)            
            {
                flag1s=0;
                printf("1000MS\n");
            }
            if(++flag10s>=10000)
            {
                flag10s=0;
                printf("10000MS\n");
            }
        }            
    }
}





不知道是我的编译器问题,还是其它问题,有没有师兄复现下,看看是我的程序问题还是单片机的bug谢谢了。
回复

使用道具 举报

ID:401564 发表于 2021-9-16 17:56 | 显示全部楼层
单片机的bug在99.99的情况是人的bug
比较中断开启之后,你并没有比较器中断的函数   interrupt 21
一旦比较器中断被触发,进入中断之后就没有返回,程序直接跑飞........
回复

使用道具 举报

ID:57657 发表于 2021-9-16 21:48 | 显示全部楼层
Y_G_G 发表于 2021-9-16 17:56
单片机的bug在99.99的情况是人的bug
比较中断开启之后,你并没有比较器中断的函数   interrupt 21
一旦比 ...

不管是什么中断一但开启必须有中断入口函数,否则中断发生后都不知道执行了什么指令,然后程序就飞了。
回复

使用道具 举报

ID:510170 发表于 2021-9-17 08:21 来自手机 | 显示全部楼层
Y_G_G 发表于 2021-9-16 17:56
单片机的bug在99.99的情况是人的bug
比较中断开启之后,你并没有比较器中断的函数   interrupt 21
一旦比 ...

问题是我没有开启比较器中断呀,难道只要打开了ea就必须要进比较器中断关掉中断吗?我再研究下,谢谢了。
回复

使用道具 举报

ID:401564 发表于 2021-9-17 11:22 | 显示全部楼层
ttmax3 发表于 2021-9-17 08:21
问题是我没有开启比较器中断呀,难道只要打开了ea就必须要进比较器中断关掉中断吗?我再研究下,谢谢了。

你以为这个是什么?CMPCR1 |= 0x30;                             //使能比较器边沿中断
没有说要关闭中断呀
是说你没有比较器中断的函数   interrupt 21呀!!!!!
interrupt 21  在哪里呢?不用这个中断,但开启了比较器中断,就得有这个中断函数,哪怕是在中断程序中只有一条_nop_ ();
回复

使用道具 举报

ID:951974 发表于 2022-12-22 14:29 | 显示全部楼层
flag1ms=1; 你这个标志只有一个,但是清零的地方又很多,这不是乱套了吗
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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