找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2609|回復(fù): 5
收起左側(cè)

STC8A8K64S4A12單片機(jī) 當(dāng)打開比較器的時(shí)候,再開定時(shí)器0,就會(huì)開不了

[復(fù)制鏈接]
ID:510170 發(fā)表于 2021-9-16 13:32 | 顯示全部樓層 |閱讀模式
當(dāng)打開比較器的時(shí)候,再開定時(shí)器0,就會(huì)開不了。就算是開其它定時(shí)器的時(shí)候也會(huì)造成一些問(wèn)題。
源代碼

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

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

void init(void)
{
    SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR |= 0x01;                //串口1選擇定時(shí)器2為波特率發(fā)生器
        AUXR |= 0x04;                //定時(shí)器2時(shí)鐘為Fosc,即1T
        T2L = 0xE0;                //設(shè)定定時(shí)初值
        T2H = 0xFE;                //設(shè)定定時(shí)初值
        AUXR |= 0x10;                //啟動(dòng)定時(shí)器2
//    TR1 = 1;
    TI = 1;
        printf("Start\n");

}
void PWMInt(void)
{
    P_SW2 = 0x80;
    PWM1CR = 0x00;                              //PWM0/P2.0
    PWMCKS = 0x00;                              // PWM時(shí)鐘為系統(tǒng)時(shí)鐘
    PWMC   = 0x0058;                              //設(shè)置PWM周期為1000H個(gè)PWM時(shí)鐘
    PWM1T1 = 0x0000;                             //在計(jì)數(shù)值為100H地方輸出低電平
    PWM1T2 = 0x002C;                             //在計(jì)數(shù)值為500H地方輸出高電平
    PWM1CR = 0x80;                               //使能PWM1輸出
    P_SW2  = 0x00;
    PWMCR  |= 0x80;                               //啟動(dòng)PWM模塊
}
void CMPInt(void)
{
    CMPCR2 = 0x00;
    CMPCR2 &= ~0x80;                            //比較器正向輸出
    CMPCR2 &= ~0x40;                            //使能0.1us濾波
    CMPCR2 |= 0x3E;                             //比較器結(jié)果經(jīng)過(guò)63個(gè)去抖時(shí)鐘后輸出
    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;                //定時(shí)器時(shí)鐘1T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TL0 = 0xCD;                //設(shè)置定時(shí)初值
        TH0 = 0xD4;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
    ET0 = 1;        //使能定時(shí)器中斷
    EA = 1;
}

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

void TM1_Isr() interrupt 3
{
    flag1ms=1;                                //測(cè)試端口
}
void Timer1Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x40;                //定時(shí)器時(shí)鐘1T模式
        TMOD &= 0x0F;                //設(shè)置定時(shí)器模式
        TL1 = 0xCD;                //設(shè)置定時(shí)初值
        TH1 = 0xD4;                //設(shè)置定時(shí)初值
        TF1 = 0;                //清除TF1標(biāo)志
        TR1 = 1;                //定時(shí)器1開始計(jì)時(shí)
    ET1 = 1;                                    //使能定時(shí)器中斷
    EA = 1;
}/*
void TM3_Isr() interrupt 19
{
    flag1ms=1;                                 //測(cè)試端口
    AUXINTIF &= ~T3IF;                          //清中斷標(biāo)志
}

void Timer3Init(void)                //1毫秒@11.0592MHz
{
        T4T3M |= 0x02;                //定時(shí)器時(shí)鐘1T模式
        T3L = 0xCD;                //設(shè)置定時(shí)初值
        T3H = 0xD4;                //設(shè)置定時(shí)初值
        T4T3M |= 0x08;                //定時(shí)器3開始計(jì)時(shí)
    IE2 = ET3;          //使能定時(shí)器中斷
    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");
            }
        }            
    }
}





不知道是我的編譯器問(wèn)題,還是其它問(wèn)題,有沒有師兄復(fù)現(xiàn)下,看看是我的程序問(wèn)題還是單片機(jī)的bug謝謝了。
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2021-9-16 17:56 | 顯示全部樓層
單片機(jī)的bug在99.99的情況是人的bug
比較中斷開啟之后,你并沒有比較器中斷的函數(shù)   interrupt 21
一旦比較器中斷被觸發(fā),進(jìn)入中斷之后就沒有返回,程序直接跑飛........
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2021-9-16 21:48 | 顯示全部樓層
Y_G_G 發(fā)表于 2021-9-16 17:56
單片機(jī)的bug在99.99的情況是人的bug
比較中斷開啟之后,你并沒有比較器中斷的函數(shù)   interrupt 21
一旦比 ...

不管是什么中斷一但開啟必須有中斷入口函數(shù),否則中斷發(fā)生后都不知道執(zhí)行了什么指令,然后程序就飛了。
回復(fù)

使用道具 舉報(bào)

ID:510170 發(fā)表于 2021-9-17 08:21 來(lái)自手機(jī) | 顯示全部樓層
Y_G_G 發(fā)表于 2021-9-16 17:56
單片機(jī)的bug在99.99的情況是人的bug
比較中斷開啟之后,你并沒有比較器中斷的函數(shù)   interrupt 21
一旦比 ...

問(wèn)題是我沒有開啟比較器中斷呀,難道只要打開了ea就必須要進(jìn)比較器中斷關(guān)掉中斷嗎?我再研究下,謝謝了。
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2021-9-17 11:22 | 顯示全部樓層
ttmax3 發(fā)表于 2021-9-17 08:21
問(wèn)題是我沒有開啟比較器中斷呀,難道只要打開了ea就必須要進(jìn)比較器中斷關(guān)掉中斷嗎?我再研究下,謝謝了。

你以為這個(gè)是什么?CMPCR1 |= 0x30;                             //使能比較器邊沿中斷
沒有說(shuō)要關(guān)閉中斷呀
是說(shuō)你沒有比較器中斷的函數(shù)   interrupt 21呀!!!!!
interrupt 21  在哪里呢?不用這個(gè)中斷,但開啟了比較器中斷,就得有這個(gè)中斷函數(shù),哪怕是在中斷程序中只有一條_nop_ ();
回復(fù)

使用道具 舉報(bào)

ID:951974 發(fā)表于 2022-12-22 14:29 | 顯示全部樓層
flag1ms=1; 你這個(gè)標(biāo)志只有一個(gè),但是清零的地方又很多,這不是亂套了嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表