標(biāo)題:
實(shí)現(xiàn)單片機(jī)程序的暫停和執(zhí)行的兩種方法
[打印本頁]
作者:
亢亢
時間:
2019-5-17 18:44
標(biāo)題:
實(shí)現(xiàn)單片機(jī)程序的暫停和執(zhí)行的兩種方法
兩種方法實(shí)現(xiàn)程序的暫停和啟動,我的外部中斷0已經(jīng)被別的功能占用了,所以只能用外部中斷1了
函數(shù)功能:程序無論執(zhí)行到哪里按下暫停鍵,程序暫停;再按下啟動鍵程序接著暫停的地方執(zhí)行。以流水燈為例
CPU:STC89C52單片機(jī)
方法一:最常規(guī)方法用外部中斷1
#include <reg52.h>
#include <intrins.h>
void delayms(unsigned int);
unsigned char led;
//key1=P3^3;//外部中斷1,也就是暫停鍵;
sbit key2=P3^4;//啟動鍵
bit flag=1;
void main(){
EA=1;//開總中斷
EX1=1;//打開外部中斷1
IT1=1;//外部中斷1為跳邊沿觸發(fā)
led=0xfe;
while (1){
P1=led;
delayms(1000);
led=_crol_(led,1);
}
}
//暫停部分
void INT_1() interrupt 2{
while(flag){
if(key2==0){
delayms(10);
if(key2==0){
flag=0;//如果key2鍵按下,跳出中斷里面的死循環(huán)
while(!key2);
}
}
}
flag=1;
}
void delayms(unsigned int xms){
unsigned int i,j;
for(i=xms;i>0;i--) for(j=110;j>0;j--);
}
復(fù)制代碼
方法2:用單片機(jī)的空閑模式實(shí)現(xiàn)上面的功能
#include <reg52.h>
#include <RTX51TNY.h>
#include <intrins.h>
sbit key1=P2^0;//該按鍵進(jìn)入掉電模式
void delayms(unsigned int);
unsigned char led;
//首先從任務(wù)0開始執(zhí)行
void job0 (void) _task_ 0 {
// EA=1;//開總中斷
EX1=1;//打開外部中斷1
IT1=1;//外部中斷1為跳邊沿觸發(fā)
led=0xfe;
// os_wait (K_TMO, 20, 0); //用于將一個任務(wù)設(shè)置為等待態(tài)
os_create_task (1);//建立任務(wù)1、2
os_create_task (2);
os_delete_task (0);//將一個已經(jīng)啟動的任務(wù)設(shè)置為刪除態(tài),停止運(yùn)行的任務(wù)
}
//任務(wù)1,掃描鍵盤
void keyscan(void) _task_ 1{
while (1){
if(key1==0){
delayms(10);
if(key1==0){
PCON=0x02;//如果key1按下,則cpu進(jìn)入掉電模式
while(!key1);
}
}
// os_wait (K_TMO, 20, 0); //延時等待20個周期,主動讓出CPU
}
}
//任務(wù)2 LED流水燈
void LEDliu(void) _task_ 2{
while (1){
P1=led;
delayms(2000);
led=_crol_(led,1);
// os_wait (K_TMO, 20, 0);
}
}
//外部中斷1控制喚醒CPU
void INT_1() interrupt 2{
PCON=0;//喚醒單片機(jī)
}
void delayms(unsigned int xms){
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
for(j=110;j>0;j--);
}
復(fù)制代碼
當(dāng)然還有其他的方法了,大家可以自己試一試
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1