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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4543|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

萌新關(guān)于秒表用中斷方式做出啟動(dòng)停止復(fù)位

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:265318 發(fā)表于 2017-12-25 10:21 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
20黑幣
中斷是個(gè)什么鬼,自學(xué)的,書(shū)上中斷含含糊糊所以我一直用的查詢,而且也做出來(lái)了,可是網(wǎng)上一直查不到中斷的意思,有木有大佬為我解惑最好帶一點(diǎn)例子。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

來(lái)自 2#
ID:266627 發(fā)表于 2017-12-26 20:35 | 只看該作者
比如你買(mǎi)了個(gè)手機(jī)打入電話不會(huì)響鈴和振動(dòng),只有屏幕上會(huì)顯示來(lái)電。

平時(shí)你手頭工作又多,但電話也不能錯(cuò)過(guò),可能是你老板的電話也可能是女朋友的,那怎么辦?
這種情況下,你只能不時(shí)的停下來(lái),拿起手機(jī)看一看,耽誤工作效率不說(shuō),還經(jīng)常錯(cuò)過(guò)電話。只因?yàn)橛袝r(shí)電話只呼叫幾秒,而你正是這幾秒里沒(méi)有停下查看,這樣錯(cuò)過(guò)重要電話。

或許覺(jué)得這個(gè)手機(jī)夠差的,有電話你直接響鈴不好嗎,我聽(tīng)到電話再停下來(lái)。這個(gè)響鈴功能就是中斷。


最早期的單片機(jī)沒(méi)有中斷,也是出于需要加入的。

評(píng)分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:231046 發(fā)表于 2017-12-25 14:20 | 只看該作者
中斷就是 做什么 事時(shí),突然有人來(lái)打擾了,中斷會(huì)優(yōu)先處理打擾的這件事,有優(yōu)先級(jí)的
回復(fù)

使用道具 舉報(bào)

地板
ID:231046 發(fā)表于 2017-12-25 14:21 | 只看該作者
比查詢快而且簡(jiǎn)單,不影響主程序時(shí)間
回復(fù)

使用道具 舉報(bào)

5#
ID:78322 發(fā)表于 2017-12-25 15:11 | 只看該作者
中斷啊,就是你本來(lái)一直在跑步,可是突然你膀胱脹痛需要放水,然后去旁邊放水,完事還需要回到原來(lái)的地方繼續(xù)跑步。
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2017-12-25 16:31 | 只看該作者
給你一個(gè)6位顯示百分秒表例程,單鍵控制開(kāi)啟、暫停、復(fù)位。你根據(jù)實(shí)際電路更改端口定義。
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^6;       
sbit dula=P2^6;                        //段選
sbit wela=P2^7;                        //位選
uchar code table[]={
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
uchar Cntus=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0;                //中斷計(jì)時(shí)變量

bit zantin=0;                                        //暫停標(biāo)志
void display();                                        //顯示程序聲明
void keyscan();                                        //按鍵掃描程序聲明
/***********按鍵掃描程序****************/
void keyscan()       
{
        static uint count2=0,count1=0;        //計(jì)數(shù)變量                       
        static bit key_sign=0;                                        //按鍵狀態(tài)標(biāo)志
        if(key1==0)                                //檢測(cè)輸入如果為0
        {
                count1++;                                        //計(jì)數(shù)延時(shí)消抖
                if((count1>=500)&&(key_sign==0))//檢測(cè)按鍵如果為0
                {                       
                        key_sign=1;                //按鍵狀態(tài)標(biāo)志置1,防止重復(fù)響應(yīng)
                        count2++;
                        if(count2>=3)
                                count2=0;
                        switch(count2)
                        {
                                case 0:        Cntus=0;
                                                        Cnt10ms=0;
                                                        Cnt1s=0;
                                                        Cnt1min=0;        break;//清0
                                case 1:        zantin=1;   break;//計(jì)時(shí)
                                case 2:        zantin=0;        break;//暫停
                        }               
                }
        }
        else
        {
                count1=0;                                //計(jì)數(shù)變量清0
                key_sign=0;                                //按鍵狀態(tài)標(biāo)志清0
        }
}
/***********定時(shí)器初始化程序****************/
void Timer0Init(void)                //2500微秒@11.0592MHz
{
        TMOD = 0x01;                //設(shè)置定時(shí)器模式
        TL0 = 0x00;                //設(shè)置定時(shí)初值
        TH0 = 0xF7;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
        EA=1;                                                        //開(kāi)總中斷
        ET0=1;                                                //開(kāi)定時(shí)器0中斷
}
/***************主程序****************/
void main()
{
        Timer0Init();                                //定時(shí)器初始化
        while(1)
        {
                keyscan();                                //按鍵掃描
        }
}
/**************中斷服務(wù)程序*****************/
void timer0() interrupt        1//2500微秒@11.0592MHz
{
        TL0 = 0x00;                //設(shè)置定時(shí)初值
        TH0 = 0xF7;                //設(shè)置定時(shí)初值
        Cntus++;                                        //中斷變量Cntus自+1
        if(Cntus>=4)                                //10ms
        {
                Cntus=0;                                //清0
                if(zantin==1)                        //暫停/啟動(dòng)
                        Cnt10ms++;                        //毫秒計(jì)數(shù)
                if(Cnt10ms>=100)
                {
                        Cnt10ms=0;
                        Cnt1s++;                                //秒計(jì)數(shù)
                        if(Cnt1s>=60)
                        {
                                Cnt1s=0;
                                Cnt1min++;                //分計(jì)數(shù)
                                if(Cnt1min>=100)
                                        Cnt1min=0;
                        }
                }
        }
        display();                                        //顯示程序
}
void display()//顯示程序
{
        static uchar count=0;        //計(jì)數(shù)變量
        switch(count)
        {
                case 0:
                   P0=table[Cnt1min/10];        //顯示十分位
                   dula=1;
                   dula=0;
               
                   P0=0x7e;
                   wela=1;
                   wela=0;
                   count=1;
                break;
                case 1:                               
                   P0=table[Cnt1min%10]|0x80;        //顯示分位加點(diǎn)
                   dula=1;
                   dula=0;

                   P0=0x7d;
                   wela=1;
                   wela=0;
                   count=2;
                break;
                case 2:                               
                   P0=table[Cnt1s/10];        //顯示十秒位
                   dula=1;
                   dula=0;
               
                   P0=0x7b;
                   wela=1;
                   wela=0;
                   count=3;
                break;
                case 3:                                       
                   P0=table[Cnt1s%10]|0x80;//顯示秒位加點(diǎn)
                   dula=1;
                   dula=0;
               
                   P0=0x77;
                   wela=1;
                   wela=0;
                   count=4;
                break;
                case 4:       
                   P0=table[Cnt10ms/10];                //顯示十分秒位
                   dula=1;
                   dula=0;
               
                   P0=0xef;
                   wela=1;
                   wela=0;
                   count=5;
                break;
                case 5:       
                   P0=table[Cnt10ms%10];                //顯示百分秒位
                   dula=1;
                   dula=0;
               
                   P0=0xdf;
                   wela=1;
                   wela=0;
                   count=0;
                break;
        }
}
回復(fù)

使用道具 舉報(bào)

7#
ID:265318 發(fā)表于 2018-1-3 21:46 | 只看該作者
wulin 發(fā)表于 2017-12-25 16:31
給你一個(gè)6位顯示百分秒表例程,單鍵控制開(kāi)啟、暫停、復(fù)位。你根據(jù)實(shí)際電路更改端口定義。
#include
#def ...

抱歉,前幾天考試沒(méi)時(shí)間回復(fù)我覺(jué)得您的回復(fù)算是比較有幫助了,但是如果鍵盤(pán)要用外部中斷呢?
回復(fù)

使用道具 舉報(bào)

8#
ID:265318 發(fā)表于 2018-1-3 21:49 | 只看該作者
#include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器

typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k0=P3^2;
sbit k1=P3^3;

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值

u8 ssec,sec,min;
u8 DisplayData[8];
/*******************************************************************************
* 函 數(shù) 名         : delay
* 函數(shù)功能                   : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
*******************************************************************************/
void delay(u16 i)  
{
        while(i--);       
}

/*******************************************************************************
* 函 數(shù) 名         : Timer0Init
* 函數(shù)功能                   : 定時(shí)器0初始化
* 輸    入         : 無(wú)
* 輸    出         : 無(wú)
*******************************************************************************/
void Timer0Init()
{
        TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開(kāi)啟動(dòng)。
        TH0=0Xd8;        //給定時(shí)器賦初值,定時(shí)10ms
        TL0=0Xf0;       
        ET0=1;//打開(kāi)定時(shí)器0中斷允許
        EA=1;//打開(kāi)總中斷
        TR0=1;//打開(kāi)定時(shí)器
                               
}
                                                               
/*******************************************************************************
* 函 數(shù) 名         : DigDisplay
* 函數(shù)功能                   : 數(shù)碼管動(dòng)態(tài)掃描函數(shù),循環(huán)掃描8個(gè)數(shù)碼管顯示
*******************************************************************************/
void DigDisplay()
{
        u8 i;
        for(i=0;i<8;i++)
        {
                switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//顯示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//顯示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//顯示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//顯示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//顯示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//顯示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//顯示第7位       
                }
                P0=DisplayData[i];//發(fā)送段碼
                delay(100); //間隔一段時(shí)間掃描       
                P0=0x00;//消隱
        }
}

void datapros()
{
        DisplayData[0]=smgduan[ssec%10];
        DisplayData[1]=smgduan[ssec/10];
        DisplayData[2]=0x40;       
        DisplayData[3]=smgduan[sec%10];
        DisplayData[4]=smgduan[sec/10];
        DisplayData[5]=0x40;
        DisplayData[6]=smgduan[min%10];
        DisplayData[7]=smgduan[min/10];
}
/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能                 : 主函數(shù)
* 輸    入       : 無(wú)
* 輸    出             : 無(wú)
*******************************************************************************/
void main()
{       
        Timer0Init();  //定時(shí)器0初始化
                    IT0=0;   //外部中斷0下降沿觸發(fā)
     IT1=0;   //外部中斷1 下降沿觸發(fā)
     EX0=1;   //外部中斷0允許
     EX1=1;   //外部中斷1
         EA=1;
                while(1)
        {
                datapros();
                DigDisplay();       
        }               
}

/*******************************************************************************
* 函 數(shù) 名         : void Timer0() interrupt 1
* 函數(shù)功能                   : 定時(shí)器0中斷函數(shù)
* 輸    入         : 無(wú)
* 輸    出         : 無(wú)
*******************************************************************************/
void Timer0() interrupt 1
{
        TH0=0Xd8;        //給定時(shí)器賦初值,定時(shí)10ms
        TL0=0Xf0;
        ssec++;
        if(ssec>=100)  //1s
        {
                ssec=0;
                sec++;
                if(sec>=60)
                {
                        sec=0;
                        min++;
                        if(min>=60)
                        {
                                min=0;
                        }
                }       
        }       
}
void key0() interrupt 0
{                  delay(1000);
if(k0=0)


           {TR0=!TR0;}
                   while(!k0);
           }
             
             
void key1() interrupt 2
{        delay(1000);
if(k1=0)

         {sec=0;
          min=0;
       
          }
          while(!k1);
           }
            
回復(fù)

使用道具 舉報(bào)

9#
ID:265318 發(fā)表于 2018-1-3 21:50 | 只看該作者
wulin 發(fā)表于 2017-12-25 16:31
給你一個(gè)6位顯示百分秒表例程,單鍵控制開(kāi)啟、暫停、復(fù)位。你根據(jù)實(shí)際電路更改端口定義。
#include
#def ...

另外我把我做的放在了樓下如果您有時(shí)間可以幫忙看一下的話感激不敬
回復(fù)

使用道具 舉報(bào)

10#
ID:213173 發(fā)表于 2018-1-4 06:35 | 只看該作者
zjjmw 發(fā)表于 2018-1-3 21:50
另外我把我做的放在了樓下如果您有時(shí)間可以幫忙看一下的話感激不敬

這樣寫(xiě):if(k0==0)、if(k1==0)。
回復(fù)

使用道具 舉報(bào)

11#
ID:265318 發(fā)表于 2018-1-4 18:17 來(lái)自手機(jī) | 只看該作者
wulin 發(fā)表于 2018-1-4 06:35
這樣寫(xiě):if(k0==0)、if(k1==0)。

感謝,確實(shí)是這樣。。。。但是又有個(gè)新問(wèn)題。k1復(fù)位鍵我加了一個(gè)TR0=0使它復(fù)位后暫停,但是安完后毫秒位會(huì)變成1,得再按一下才會(huì)為零。。(另外k1=0為啥要用==。
回復(fù)

使用道具 舉報(bào)

12#
ID:130231 發(fā)表于 2018-1-8 23:37 | 只看該作者
zjjmw 發(fā)表于 2018-1-4 18:17
感謝,確實(shí)是這樣。。。。但是又有個(gè)新問(wèn)題。k1復(fù)位鍵我加了一個(gè)TR0=0使它復(fù)位后暫停,但是安完后毫秒位 ...

k1=0的意思就是 使之等于0.  并不是測(cè)試K1是否等于0。用if(k1==0)的意思就是測(cè)試K1是否等于0.如果你硬是暴力把它去掉一個(gè)等于。if語(yǔ)句可能就不同意了呀!。if語(yǔ)句可能就不成立了呀!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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