標題: [求助]又一個關于單片機中斷的問題 [打印本頁]
作者: wilkly 時間: 2008-11-22 19:21
標題: [求助]又一個關于單片機中斷的問題
剛學單片機,在中斷這塊我總是遇見問題,下面這段程序我想現實的效果是:開機時兩端的LED燈閃爍,當我給單片機一個外部中斷的時候,小燈熄滅一段時間后,第二個LED燈和倒數第二個LED燈閃爍,持續2秒(用定時器中斷實現)然后所有的燈熄滅。可是當我給單片機一個外部中斷后,小燈確實滅了一段時間,可是過了一段時間后并沒有出現第二個LED燈和倒數第二個LED燈閃爍持續2秒,然后熄滅的情況,而是返回了開始兩端LED燈閃爍的情況!(好像下面代碼紅色的部分沒執行)我都改了N+1遍了都沒有出現我想要的情況,都快絕望了!請大家幫幫忙,解決一下。(LED燈接P0口)
#include<reg52.h>
int n,a;
void delaytime(int ms) //控制小燈的閃爍
{
int x,y;
for(x=ms;x>0;x--)
for(y=200;y>0;y--);
}
void forword() //使p0.0和P0.7口閃爍(兩端的小燈閃爍)
{
while(1)
{
P0=0x7e;
delaytime(20);
P0=0xff;
delaytime(20);
}
}
void back() //P0.1和P0.6口燈閃爍(第二個燈和倒數第二個燈閃爍)2秒后熄滅
{
TMOD=0x01; //定時器工作在方式1
TH0=(65536-50000)/256; // 50ms定時
TL0=(65536-50000)%256;
ET0=1; //允許定時器中斷
TR0=1; //開啟定時器
while(1)
{
if(n==40) //判斷是否到了兩秒(40*50ms),到了 關閉所有燈
{
P0=0xff; // 燈滅
while(1);
}
P0=0xbd; //P0.1和P0.6口燈亮
delaytime(20);
P0=0xff;
delaytime(20);
}
}
void main()
{
a=0;
IT0=1; //外部0中斷,跳沿觸發方式
EA=1; // 開總中斷
EX0=1; //允許外部0中斷
if(a!=0) //判斷a==1?,不等于則調用back(),使P0.6和P0.2口燈閃爍2秒后滅掉
back();
else
forword(); //否則調用forward(),使p0.0和P0.7口燈閃爍
}
void extinter() interrupt 0 //外部中斷0函數
{
a++;
P0=0xff; //所有的燈滅
delaytime(100); // 延時
}
void timer0() interrupt 1 //定時器0中斷函數
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
n++;
}
起初我以為是因為中斷優先級的問題,可是當我把外部中斷0改為外部中斷1時還是不行。
當我把 back()函數放在外部中斷函數里調用的時候,它的確被調用了,但是出現了 P0.1和P0.6口燈一直在閃爍(第二個燈和倒數第二個燈閃爍)的情況,而并沒有出現持續兩秒后自動熄滅的效果,好像并沒有調用定時器中斷;當我在forward()中加入
if(a!=0) back();時出現的情況還是跟我提出的問題一樣,并沒有調用back()函數
[此貼子已經被作者于2008-11-23 11:02:05編輯過]
作者: hanhua 時間: 2008-11-24 15:07
你的主函數里,if語句不對,back函數里,定時安排不對,都沒考慮返回語句,只能執行一種情況。我修改一下,延時只能用一次,以后都使用外部中斷。編程時,要把思路搞清楚。程序如下:
#include<reg52.h>
int n,a;
void delaytime(int ms) //控制小燈的閃爍
{
int x,y;
for(x=ms;x>0;x--)
for(y=200;y>0;y--);
}
void back() //P0.1和P0.6口燈閃爍(第二個燈和倒數第二個燈閃爍)2秒后熄滅
{
TMOD=0x01; //定時器工作在方式1
TH0=(65536-50000)/256; // 50ms定時
TL0=(65536-50000)%256;
ET0=1; //允許定時器中斷
TR0=1; //開啟定時器
while(1)
{
if(n==40) //判斷是否到了兩秒(40*50ms),到了 關閉所有燈
{
P0=0xff; // 燈滅
delaytime(2000);
}
P0=0xbd; //P0.1和P0.6口燈亮
delaytime(20);
P0=0xff;
delaytime(20);
}
}
void forword() //使p0.0和P0.7口閃爍(兩端的小燈閃爍)
{
while(1)
{
P0=0x7e;
delaytime(20);
P0=0xff;
delaytime(20);
if(a!=0) //判斷a==1?,不等于則調用back(),使P0.6和P0.2口燈閃爍2秒后滅掉
back();
}
}
void main()
{
a=0;
IT0=1; //外部0中斷,跳沿觸發方式
EA=1; // 開總中斷
EX0=1; //允許外部0中斷
forword(); //否則調用forward(),使p0.0和P0.7口燈閃爍
}
void extinter() interrupt 0 //外部中斷0函數
{
a++;
P0=0xff; //所有的燈滅
delaytime(100); // 延時
}
void timer0() interrupt 1 //定時器0中斷函數
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
n++;
}
作者: wilkly 時間: 2008-11-25 20:02
真的是太感謝你了!以前我對當中斷程序返回后返回的地址不是很了解,通過這次的這個程序我對這個問題相對以前有了更加深刻的理解!
[此貼子已經被作者于2008-11-25 20:04:23編輯過]
作者: anvy178 時間: 2008-11-26 12:48
IF 語句 有什么問題嗎? 我看他程序只是 中斷跟定時混亂了 菜鳥請教
作者: wilkly 時間: 2008-11-27 23:33
按照我以前的寫法當外部中斷返回的時候,返回到的是forward()函數里面,而不是返回到 if 判斷的位置?因為外部中斷響應前,程序一直在執行forward()函數,當中斷響應的時候只把forward()函數的地址壓入棧內了,而并未保存if()的地址.
作者: anvy178 時間: 2008-12-4 15:09
你的這個意思我知道 其實就是中斷 的處理 有問題 但是IF語句本身沒問題的 只不過IF語句位置不對 是這樣的吧
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
久久性视频
|
国产一区二区在线观看视频
|
男女啪啪免费网站
|
成人看|
免费观看av网站
|
夜间福利视频
|
亚洲激情综合
|
免费在线观看av
|
欧美久久久|
91综合在线
|
色婷婷在线视频
|
欧美日韩在线视频观看
|
男女交配网站
|
视频一区在线观看
|
亚洲精品xxx
|
日韩免费看片
|
亚洲免费精品视频
|
国产一区精品在线观看
|
亚洲视频免费
|
一级免费片
|
国产aⅴ爽av久久久久成人
|
成人午夜视频在线观看
|
日韩精品免费在线观看
|
91亚洲一区
|
三级黄色片
|
亚洲伦理视频
|
国产日韩欧美视频
|
中文字幕在线观看免费视频
|
黄视频网站在线观看
|
中文字幕第一区
|
www.av在线|
aaa亚洲|
a视频在线免费观看
|
日韩成人精品视频
|
中文字幕在线日韩
|
涩涩999|
日韩精品在线播放
|
国产欧美在线观看
|
免费黄网站在线观看
|
国产精品天堂
|
精品免费国产一区二区三区四区
|