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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3302|回復: 3
打印 上一主題 下一主題
收起左側

歡迎來討論一下STC單片機的定時器中斷

[復制鏈接]
跳轉到指定樓層
樓主
平時經常遇到關于單片機定時器中斷的帖子,總有人喜歡在中斷里面做一大堆操作。今天把STC15W4K的5個定時器中斷全開,然后在中斷入口放了Delay函數,發現一個特別奇怪的現象。 對應12864的顯示,下面的代碼屏幕顯示正常,T2、T3、T4都是準確的,但是T0、T1是什么原因會慢的呢?請大佬們不吝賜教。!

#include "SysDefine.h"
#include "Peripheral.h"
#include "Lcd.h"
/*******************************************************************************
*
* 程序類別          : IAP15W4K61S4定時中斷測試
* 芯片時鐘          : 22.1184MHz
* 人機界面          : LCD12864
*
//------------------------------------------------------------------*/

unsigned int T0Sign = 0;
unsigned int T0Flag = 0;
unsigned int T1Sign = 0;
unsigned int T1Flag = 0;
unsigned int T2Sign = 0;
unsigned int T2Flag = 0;
unsigned int T3Sign = 0;
unsigned int T3Flag = 0;
unsigned int T4Sign = 0;
unsigned int T4Flag = 0;

void Timer0Init(void)                //1毫秒@22.1184MHz
{
        AUXR |= 0x80;                //定時器時鐘1T模式
        TMOD &= 0xF0;                //設置定時器模式
        TL0 = 0x9A;                //設置定時初值
        TH0 = 0xA9;                //設置定時初值
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時
}
void Timer1Init(void)                //5毫秒@22.1184MHz
{
        AUXR &= 0xBF;                //定時器時鐘12T模式
        TMOD &= 0x0F;                //設置定時器模式
        TL1 = 0x00;                //設置定時初值
        TH1 = 0xDC;                //設置定時初值
        TF1 = 0;                //清除TF1標志
        TR1 = 1;                //定時器1開始計時
}
void Timer2Init(void)                //10毫秒@22.1184MHz
{
        AUXR &= 0xFB;                //定時器時鐘12T模式
        T2L = 0x00;                //設置定時初值
        T2H = 0xB8;                //設置定時初值
        AUXR |= 0x10;                //定時器2開始計時
}
void Timer3Init(void)                //20毫秒@22.1184MHz
{
        T4T3M &= 0xFD;                //定時器時鐘12T模式
        T3L = 0x00;                //設置定時初值
        T3H = 0x70;                //設置定時初值
        T4T3M |= 0x08;                //定時器3開始計時
}
void Timer4Init(void)                //20毫秒@22.1184MHz
{
        T4T3M &= 0xDF;                //定時器時鐘12T模式
        T4L = 0x00;                //設置定時初值
        T4H = 0x70;                //設置定時初值
        T4T3M |= 0x80;                //定時器4開始計時
}
void Delay4ms()                //@22.1184MHz
{
        unsigned char i, j;
        _nop_();
        _nop_();
        i = 87;
        j = 12;
        do
        {
                while (--j);
        } while (--i);
}
void Delay15ms()                //@22.1184MHz
{
        unsigned char i, j, k;
        _nop_();
        _nop_();
        i = 2;
        j = 67;
        k = 183;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void Delay30ms()                //@22.1184MHz
{
        unsigned char i, j, k;
        _nop_();
        _nop_();
        i = 3;
        j = 134;
        k = 115;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void main(void)
{  
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M1 = 0x00;   
    P1M0 = 0x00;   
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;
    LCD_Init();   
    Timer0Init();        
    Timer1Init();
    Timer2Init();
    Timer3Init();
    Timer4Init();  
    ET0 = 1;
    ET1 = 1;
    IE2 |= 0x64;                    //開定時器2中斷
    //IE2 |= 0x20;                    //開定時器3中斷
    //IE2 |= 0x40;                    //開定時器4中斷
    EA = 1;        
    while(1)
    {                                                  
         LCD_TextOut(80,0,DOT12,0,0,"T0:");
         LCD_TextOut(80,12,DOT12,0,0,"T1:");
         LCD_TextOut(80,24,DOT12,0,0,"T2:");
         LCD_TextOut(80,36,DOT12,0,0,"T3:");
         LCD_TextOut(80,48,DOT12,0,0,"T4:");
                        
         LCD_DisplayData(100,0,T0Flag);
         LCD_DisplayData(100,12,T1Flag);
         LCD_DisplayData(100,24,T2Flag);
         LCD_DisplayData(100,36,T3Flag);
         LCD_DisplayData(100,48,T4Flag);        
    } //end while(1)
} //end main

void tm0_isr() interrupt 1         //中斷入口
{
         T0Sign++;
         if(T0Sign%1000==0)
         {
                 T0Sign = 0;
                 T0Flag++;
         }
}

void t1int() interrupt 3        //中斷入口
{
         T1Sign++;
         if(T1Sign%200==0)
         {
                 T1Sign = 0;
                 T1Flag++;
         }
         //Delay4ms();
}

void t2int() interrupt 12           //中斷入口
{
         T2Sign++;
         if(T2Sign%100==0)
         {
                 T2Sign = 0;
                 T2Flag++;
         }
         //Delay4ms();
}
void t3int() interrupt 19           //中斷入口
{
         T3Sign++;
         if(T3Sign%50==0)
         {
                 T3Sign = 0;
                 T3Flag++;
         }
         //Delay15ms();
}
void t4int() interrupt 20           //中斷入口
{
         T4Sign++;
         if(T4Sign%50==0)
         {
                 T4Sign = 0;
                 T4Flag++;
         }
         Delay15ms();
         //Delay30ms();
}

aa.jpg (144.99 KB, 下載次數: 63)

aa.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:277550 發表于 2021-5-28 09:05 | 只看該作者
中斷中,不暫停的中斷,要盡量少指令 。



不要寫    Delay15ms(); 這樣的延時,這樣的延時是阻塞的。

if(T1Sign%200==0){
                 T1Sign = 0;
                 T1Flag++;
         }
也不要寫這樣的判斷,寫到主函數。
回復

使用道具 舉報

板凳
ID:451718 發表于 2021-5-28 10:42 | 只看該作者
devcang 發表于 2021-5-28 09:05
中斷中,不暫停的中斷,要盡量少指令 。

這也不要,那也不要,定時器中斷里面能干些啥呢?   Delay放到定時器中斷, 就是想測試一下中斷優先級,T0、T1都是高優先級的,為什么計數反而受影響呢?
回復

使用道具 舉報

地板
ID:569384 發表于 2021-5-28 14:03 | 只看該作者
robinsonlin 發表于 2021-5-28 10:42
這也不要,那也不要,定時器中斷里面能干些啥呢?   Delay放到定時器中斷, 就是想測試一下中斷優先級,T ...

你愛怎么用都可以,別人也管不著
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩在线精品 | 中文字幕亚洲一区二区三区 | 久在线视频播放免费视频 | 综合五月婷 | 亚洲国产精品久久久久婷婷老年 | 亚洲欧洲色视频 | 欧美成人a∨高清免费观看 欧美日韩中 | 91精品国产乱码久久久 | 欧美区日韩区 | 久久精品国产99国产精品亚洲 | 欧美日韩高清在线一区 | 精品国产一区二区国模嫣然 | 日本色婷婷 | 免费在线一区二区 | 亚洲国产成人精品久久久国产成人一区 | 国产精品久久99 | 久久精品免费 | 亚洲欧美激情网 | 精品免费国产视频 | 国产精品一区二区三区久久 | 精品美女久久久久久免费 | 欧美精品一 | 欧美亚洲高清 | 精品免费视频 | 欧美精品一区二区三区在线 | 久久久久久高潮国产精品视 | 免费一区二区三区在线视频 | 国产在线中文字幕 | 欧美激情精品久久久久久 | 精品一区二区三区免费毛片 | 久久r精品 | 日韩视频精品在线 | www97影院 | 日韩视频在线免费观看 | 免费久 | 午夜精品久久久久久久久久久久 | 国产精品久久久久久网站 | 在线观看亚洲精品视频 | 黄色国产在线播放 | 最近最新中文字幕 | 欧美三区视频 |