找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16960|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:408519 发表于 2019-5-17 18:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
两种方法实现程序的暂停和启动,我的外部中断0已经被别的功能占用了,所以只能用外部中断1了
函数功能:程序无论执行到哪里按下暂停键,程序暂停;再按下启动键程序接着暂停的地方执行。以流水灯为例
CPU:STC89C52单片机
方法一:最常规方法用外部中断1
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. void delayms(unsigned int);
  4. unsigned char led;
  5. //key1=P3^3;//外部中断1,也就是暂停键;
  6. sbit key2=P3^4;//启动键
  7. bit flag=1;

  8. void main(){
  9.         EA=1;//开总中断
  10.         EX1=1;//打开外部中断1
  11.         IT1=1;//外部中断1为跳边沿触发
  12.         led=0xfe;
  13.     while (1){
  14.                 P1=led;
  15.             delayms(1000);
  16.             led=_crol_(led,1);
  17.     }
  18. }

  19. //暂停部分
  20. void INT_1() interrupt 2{
  21.         while(flag){
  22.                 if(key2==0){
  23.                         delayms(10);
  24.                         if(key2==0){
  25.                                 flag=0;//如果key2键按下,跳出中断里面的死循环
  26.                         while(!key2);
  27.                 }
  28.         }
  29.         }
  30.         flag=1;
  31. }

  32. void delayms(unsigned int xms){
  33.         unsigned int i,j;
  34.         for(i=xms;i>0;i--)                                 for(j=110;j>0;j--);
  35. }
复制代码
方法2:用单片机的空闲模式实现上面的功能
  1. #include <reg52.h>
  2. #include <RTX51TNY.h>
  3. #include <intrins.h>

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

  5. void delayms(unsigned int);
  6. unsigned char led;

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

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

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

  31. //任务2 LED流水灯
  32. void LEDliu(void) _task_ 2{   
  33.    while (1){
  34.                 P1=led;
  35.             delayms(2000);
  36.             led=_crol_(led,1);
  37. //                os_wait (K_TMO, 20, 0);           
  38.    }
  39. }

  40. //外部中断1控制唤醒CPU
  41. void INT_1() interrupt 2{
  42.         PCON=0;//唤醒单片机
  43. }

  44. void delayms(unsigned int xms){
  45.         unsigned int i,j;
  46.         for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
  47.                 for(j=110;j>0;j--);
  48. }
复制代码
当然还有其他的方法了,大家可以自己试一试

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶2 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表