两种方法实现程序的暂停和启动,我的外部中断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--);
- }
复制代码 当然还有其他的方法了,大家可以自己试一试
|