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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機外部中斷0問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:47343 發表于 2015-1-19 20:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本來主程序時讓數碼管1 3 5 7亮1s 然后全部數碼管熄滅0.5s 做循環,每次循環按照數組里設置的字符變化(n n 5 2 0 1 3 1 4)。
外部中斷0是讓第一個LED亮。

模擬調試結果:
把P3^2(INT0)拉低(接地),即執行中斷程序時,約1-2s 后,首先數碼管1 3 5 7 會從之前的顯示變為顯示'8',然后持續1-2s,最后只剩第8個數碼管顯示'8',其余的數碼管都熄滅。
取消P3^2接地(結束中斷),主程序有時正常,有時在第8個數碼管跑一個循環后正常。

從試驗板的運行結果看,好像是在執行中斷程序的時候使得段鎖存器和位鎖存器的值有所變化。請大蝦幫忙找下問題在哪里。

程序代碼:


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lodu=P2^6;
sbit lowi=P2^7;
sbit q1=P1^4;
uint a;
uchar code table[]={0x37,0x37,0x6d,0x5b,0x3f,0x06,0x4f,0x06,0x66};
void delay(uint);
void main()
{        
        while(1)
        {               
                EA=1;//開總中斷
                EX0=1;//開外部中斷0
               
                        
                for(a=0;a<9;a++)
                {
                        q1=1;//LED 電源打開

                        lowi=1;//位鎖存器直通
                        P0=0xaa;//給位鎖存器賦值(片選1 3 5 7 數碼管)
                        lowi=0;//位鎖存器鎖存

                        lodu=1;//段鎖存器直通
                        P0=table[a];//給段鎖存器賦值,
                        lodu=0;//段鎖存器鎖存
                        delay(380);//延時1s

                        lodu=1;//段鎖存器直通
                        P0=0x00;//給段鎖存器賦值
                        lodu=0;//段鎖存器鎖存
                        delay(170);//延時0.5s
        
                };
        }

}



void delay(uint z)//延時程序
{
        uint x,y;
        for(x=z;x>0;x--)
        {
                for(y=200;y>0;y--)
                {
                };

        };


}


void exter0()interrupt 0//中斷子程序
{
        q1=0;
        P0=0x7f;
        
        

}

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

使用道具 舉報

沙發
ID:67992 發表于 2015-1-19 21:43 | 只看該作者
沒上板試驗,試試這樣行不行:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lodu=P2^6;
sbit lowi=P2^7;
sbit q1=P1^4;
uint a;
uchar code table[]={0x37,0x37,0x6d,0x5b,0x3f,0x06,0x4f,0x06,0x66};
void delay(uint);
void main()
{            EA=1;//開總中斷
        EX0=1;//開外部中斷0
        IT0=1;
        while(1)
        {               
               
               
                        
                for(a=0;a<9;a++)
                {
                        q1=1;//LED 電源打開

                        lowi=1;//位鎖存器直通
                        P0=0xaa;//給位鎖存器賦值(片選1 3 5 7 數碼管)
                        lowi=0;//位鎖存器鎖存

                        lodu=1;//段鎖存器直通
                        P0=table[a];//給段鎖存器賦值,
                        lodu=0;//段鎖存器鎖存
                        delay(380);//延時1s

                        lodu=1;//段鎖存器直通
                        P0=0x00;//給段鎖存器賦值
                        lodu=0;//段鎖存器鎖存
                        delay(170);//延時0.5s
        
                };
        }

}



void delay(uint z)//延時程序
{
        uint x,y;
        for(x=z;x>0;x--)
        {
                for(y=200;y>0;y--)
                {
                };

        };


}


void exter0()interrupt 0//中斷子程序
{
        q1=0;
      
        
        

}
回復

使用道具 舉報

板凳
ID:47343 發表于 2015-1-20 09:20 | 只看該作者
你用的IT=1(下降沿出發中斷),且中斷程序時讓全部8個led亮,上板試驗效果是P3^2接地,8個led閃爍一下。程序沒有問題。

但是我想問的是用IT0=0 (低電平出發中斷),為何P3^2接地,且接地沒有斷開的過程中,數碼管的顯示還是會變化。

依照你的建議 我把程序稍稍該了一點
想要的試驗結果是:
P3^2一直接地的過程中主程序停止在斷點前的一步不動,一直執行中斷程序(8個led全亮),當斷開P3^2的接地,跳出中斷(8個led熄滅,繼續執行主程序)


程序

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lodu=P2^6;
sbit lowi=P2^7;
sbit q1=P1^4;
uint a;
uchar code table[]={0x37,0x37,0x6d,0x5b,0x3f,0x06,0x4f,0x06,0x66};
void delay(uint);
void main()
{       

        EA=1;
        EX0=1;
        IT0=0;
        while(1)
        {
       

               
                //EA=1;//開總中斷
                //EX0=1;//開外部中斷0
               
                       
                for(a=0;a<9;a++)
                {
                        q1=1;//LED 電源關閉

                        lowi=1;//位鎖存器直通
                        P0=0xaa;//給位鎖存器賦值(片選1 3 5 7 數碼管)
                        lowi=0;//位鎖存器鎖存

                        lodu=1;//段鎖存器直通
                        P0=table[a];//給段鎖存器賦值,
                        lodu=0;//段鎖存器鎖存
                        delay(380);//延時1s

                        lodu=1;//段鎖存器直通
                        P0=0x00;//給段鎖存器賦值
                        lodu=0;//段鎖存器鎖存
                        delay(170);//延時0.5s
       
                };
        }

}



void delay(uint z)//延時程序
{
        uint x,y;
        for(x=z;x>0;x--)
        {
                for(y=200;y>0;y--)
                {
                };

        };


}


void exter0()interrupt 0//中斷子程序
{
        q1=0;
        //P0=0x7f;
       
       

}

試驗結果: P3^2 接地8個led無序變化,數碼管1 3 5 7 繼續執行主程序,只是延時時間變長了
回復

使用道具 舉報

地板
ID:67992 發表于 2015-1-20 11:35 | 只看該作者
再試試:
sbit P3.2=P3^2;
void exter0()interrupt 0//中斷子程序
{      EA=0;
        q1=0;
        //P0=0x7f;
       while(P3.2==0);
        EA=1;

}
回復

使用道具 舉報

5#
ID:67992 發表于 2015-1-20 11:55 | 只看該作者
用低電平觸發中斷
回復

使用道具 舉報

6#
ID:47343 發表于 2015-1-20 13:54 | 只看該作者
OK問題解決了,另外 sbit P3.2=P3^2; 有錯誤,改為 sbit p32=P3^2;


沒想明白為何要再中斷程序中加
EA=0;
while(P3.2==0);
        EA=1;
意思就是只有在INT0腳在低電平時開總中斷,否則關閉總中斷。
總中斷一直開著會對鎖存器有影響嗎?
回復

使用道具 舉報

7#
ID:67992 發表于 2015-1-20 14:23 來自手機 | 只看該作者
本帖最后由 dgahz 于 2015-1-20 14:31 編輯

進入中斷服務程序后關中斷使能,以便檢測3.2腳電平狀態,如是低電平,則程序不往下執行,停留在while這一句,否則往下執行,恢復中斷使能,退出服務程序,跳回主程序斷點繼續循環。
回復

使用道具 舉報

8#
ID:67992 發表于 2015-1-20 14:27 來自手機 | 只看該作者
如果不這樣處理,則程序將會在中斷服務程序和主程序來回跳轉,使得主程序斷斷續續緩慢執行。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品高清一区二区三区 | 操操日 | 国产精品久久久久久久久久久久久 | 午夜在线视频一区二区三区 | 在线午夜| 91aiai | 欧美在线 | 日韩欧美网| 久草视频在线播放 | 真人女人一级毛片免费播放 | 国产精品一区在线 | 免费高清av| 日韩精品一区二区三区免费观看 | 午夜影院在线观看免费 | 亚洲天天干 | 亚洲视频中文字幕 | 奇米久久| 日韩羞羞 | 国产精品久久久久久久岛一牛影视 | 精品久久久久久久 | 成人av免费 | av黄色免费在线观看 | 久久亚洲一区二区 | 日韩高清中文字幕 | 国产欧美日韩精品在线观看 | 一区二区在线视频 | 九九热免费看 | a级毛片免费高清视频 | 欧美视频精品 | 国产精品毛片av | 国产精品1区2区3区 国产在线观看一区 | 久久精品亚洲精品国产欧美 | 日韩在线观看视频一区 | 91精品国产综合久久香蕉922 | 成人精品啪啪欧美成 | 日韩资源| 精品一区二区三区四区五区 | 国产精品久久久久久久久久久久 | 国产欧美一区二区精品忘忧草 | 中文字幕在线免费视频 | 国产一区二区三区在线看 |