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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2558|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 韩日在线 | 日韩中文字幕一区 | av看看| 国产精品三级久久久久久电影 | 密色视频| 亚洲三区在线观看 | 日韩国产欧美在线观看 | 日韩一级免费电影 | www.久久影视 | 天天操天天摸天天干 | 国产a级毛片 | 日韩伦理一区二区三区 | 欧美成人精品在线 | 欧美人成在线视频 | 国产综合久久 | 日韩欧美在线播放 | 日韩在线视频一区二区三区 | 中文字幕亚洲精品 | 亚洲视频精品在线 | 99精品久久 | 日韩久久久久久 | 一级黄色片免费在线观看 | 久日精品| 亚洲精选久久 | 精品无码久久久久国产 | 欧美日韩国产一区二区 | 久久精品成人热国产成 | 天堂国产 | 国产福利91精品 | 一区二区三区在线播放 | 亚洲中字在线 | 999精品视频在线观看 | 国产激情偷乱视频一区二区三区 | 精品视频在线播放 | 99久久久无码国产精品 | 2019精品手机国产品在线 | 我爱操| 一级黄色片在线看 | www.嫩草 | 亚洲综合在线一区 | av毛片免费 |