找回密码
 注册
关于网站域名变更的通知
查看: 290|回复: 2
打印 上一主题 下一主题

单片机系统的暂停与恢复问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-5-30 13:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
我想做个系统,要求单片机在任意时刻,按下按键系统暂停,再次按下按键的时候恢复继续执行。我用了2种方法都有问题。7 {: @% X9 X* v* z& n  ]3 ?/ l
方法一:中断和按键用的同一个引脚(部分程序,中断开启在初始化中做了)
8 Y7 i  b2 t* p( abit temp;3 u6 K4 h  N- ~  D* h! G7 Z9 T5 n
sbit key=P3^2;
$ o( `3 |7 R# ^" _. N1 v2 G- jvoid int0() interrupt 0
/ J5 D9 n- b2 b2 c{
5 {" n" }: X, v, G- U% B9 \       temp=1;' \4 w7 g- R$ s5 E. h6 m
       while(temp==1)
; ]6 E' m: w. e4 n. r       {
3 r( @1 p1 S/ Q7 g( Q  x; _               if(key==0)
& z& _; w3 H) q5 B$ p9 v/ m4 d5 o3 J5 `              {
8 M( f: \5 a7 e# S) h                      delay(10);
% B. B- Y. K" v# W- N                      if(key==0)
& Q1 f; Y/ x* u+ e+ N  m. f1 Q2 V                     {
% S9 C# v: k1 ~9 p! q$ m& u- o6 L0 \                            temp=0;
2 D0 T8 G1 O; \- P) q' ]                            while(key==0);
+ ^& b, d6 t, Q0 i                     }
% b5 [* f  `, p. q5 P+ Q              }4 l, E' x0 w4 }+ ^1 G4 V% d
       }: p- [4 m" c( \) Z+ X
}) Y9 c/ ^, l5 {8 F2 K  H: g8 D
方法二:掉电模式- L9 {4 @- r2 O) z$ ]' Z2 a* p
void int0() interrupt 0      ' O. T2 ?. ^- M
{   9 s5 v; |" h" J! C9 f/ j1 I9 A. [: @
        uint x=0;1 l% Q' _  ~- {+ p
        IT0=0;# I$ R: Z3 H& y# M. I
        EX0=0;9 V8 k& l! p  b5 }& ^" k  |5 R# L
        while(k1==0)7 J# O: d% p5 h2 f  l! k/ f
        {
6 T3 c( \4 W5 z- c/ V                x++;" U" n# Y: e- r$ q. z* `$ x4 g& u
                delay(10);
3 Z0 N9 [3 f# p0 g7 K) r9 v. c2 u                if(x>=1000)
) t; i7 E& E3 i4 z4 A3 v2 p                {
7 |7 l3 _# V8 A  Z                         PCON=0;# V. b( P9 d/ c1 m
                }                  . w0 w: ?! b  Z2 ~8 |6 h  I
        }1 M% i/ u% D, j6 j9 Q
        if(x<1000)* l2 t  R! T. T$ h7 V6 T
        {. q0 q  T5 G6 ^) e3 ]
                IT0=1;% C" f7 P3 l- N9 r* Y
                EX0=1;
& U" T, |& Z8 T. @                PCON=0x02;6 k% E7 O4 X  R7 y, ^0 x. ^
                delay(10);' b- I( W0 C9 y
        }              + B; X2 C3 x8 {  |) X
}
) h. W9 z  _2 P0 u" s* C7 K+ O: p$ |' r! F( Z
  • TA的每日心情
    慵懒
    2022-1-21 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2022-5-30 14:27 | 只看该作者
    做个奇偶控制器,为奇CPU进行休眠,为偶CPU退出休眠。
    0 ?2 X  V5 ^7 v奇偶控制器的奇偶,由按键产生中断的奇偶次数控制。
  • TA的每日心情
    开心
    2022-1-29 15:04
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2022-5-30 14:32 | 只看该作者
    单片机, 是不存在暂停的, 要起到看上去"暂停"的效果, 要么让他 在一个地方 傻跑, 要么休眠。你的两个思路都对,但是代码都有问题。; f7 b3 w3 D# r- \" `2 R

    1 \' F* O7 \0 S9 V方法一:中断和按键用的同一个引脚(部分程序,中断开启在初始化中做了)
    $ \- n1 L# ]7 Q: W3 T注意: IT0 =1, G& ?6 Z! k, p) \$ l: g8 H
    sbit key=P3^2;
    % `3 i5 ^6 ?- J" ?1 T6 O& ^void int0() interrupt 02 v% _% V9 x1 N2 I
    {7 P) M$ D- g6 U+ W/ T% J+ z

    & v7 L! s4 i+ ?- J8 E, D7 H       unsigned char i;8 ^  g: O% ]  _4 h3 z- I
           while((IE0) || (!key))
    3 o( j2 @; ~$ s1 `# u' n7 n       {
      L( D: g0 |4 V. ~: g4 F               IE0 = 0;
      l% ^: a! H/ b, p9 o1 n( t' X               i = 200;! [: C9 [5 C  \* @
                   while(--i);4 g. C3 o4 \3 _: E
           }  //消抖 & 释放按键8 @; V8 j$ E9 R" @0 H! x
           while(!IE0);        //暂停现象6 f3 C) t( u, |; k. x
           while((IE0) || (!key))
    3 I$ {0 h7 F! p# ~& b       {! D* n9 w: F3 ]7 r# k2 D) O" N4 M
                   IE0 = 0;
    ; T$ y7 {+ T5 W( m# ^4 a               i = 200;
      s* ]* I6 {' k8 _* l* v               while(--i);
    / i7 O3 M6 n, r" _       }  //消抖 & 释放按键
    - m' d+ {* v- L7 \: o; ~}
    6 F  M- t% Y. {- l0 x4 V! ]8 d# z2 P3 ]& _
    ( V6 @7 W+ w+ J! j* K9 h+ Y2 c
    方法二:掉电模式    注意: IT0 =17 o3 q1 M- G, }& j& h1 a
    由于,STC15系列,部分机型 中断中用PCON = 0x02; 会有意外,所以,掉电模式最好配合主程序使用。( i0 A$ ]6 m3 ^
    1 c2 f# G, u1 [& k% Z9 Z3 i
    bit Pause_Stats;
    - r$ p( ~. Q: t  Wsbit key=P3^2;2 |  e8 Z4 X- A$ O' b/ {! M

    6 A6 T5 }# n8 X5 w9 f8 v7 r) Q2 r% v
    void int0() interrupt 0      //必须要有* I7 R+ a$ R9 x9 j2 l( S% C; w
    {   4 j7 V0 @8 p3 k' o

    ! c' T7 i# R$ Q/ r               EX0 = 0;   //关中断
    4 i8 L2 ~: G: O- @}" b) R* o  {+ T5 h

      @& f0 P2 F! R" p6 p% Xvoid main()4 n: O3 g7 ~$ h$ j' i4 S/ V
    {
    : w% P5 V! Y) V0 p+ |2 z# g       unsigned char i;* X) ~: V* _- ?/ L( l
         IT0 = 1;4 m& ?% L+ \4 \" _
         EX0 = 0;   //关中断
    * U& A2 I2 M% C1 ~. w, f     EA  = 1;4 f: q- O0 ~7 k3 V' F- \1 C
      while(1)% R* G& t" r6 |/ [$ V
      {
    6 I' Z5 s. G$ {9 R         if(IE0)6 |) ~# w% N- j% B/ x6 ^8 L8 w
             {
    , l7 q  A- O$ g! P2 R5 @               while((IE0) || (!key))
    : M$ {  J; b" ~+ ?              {: R& H+ W+ [3 n9 v
                           IE0 = 0;& `/ h- w5 U- A- J. p
                           i = 200;1 d% O* Y* A  ?' d6 P& |- O! y
                           while(--i);
    6 g& k3 v) o8 u% {/ {+ C               }  //消抖 & 释放按键
    " K, g3 N, G" Y# B5 E                EX0 = 1;     //开中断  V1 U0 W' z: F4 U
                     PCON=0x02;      //休眠           
    1 `# {6 J; ]. Q                _nop_();
    ( P6 m% ?1 [! e2 {! Y5 o                _nop_();/ w6 Y4 m+ h3 Y
                    while((IE0) || (!key))
    + F% X/ ]! x6 c+ v) H( `1 l               {
    / f9 X3 u, u, s$ z8 Q                       IE0 = 0;, r5 ~& D9 r) w/ G
                           i = 200;
    % o' w. c- c& H) h3 a6 j; i! Q! P2 M                       while(--i);4 u9 e& @, j' Z0 E
                    }  //消抖 & 释放按键
    " o9 J8 ~. \: Z7 K# X+ R3 j           }+ L% a" J' I0 k! b& @2 ]
    }
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-8 23:03 , Processed in 0.156250 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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