標(biāo)題: 利用單片機(jī)中斷按鍵計(jì)數(shù)(key)源程序 [打印本頁(yè)]

作者: qzxz    時(shí)間: 2021-11-23 18:24
標(biāo)題: 利用單片機(jī)中斷按鍵計(jì)數(shù)(key)源程序
定時(shí)器中斷是由單片機(jī)中的定時(shí)器溢出而申請(qǐng)的中斷。

51單片機(jī)中有兩個(gè)定時(shí)器T0和T1:

TF0:定時(shí)器T0溢出中斷請(qǐng)求。當(dāng)定時(shí)器TO產(chǎn)生溢出時(shí),TO中斷請(qǐng)求標(biāo)志TF0置1,請(qǐng)求中斷處理。

TF1:定時(shí)器T1溢出中斷請(qǐng)求。當(dāng)定時(shí)器Tl產(chǎn)生溢出時(shí),T1中斷請(qǐng)求標(biāo)志TF1置1,請(qǐng)求中斷處理。

Stm32共有11個(gè)定時(shí)器:

1.兩個(gè)高級(jí)定時(shí)器:TIM1、TIM8-------------------------APB2

2.四個(gè)通用定時(shí)器:TIM2~TIM5-------------------------APB1

3.兩個(gè)基本定時(shí)器:TIM6、TIM7-------------------------APB1

4.兩個(gè)看門狗

5.一個(gè)系統(tǒng)嘀嗒定時(shí)器(SysTick)


定時(shí)/計(jì)數(shù)器
編輯

定時(shí)/計(jì)數(shù)器T0和T1分別是由兩個(gè)8位的專用寄存器組成,即定時(shí)/計(jì)數(shù)器T0由TH0和TL0組成,T1由TH1和TL1組成。此外,其內(nèi)部還有2個(gè)8位的特殊功能寄存器TMOD和TCON,TMOD負(fù)責(zé)控制和確定T0和T1的功能和工作模式,TCON用來(lái)控制T0和T1啟動(dòng)或停止計(jì)數(shù),同時(shí)包含定時(shí)/計(jì)數(shù)器的狀態(tài)。 [1]

TF1:定時(shí)器1溢出標(biāo)志。定時(shí)/計(jì)數(shù)器溢出時(shí)由硬件置位。中斷處理時(shí)由硬件清除;蛴密浖宄。

TF0:定時(shí)器0溢出標(biāo)志。定時(shí)/計(jì)數(shù)器溢出時(shí)由硬件置位。中斷處理時(shí)由硬件清除,或用軟件清除。

工作流程
編輯

定時(shí)器工作的流程可以按照這個(gè)順序(以51為例用定時(shí)器0方式一產(chǎn)生10毫秒的定時(shí))

1、確定使用哪個(gè)定時(shí)器,使用哪種方式,這一步通過(guò)TMOD設(shè)置,TMOD的低四位是設(shè)置定時(shí)器0的,高四位是用來(lái)設(shè)置定時(shí)器1的,其中的M0,M1是用來(lái)設(shè)置定時(shí)器工作在哪種方式,GATE一般用不要設(shè)置,C/T是選擇計(jì)數(shù)模式還是定時(shí)模式的,如:TMOD = 0X01,就說(shuō)明定時(shí)器0工作在方式1。

2、接下來(lái)就要設(shè)置定時(shí)的時(shí)間,用定時(shí)器定時(shí)50毫秒,可以用這種方式TH0 = (65535 - 10000) / 256,TL0 = (65535 - 10000) % 256;可以這樣理解:因?yàn)檫@是定時(shí)器的初值,也就是說(shuō)計(jì)數(shù)脈沖就是在這個(gè)數(shù)的基礎(chǔ)上向上遞增,到達(dá)65535后就溢出產(chǎn)生中斷。

3、第三步打開(kāi)中斷,使用IE寄存器,首先打開(kāi)總中斷EA = 1,這一步是所有中斷所必須的,然后打開(kāi)定時(shí)器0中斷,ET0 =1。

4、這時(shí)準(zhǔn)備工作結(jié)束,啟動(dòng)定時(shí)器,使用TCON寄存器,TR0 = 1,實(shí)現(xiàn)了一個(gè)10毫秒的定時(shí)。



代碼如下:(中斷時(shí)間根據(jù)情況改變)

#include <reg51.h>
#include <delay.h>
sbit key1 = P0^0;
sbit LED1 = P3^0;
#define DataPort P1     //宏定義,如果換接口,需要修改這里
sbit Seg_Latch = P2^2;   //段鎖存
sbit Bit_Latch = P2^3;   //位鎖存
unsigned char code Seg_Code[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //段碼
unsigned char code Bit_Code[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //位碼
void Display(unsigned char m,unsigned char num,unsigned int n);
unsigned char i;
void main()
{

        TMOD = 0x01;

        EA = 1;        //開(kāi)中斷
        ET0 = 1;
        //因?yàn)橹挥幸粋(gè)中斷,所以IP不用設(shè)置
        TH0 = (65536 - 400) / 256;   
        TL0 = (65536 - 400) % 256;        
        TR0 = 1;   //開(kāi)啟定時(shí)器0,等待中斷的到來(lái)
        while(1)
        {               
                key1 = 1;
                if(!key1)  //按下key1
                {
                        DelayMs(50);   
                        if(!key1)   //判斷key1是否持續(xù)按下,進(jìn)行防抖測(cè)試
                        {
//                                while(!key1) //
                                {
                                        LED1 = ~LED1;

                                }
                                while(!key1);
                                LED1 = 1;
                        }
                        i++;
                        if(i > 19)
                        {
                                i = 0;
                        }

                        Display(1,2,i);                       

                }

        }
}

void Display(unsigned char m,unsigned char num,unsigned int n)   //兩位共陰極數(shù)碼管顯示數(shù)字
{
      unsigned char j,a[5];

        a[0] = n / 10;
        a[1] = n % 10;

        for(j = m-1;j < num;j++)
        {
                DataPort = 0;
                Seg_Latch = 1;  //段開(kāi)門
                Seg_Latch = 0;   //段關(guān)門

                DataPort = Bit_Code[j];  //送位碼,鎖定第m位
                Bit_Latch = 1;    //位開(kāi)門
                Bit_Latch = 0;    //位關(guān)門

                DataPort = Seg_Code[a[j]];  //送段碼
                Seg_Latch = 1;  //段開(kāi)門
                Seg_Latch = 0;   //段關(guān)門
        }

}   
void T0_ISR(void) interrupt 1
{
        unsigned char j;

        EA = 0;   //如果你不想被其他中斷打斷,屏蔽中斷
        TH0 = (65536 - 400) / 256;   //
        TL0 = (65536 - 400) % 256;        
        Display(1,2,i);


        EA = 1;
}



作者: hz_dyg    時(shí)間: 2021-11-29 13:55
不要再發(fā)這樣的程序了,誤人子弟!
作者: qzxz    時(shí)間: 2021-11-30 21:25
hz_dyg 發(fā)表于 2021-11-29 13:55
不要再發(fā)這樣的程序了,誤人子弟!

抱歉,抱歉




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1