找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18888|回復: 0
收起左側(cè)

實現(xiàn)單片機程序的暫停和執(zhí)行的兩種方法

[復制鏈接]
ID:408519 發(fā)表于 2019-5-17 18:44 | 顯示全部樓層 |閱讀模式
兩種方法實現(xiàn)程序的暫停和啟動,我的外部中斷0已經(jīng)被別的功能占用了,所以只能用外部中斷1了
函數(shù)功能:程序無論執(zhí)行到哪里按下暫停鍵,程序暫停;再按下啟動鍵程序接著暫停的地方執(zhí)行。以流水燈為例
CPU:STC89C52單片機
方法一:最常規(guī)方法用外部中斷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為跳邊沿觸發(fā)
  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鍵按下,跳出中斷里面的死循環(huán)
  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:用單片機的空閑模式實現(xiàn)上面的功能
  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開始執(zhí)行
  8. void job0 (void) _task_ 0 {

  9. //        EA=1;//開總中斷
  10.         EX1=1;//打開外部中斷1
  11.         IT1=1;//外部中斷1為跳邊沿觸發(fā)
  12.         led=0xfe;
  13. //        os_wait (K_TMO, 20, 0);  //用于將一個任務設置為等待態(tài)  
  14.         os_create_task (1);//建立任務1、2
  15.         os_create_task (2);     
  16.         os_delete_task (0);//將一個已經(jīng)啟動的任務設置為刪除態(tài),停止運行的任務
  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. }
復制代碼
當然還有其他的方法了,大家可以自己試一試

評分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表