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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

萌新關于秒表用中斷方式做出啟動停止復位

[復制鏈接]
跳轉到指定樓層
樓主
ID:265318 發表于 2017-12-25 10:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
20黑幣
中斷是個什么鬼,自學的,書上中斷含含糊糊所以我一直用的查詢,而且也做出來了,可是網上一直查不到中斷的意思,有木有大佬為我解惑最好帶一點例子。

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

使用道具 舉報

來自 2#
ID:266627 發表于 2017-12-26 20:35 | 只看該作者
比如你買了個手機打入電話不會響鈴和振動,只有屏幕上會顯示來電。

平時你手頭工作又多,但電話也不能錯過,可能是你老板的電話也可能是女朋友的,那怎么辦?
這種情況下,你只能不時的停下來,拿起手機看一看,耽誤工作效率不說,還經常錯過電話。只因為有時電話只呼叫幾秒,而你正是這幾秒里沒有停下查看,這樣錯過重要電話。

或許覺得這個手機夠差的,有電話你直接響鈴不好嗎,我聽到電話再停下來。這個響鈴功能就是中斷。


最早期的單片機沒有中斷,也是出于需要加入的。

評分

參與人數 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:231046 發表于 2017-12-25 14:20 | 只看該作者
中斷就是 做什么 事時,突然有人來打擾了,中斷會優先處理打擾的這件事,有優先級的
回復

使用道具 舉報

地板
ID:231046 發表于 2017-12-25 14:21 | 只看該作者
比查詢快而且簡單,不影響主程序時間
回復

使用道具 舉報

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

使用道具 舉報

6#
ID:213173 發表于 2017-12-25 16:31 | 只看該作者
給你一個6位顯示百分秒表例程,單鍵控制開啟、暫停、復位。你根據實際電路更改端口定義。
#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;                //中斷計時變量

bit zantin=0;                                        //暫停標志
void display();                                        //顯示程序聲明
void keyscan();                                        //按鍵掃描程序聲明
/***********按鍵掃描程序****************/
void keyscan()       
{
        static uint count2=0,count1=0;        //計數變量                       
        static bit key_sign=0;                                        //按鍵狀態標志
        if(key1==0)                                //檢測輸入如果為0
        {
                count1++;                                        //計數延時消抖
                if((count1>=500)&&(key_sign==0))//檢測按鍵如果為0
                {                       
                        key_sign=1;                //按鍵狀態標志置1,防止重復響應
                        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;//計時
                                case 2:        zantin=0;        break;//暫停
                        }               
                }
        }
        else
        {
                count1=0;                                //計數變量清0
                key_sign=0;                                //按鍵狀態標志清0
        }
}
/***********定時器初始化程序****************/
void Timer0Init(void)                //2500微秒@11.0592MHz
{
        TMOD = 0x01;                //設置定時器模式
        TL0 = 0x00;                //設置定時初值
        TH0 = 0xF7;                //設置定時初值
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時
        EA=1;                                                        //開總中斷
        ET0=1;                                                //開定時器0中斷
}
/***************主程序****************/
void main()
{
        Timer0Init();                                //定時器初始化
        while(1)
        {
                keyscan();                                //按鍵掃描
        }
}
/**************中斷服務程序*****************/
void timer0() interrupt        1//2500微秒@11.0592MHz
{
        TL0 = 0x00;                //設置定時初值
        TH0 = 0xF7;                //設置定時初值
        Cntus++;                                        //中斷變量Cntus自+1
        if(Cntus>=4)                                //10ms
        {
                Cntus=0;                                //清0
                if(zantin==1)                        //暫停/啟動
                        Cnt10ms++;                        //毫秒計數
                if(Cnt10ms>=100)
                {
                        Cnt10ms=0;
                        Cnt1s++;                                //秒計數
                        if(Cnt1s>=60)
                        {
                                Cnt1s=0;
                                Cnt1min++;                //分計數
                                if(Cnt1min>=100)
                                        Cnt1min=0;
                        }
                }
        }
        display();                                        //顯示程序
}
void display()//顯示程序
{
        static uchar count=0;        //計數變量
        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;        //顯示分位加點
                   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;//顯示秒位加點
                   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;
        }
}
回復

使用道具 舉報

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

抱歉,前幾天考試沒時間回復我覺得您的回復算是比較有幫助了,但是如果鍵盤要用外部中斷呢?
回復

使用道具 舉報

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

typedef unsigned int u16;          //對數據類型進行聲明定義
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];
/*******************************************************************************
* 函 數 名         : delay
* 函數功能                   : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)  
{
        while(i--);       
}

/*******************************************************************************
* 函 數 名         : Timer0Init
* 函數功能                   : 定時器0初始化
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Timer0Init()
{
        TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
        TH0=0Xd8;        //給定時器賦初值,定時10ms
        TL0=0Xf0;       
        ET0=1;//打開定時器0中斷允許
        EA=1;//打開總中斷
        TR0=1;//打開定時器
                               
}
                                                               
/*******************************************************************************
* 函 數 名         : DigDisplay
* 函數功能                   : 數碼管動態掃描函數,循環掃描8個數碼管顯示
*******************************************************************************/
void DigDisplay()
{
        u8 i;
        for(i=0;i<8;i++)
        {
                switch(i)         //位選,選擇點亮的數碼管,
                {
                        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];//發送段碼
                delay(100); //間隔一段時間掃描       
                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];
}
/*******************************************************************************
* 函 數 名       : main
* 函數功能                 : 主函數
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{       
        Timer0Init();  //定時器0初始化
                    IT0=0;   //外部中斷0下降沿觸發
     IT1=0;   //外部中斷1 下降沿觸發
     EX0=1;   //外部中斷0允許
     EX1=1;   //外部中斷1
         EA=1;
                while(1)
        {
                datapros();
                DigDisplay();       
        }               
}

/*******************************************************************************
* 函 數 名         : void Timer0() interrupt 1
* 函數功能                   : 定時器0中斷函數
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Timer0() interrupt 1
{
        TH0=0Xd8;        //給定時器賦初值,定時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);
           }
            
回復

使用道具 舉報

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

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

使用道具 舉報

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

這樣寫:if(k0==0)、if(k1==0)。
回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产 | 久久久久久久久毛片 | 美女视频黄的 | 国产精品久久久久久久久久久久午夜片 | 人和拘一级毛片c | 99久久精品免费看国产四区 | 日韩精品一区二区三区在线观看 | 久久久蜜桃 | 一区二区国产精品 | 国产精品99久久久久久久久久久久 | 亚洲欧美中文字幕在线观看 | 欧美男人的天堂 | 蜜臀久久99精品久久久久久宅男 | 久久伊人精品 | 精品99久久 | 成人精品一区二区 | 久综合| 色婷婷精品久久二区二区蜜臂av | caoporn国产精品免费公开 | 看真人视频一级毛片 | 亚洲欧美在线视频 | 狠狠操狠狠 | 在线国产一区二区三区 | 伊人艹 | 国产一区二区a | 99精品免费在线观看 | 国产高清一二三区 | 欧美日韩高清在线一区 | 欧美在线视频一区二区 | 91影院在线观看 | 日韩成年人视频在线 | 久操伊人 | 亚洲自拍一区在线观看 | 亚洲精久久 | 日韩欧美在线播放 | 国产高清91 | 日p视频免费看 | 日韩精品成人一区二区三区视频 | 国产日韩欧美二区 | 日韩亚洲视频 | 97av在线|