久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: STC8A8K64S4A12單片機 當打開比較器的時候,再開定時器0,就會開不了 [打印本頁]

作者: ttmax3    時間: 2021-9-16 13:32
標題: STC8A8K64S4A12單片機 當打開比較器的時候,再開定時器0,就會開不了
當打開比較器的時候,再開定時器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謝謝了。

作者: Y_G_G    時間: 2021-9-16 17:56
單片機的bug在99.99的情況是人的bug
比較中斷開啟之后,你并沒有比較器中斷的函數   interrupt 21
一旦比較器中斷被觸發,進入中斷之后就沒有返回,程序直接跑飛........
作者: npn    時間: 2021-9-16 21:48
Y_G_G 發表于 2021-9-16 17:56
單片機的bug在99.99的情況是人的bug
比較中斷開啟之后,你并沒有比較器中斷的函數   interrupt 21
一旦比 ...

不管是什么中斷一但開啟必須有中斷入口函數,否則中斷發生后都不知道執行了什么指令,然后程序就飛了。
作者: ttmax3    時間: 2021-9-17 08:21
Y_G_G 發表于 2021-9-16 17:56
單片機的bug在99.99的情況是人的bug
比較中斷開啟之后,你并沒有比較器中斷的函數   interrupt 21
一旦比 ...

問題是我沒有開啟比較器中斷呀,難道只要打開了ea就必須要進比較器中斷關掉中斷嗎?我再研究下,謝謝了。
作者: Y_G_G    時間: 2021-9-17 11:22
ttmax3 發表于 2021-9-17 08:21
問題是我沒有開啟比較器中斷呀,難道只要打開了ea就必須要進比較器中斷關掉中斷嗎?我再研究下,謝謝了。

你以為這個是什么?CMPCR1 |= 0x30;                             //使能比較器邊沿中斷
沒有說要關閉中斷呀
是說你沒有比較器中斷的函數   interrupt 21呀!!!!!
interrupt 21  在哪里呢?不用這個中斷,但開啟了比較器中斷,就得有這個中斷函數,哪怕是在中斷程序中只有一條_nop_ ();
作者: 1588848    時間: 2022-12-22 14:29
flag1ms=1; 你這個標志只有一個,但是清零的地方又很多,這不是亂套了嗎




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲国产成人精品久久久国产成人一区 | 日日操视频 | 一区二区三区免费 | 久久中文字幕一区 | 玖玖精品 | 国产麻豆一区二区三区 | 婷婷精品 | 香蕉超碰 | 精品99久久久久久 | 久久国产精品视频 | 国产精品久久久久久吹潮日韩动画 | 亚洲精品国产成人 | 五月激情婷婷网 | 午夜精品久久 | 99久久日韩精品免费热麻豆美女 | 青青草综合网 | 欧美激情在线一区二区三区 | 久久er精品 | 精品一区二区久久久久久久网站 | 九九热久久免费视频 | 亚洲一区二区中文字幕在线观看 | 精产国产伦理一二三区 | 亚洲人成一区二区三区性色 | 国产一区二区三区 | 亚洲一区二区三区在线视频 | 国产福利网站 | 粉嫩一区二区三区四区公司1 | 国产一区二区三区 | 奇米影视77 | 呦呦在线视频 | 久久久久无码国产精品一区 | 欧美日韩一区二区三区四区五区 | 美女在线一区二区 | 久久国产精品免费视频 | 久久亚洲国产精品 | 亚洲午夜精品视频 | 欧美1区 | 激情小视频 | 午夜免费观看网站 | 国产精品久久久99 | 欧美日韩在线国产 |