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

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

QQ登錄

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

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

51單片機(jī)中INT0中斷程序請(qǐng)教大家

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:634487 發(fā)表于 2020-1-9 21:05 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
之前的一個(gè)按鍵控制兩個(gè)狀態(tài)。 我想把按鍵中斷最優(yōu)先。
程序移植到中斷后,不能運(yùn)行。但是中斷還是有的。
這兩天學(xué)習(xí)中斷,請(qǐng)大家給些指點(diǎn)。

#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;//按鍵有效標(biāo)志位變量
uchar count = 0;//中斷計(jì)數(shù)變量

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

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

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

void Int0() interrupt 0
{
  if(key == 0)//判斷鍵按下
                {
                        delayms(10);//延時(shí)10ms防抖
                        if(key == 0)//確認(rèn)鍵按下
                        {
                                key_flag = 1; //有效標(biāo)志位置1
                                TR0 = 1;                        //開(kāi)定時(shí)器
                                while(!key);        //等待松手
                                TR0 = 0;                        //關(guān)定時(shí)器
                        }
                }
                if(key_flag)                        //判斷按鍵有效
                {
                        if(count>=100)        //超過(guò)1秒算長(zhǎng)按
                        {
                                LED1=~LED1;        //LED1取反
                        }
                        else                                //小于1秒算短按
                        {
                                LED2=~LED2;        //LED2取反
                        }
                }
                count=0;                                //中斷計(jì)數(shù)變量清0
                key_flag = 0;                //按鍵有效標(biāo)志位清0
   
                              LED2=~LED2;          //測(cè)試中斷反應(yīng)
   }



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

使用道具 舉報(bào)

沙發(fā)
ID:634487 發(fā)表于 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;//按鍵有效標(biāo)志位變量
uchar count = 0;//中斷計(jì)數(shù)變量
/*
void delayms(uint xms) //添加延時(shí)
{
        uint i, j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);//12T單片機(jī)
}*/
void delayms(uint xms) //添加延時(shí)
{
        uint i, j;
        for(i=xms;i>0;i--)
                for(j=1150;j>0;j--);//1T單片機(jī)
}

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

這個(gè)是高手寫(xiě)的原程序
回復(fù)

使用道具 舉報(bào)

板凳
ID:634487 發(fā)表于 2020-1-9 21:24 | 只看該作者
這個(gè)主要是模糊在   1要計(jì)時(shí)  2要判斷     網(wǎng)上的教程大都是直接執(zhí)行一個(gè)指令
回復(fù)

使用道具 舉報(bào)

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

你的代碼是想在外部中斷中判斷按鍵,這種通常是使用接在MCU的INT0和INT1引腳上的按鍵才行,只要按下相應(yīng)的鍵,就會(huì)產(chǎn)生外部中斷,所以在中斷服務(wù)程序中不用象輪詢那樣兩次判斷if(key==0),因?yàn)橹灰M(jìn)中斷,就說(shuō)明已經(jīng)是按鍵被按下、產(chǎn)生外部中斷了,只需保留確認(rèn)按下的那個(gè)if就行了。而且中斷服務(wù)最好要盡快執(zhí)行完了馬上中斷返回,不要用while去等待按鍵放開(kāi),這是中斷法不一樣的地方。
回復(fù)

使用道具 舉報(bào)

5#
ID:158375 發(fā)表于 2020-1-10 09:34 | 只看該作者
1要計(jì)時(shí)  2要判斷
------
這個(gè)首先是你模糊了: 你程序里面有中斷嵌套, 程序必死無(wú)疑!
回復(fù)

使用道具 舉報(bào)

6#
ID:401564 發(fā)表于 2020-1-10 11:02 | 只看該作者
P3.2為外部中斷INT0,優(yōu)先等級(jí)默認(rèn)為最高等級(jí),只要你不去設(shè)定中斷的優(yōu)先等級(jí),你這按鍵就是最高等級(jí):按鍵默認(rèn)為最優(yōu)先等級(jí).
回復(fù)

使用道具 舉報(bào)

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

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

怎么計(jì)時(shí)呢
回復(fù)

使用道具 舉報(bào)

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

按鍵這么慢的設(shè)備,你為什么一定要 把按鍵中斷最優(yōu)先 呢?
  你的程序,想計(jì)時(shí),只能軟延時(shí)計(jì)時(shí),或者查詢定時(shí)器標(biāo)志計(jì)時(shí),總之,就是什么也不干,只是等待;一般產(chǎn)品不會(huì)這么做的.
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一级片视频免费 | 日本aa毛片a级毛片免费观看 | 亚洲精品一区二区三区在线观看 | 精精国产xxxx视频在线播放7 | 香蕉大人久久国产成人av | 色婷婷一区二区三区四区 | 在线观看中文字幕 | 毛片一区二区 | 久久91av | 亚洲日本中文字幕在线 | 精品欧美一区二区三区精品久久 | 国产亚洲精品久久情网 | 欧美lesbianxxxxhd视频社区 | 黄色毛片在线播放 | 国产精品自在线 | 日本在线综合 | 国产伦精品一区二区三区高清 | 国产一区二区欧美 | 在线成人 | 亚洲精品一区二区三区中文字幕 | 国产精品久久国产精品 | 日韩精品 电影一区 亚洲 | 亚洲成人网在线播放 | 日韩视频一区在线观看 | 国产一区免费 | 啪啪精品 | 在线免费观看黄色 | 性福视频在线观看 | 国产精品美女www爽爽爽视频 | 国产一级大片 | 亚洲一区二区三区在线 | 国产成人久久久 | 成人国内精品久久久久一区 | 中文字幕av一区 | 久久精品国产久精国产 | 亚洲欧美日韩中文字幕一区二区三区 | 欧美黄色免费网站 | 91免费视频 | 成年免费大片黄在线观看一级 | 黄免费在线 | 99热国产在线播放 |