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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機中INT0中斷程序請教大家

[復制鏈接]
跳轉到指定樓層
樓主
ID:634487 發表于 2020-1-9 21:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
之前的一個按鍵控制兩個狀態。 我想把按鍵中斷最優先。
程序移植到中斷后,不能運行。但是中斷還是有的。
這兩天學習中斷,請大家給些指點。

#include <STC15Wxx.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

sbit key=P3^2;               
sbit LED1=P3^0;                        
sbit LED2=P3^1;                        
                                
bit key_flag = 0;//按鍵有效標志位變量
uchar count = 0;//中斷計數變量

void delayms(uint xms) //添加延時
{
        uint i, j;
        for(i=xms;i>0;i--)
                for(j=1150;j>0;j--);//1T單片機
}

void Int0Init()
{
        TMOD= 0x01;                //設置定時器模式
        TH0 = 0xDC;                //10毫秒@11.0592MHz
        TL0 = 0x00;                //10毫秒@11.0592MHz
        TR0 = 0;                        //定時器0關閉
        ET0 = 1;                        //開定時器0中斷
            IT0 = 1;        //設置外部中斷的觸發方式為下降沿觸發。
             EX0 = 1;        //開啟外部中斷0
             EA = 1;                //中斷總開關
}

void main()
{        
        Int0Init();              
        while(1);
}

void Int0() interrupt 0
{
  if(key == 0)//判斷鍵按下
                {
                        delayms(10);//延時10ms防抖
                        if(key == 0)//確認鍵按下
                        {
                                key_flag = 1; //有效標志位置1
                                TR0 = 1;                        //開定時器
                                while(!key);        //等待松手
                                TR0 = 0;                        //關定時器
                        }
                }
                if(key_flag)                        //判斷按鍵有效
                {
                        if(count>=100)        //超過1秒算長按
                        {
                                LED1=~LED1;        //LED1取反
                        }
                        else                                //小于1秒算短按
                        {
                                LED2=~LED2;        //LED2取反
                        }
                }
                count=0;                                //中斷計數變量清0
                key_flag = 0;                //按鍵有效標志位清0
   
                              LED2=~LED2;          //測試中斷反應
   }



//定時器0 中斷服務函數
void Timer0Interrupt(void) interrupt 1
{
        TH0 = 0xDC;                //10毫秒@11.0592MHz
        TL0 = 0x00;                //10毫秒@11.0592MHz
        if(count<250)        //防止溢出
                count++;                //中斷計數變量自+1
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:634487 發表于 2020-1-9 21:18 | 只看該作者
#include <STC15Wxx.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

sbit key        =P1^7;               
sbit LED1=P3^0;                        
sbit LED2=P3^1;                        
                                
bit key_flag = 0;//按鍵有效標志位變量
uchar count = 0;//中斷計數變量
/*
void delayms(uint xms) //添加延時
{
        uint i, j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);//12T單片機
}*/
void delayms(uint xms) //添加延時
{
        uint i, j;
        for(i=xms;i>0;i--)
                for(j=1150;j>0;j--);//1T單片機
}

void main()
{        
        //初始化定時器0
        TMOD= 0x01;                //設置定時器模式
        TH0 = 0xDC;                //10毫秒@11.0592MHz
        TL0 = 0x00;                //10毫秒@11.0592MHz
        TR0 = 0;                        //定時器0關閉
        ET0 = 1;                        //開定時器0中斷
        EA  = 1;                        //開總中斷
        while(1)
        {
                if(key == 0)//判斷鍵按下
                {
                        delayms(10);//延時10ms防抖
                        if(key == 0)//確認鍵按下
                        {
                                key_flag = 1; //有效標志位置1
                                TR0 = 1;                        //開定時器
                                while(!key);        //等待松手
                                TR0 = 0;                        //關定時器
                        }
                }
                if(key_flag)                        //判斷按鍵有效
                {
                        if(count>=100)        //超過1秒算長按
                        {
                                LED1=~LED1;        //LED1取反
                        }
                        else                                //小于1秒算短按
                        {
                                LED2=~LED2;        //LED2取反
                        }
                }
                count=0;                                //中斷計數變量清0
                key_flag = 0;                //按鍵有效標志位清0
        }
}
//定時器0 中斷服務函數
void Timer0Interrupt(void) interrupt 1
{
        TH0 = 0xDC;                //10毫秒@11.0592MHz
        TL0 = 0x00;                //10毫秒@11.0592MHz
        if(count<250)        //防止溢出
                count++;                //中斷計數變量自+1
}

這個是高手寫的原程序
回復

使用道具 舉報

板凳
ID:634487 發表于 2020-1-9 21:24 | 只看該作者
這個主要是模糊在   1要計時  2要判斷     網上的教程大都是直接執行一個指令
回復

使用道具 舉報

地板
ID:462827 發表于 2020-1-10 01:11 | 只看該作者
第二份代碼,那是在主循環中用輪詢的方法來檢測按鍵。

你的代碼是想在外部中斷中判斷按鍵,這種通常是使用接在MCU的INT0和INT1引腳上的按鍵才行,只要按下相應的鍵,就會產生外部中斷,所以在中斷服務程序中不用象輪詢那樣兩次判斷if(key==0),因為只要進中斷,就說明已經是按鍵被按下、產生外部中斷了,只需保留確認按下的那個if就行了。而且中斷服務最好要盡快執行完了馬上中斷返回,不要用while去等待按鍵放開,這是中斷法不一樣的地方。
回復

使用道具 舉報

5#
ID:158375 發表于 2020-1-10 09:34 | 只看該作者
1要計時  2要判斷
------
這個首先是你模糊了: 你程序里面有中斷嵌套, 程序必死無疑!
回復

使用道具 舉報

6#
ID:401564 發表于 2020-1-10 11:02 | 只看該作者
P3.2為外部中斷INT0,優先等級默認為最高等級,只要你不去設定中斷的優先等級,你這按鍵就是最高等級:按鍵默認為最優先等級.
回復

使用道具 舉報

7#
ID:634487 發表于 2020-1-10 15:09 | 只看該作者
hantu 發表于 2020-1-10 01:11
第二份代碼,那是在主循環中用輪詢的方法來檢測按鍵。

你的代碼是想在外部中斷中判斷按鍵,這種通常是使 ...

怎么計時呢
回復

使用道具 舉報

8#
ID:158375 發表于 2020-1-13 10:26 | 只看該作者

按鍵這么慢的設備,你為什么一定要 把按鍵中斷最優先 呢?
  你的程序,想計時,只能軟延時計時,或者查詢定時器標志計時,總之,就是什么也不干,只是等待;一般產品不會這么做的.
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区二区三区中文字幕 | 色噜噜狠狠色综合中国 | 国产精品精品 | 欧美一级毛片在线播放 | 三极网站 | 久久精品久久精品 | 国产三级精品三级在线观看四季网 | 婷婷国产一区二区三区 | 国产黄色网| 日韩国产精品一区二区三区 | 中文字幕av中文字幕 | 精品九九九 | 午夜精品一区二区三区在线视频 | 日韩蜜桃视频 | 午夜精品 | 欧美午夜视频 | 国内精品久久久久久影视8 最新黄色在线观看 | 一区二区三区四区在线视频 | 成人久久18免费网站 | 亚洲精品www | 免费一区二区 | 中文字幕日本一区二区 | 久久久久9999亚洲精品 | 国产欧美精品一区二区 | 福利视频网站 | 国产精品一区在线观看 | 国产精品欧美一区二区三区不卡 | 欧美激情精品久久久久久变态 | 亚洲在线免费观看 | 99久久精品国产一区二区三区 | 国产精品久久久久久久模特 | 日韩视频在线播放 | 中文字幕亚洲精品 | 美女在线观看av | 国产精品久久久久久久久久免费 | 国产精品久久久久久久三级 | 男人影音| av手机在线看 | 久久国产成人 | 奇米影视在线 | 不卡一区二区三区四区 |