打印
[资料下载]

实现单片机程序的暂停和执行的两种方法

[复制链接]
263|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dspmana|  楼主 | 2023-11-25 17:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

两种方法实现程序的暂停和启动,我的外部中断0已经被别的功能占用了,所以只能用外部中断1了
函数功能:程序无论执行到哪里按下暂停键,程序暂停;再按下启动键程序接着暂停的地方执行。以流水灯为例
CPU:STC89C52单片机
方法一:最常规方法用外部中断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为跳边沿触发
        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键按下,跳出中断里面的死循环
                        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--);
}
方法2:用单片机的空闲模式实现上面的功能
#include <reg52.h>
#include <RTX51TNY.h>
#include <intrins.h>

sbit key1=P2^0;//该按键进入掉电模式

void delayms(unsigned int);
unsigned char led;

//首先从任务0开始执行
void job0 (void) _task_ 0 {

//        EA=1;//开总中断
        EX1=1;//打开外部中断1
        IT1=1;//外部中断1为跳边沿触发
        led=0xfe;
//        os_wait (K_TMO, 20, 0);  //用于将一个任务设置为等待态  
        os_create_task (1);//建立任务1、2
        os_create_task (2);     
        os_delete_task (0);//将一个已经启动的任务设置为删除态,停止运行的任务
}

//任务1,扫描键盘
void keyscan(void) _task_ 1{
   while (1){                       
              if(key1==0){
                delayms(10);
                if(key1==0){
                        PCON=0x02;//如果key1按下,则cpu进入掉电模式
                        while(!key1);
                        }               
                }
//    os_wait (K_TMO, 20, 0);   //延时等待20个周期,主动让出CPU         
   }
}

//任务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;//唤醒单片机
}

void delayms(unsigned int xms){
        unsigned int i,j;
        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
                for(j=110;j>0;j--);
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

2378

帖子

2

粉丝