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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
我想做个系统,要求单片机在任意时刻,按下按键系统暂停,再次按下按键的时候恢复继续执行。我用了2种方法都有问题。8 j+ A: b3 q- b  p
方法一:中断和按键用的同一个引脚(部分程序,中断开启在初始化中做了)
, Q/ S" x" ?# l" Qbit temp;6 N& F4 e+ d& q# K* Z( W, N
sbit key=P3^2;) R$ w4 A! n* e9 s2 N' l2 k
void int0() interrupt 08 x! Z/ E) C* J, ]& v$ S( @! R& x  v0 r
{
' o6 Y2 @! r& f       temp=1;
1 |/ N; ?; `- t- N: b; n6 I$ R7 c       while(temp==1)
- \( {/ Q2 \1 i7 U, c: A       {% h1 J. I& p6 R5 Q6 \4 d: K0 c# R
               if(key==0)- h; ^. q2 m/ A. R9 L9 T
              {: ~" v5 o7 K% u- g5 {; N8 [  d
                      delay(10);
. F8 R# |# ~2 W) j                      if(key==0)5 X* f* Z1 {0 a8 S* M# J  k
                     {
4 c. W7 \9 t% {# S5 V' {                            temp=0;, ~' S8 P- H, T7 ]$ P& K4 {
                            while(key==0);
# G+ O! Y" M8 `# n                     }
0 V! d6 S4 t" t# ~, Q) n% i              }
4 W$ x4 C( j: E* u, A; c; V# f       }& S8 {. _: H- Q2 l
}
% A, x. ?8 d6 z1 J' I方法二:掉电模式
, [+ z& ^0 a; U$ j9 mvoid int0() interrupt 0      
1 q$ d7 z9 u9 n. C) w* ~3 q{   
: y  v* P; I4 S# y& V; [        uint x=0;
% ~" U) e4 ^" ^' D& N" J        IT0=0;
6 e- r. Q* o1 h4 U, f5 O        EX0=0;% b- r0 w# L) x1 G+ t
        while(k1==0)
! R2 M+ n4 J; V! `        {
( R+ H0 m  w3 t3 F4 B  X6 _                x++;# f* \) |, }+ @- r& ?# c  ~) J1 C  k
                delay(10);1 O; H9 }  ~$ S
                if(x>=1000)
% ~. T! B% P7 c                {
5 ~9 \1 b: C& \% T7 y                         PCON=0;6 f" q/ D+ z- g: A- C' J' w5 F/ C
                }                  & B" @& w4 s5 z" o
        }$ C) F( B1 o+ X$ l" C# L5 o. L3 W
        if(x<1000)
; z) O" C8 l7 [' P        {* f, k# Z! v; q* h. m9 ]
                IT0=1;! ?1 w) ]9 H% T7 e( N$ R! y
                EX0=1;+ U7 C5 L' F1 m- b3 s. e% a+ g
                PCON=0x02;
4 ~2 R1 x8 W, b                delay(10);: P2 T6 F+ L! D
        }              ! n# K' N* n5 }
}/ e0 @4 v, |) J( c

+ U* z, s3 |- G* f' z/ i- J* L
  • TA的每日心情
    慵懒
    2022-1-21 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2022-5-30 14:27 | 只看该作者
    做个奇偶控制器,为奇CPU进行休眠,为偶CPU退出休眠。; |; S8 u. S# H* T
    奇偶控制器的奇偶,由按键产生中断的奇偶次数控制。
  • TA的每日心情
    开心
    2022-1-29 15:04
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2022-5-30 14:32 | 只看该作者
    单片机, 是不存在暂停的, 要起到看上去"暂停"的效果, 要么让他 在一个地方 傻跑, 要么休眠。你的两个思路都对,但是代码都有问题。
    . B* n. x+ v: P1 A- a
    - B4 C3 x" N$ |; V方法一:中断和按键用的同一个引脚(部分程序,中断开启在初始化中做了)
    5 {1 V0 U6 c' L! X' @& H注意: IT0 =10 T8 Q# J6 W( t9 G+ c% T
    sbit key=P3^2;
    ) v; r0 P4 v! T" jvoid int0() interrupt 0: Q% X) B" Q: q! K1 y
    {
    * B+ Z. n6 g. s- x1 O! ^% B6 O" a3 k7 a% Q9 P% ]
           unsigned char i;8 ]* k$ K3 @5 n$ x# Q* s
           while((IE0) || (!key)). V2 l! f* S1 f5 J1 `5 R
           {9 ]. Z) p& V4 s0 |: Y3 W
                   IE0 = 0;
    5 p: G, u" m! L2 i4 m               i = 200;
    5 H' j8 e' i9 i2 r               while(--i);
    1 a" E" e5 o/ l       }  //消抖 & 释放按键
    : L' V$ H! Q- F       while(!IE0);        //暂停现象' s# Z' ]- T/ @0 D; g
           while((IE0) || (!key))
    ; P, S! B9 l) c6 Y3 X       {
    + |  x( {3 t& h1 F3 J  T, P               IE0 = 0;9 a$ K6 `0 `, n& f: T1 D7 M9 Z
                   i = 200;
    0 L3 x0 u  O3 @% V               while(--i);1 p3 g! h4 j" b1 s* X+ K$ ^1 D
           }  //消抖 & 释放按键
    . b+ N; @3 X, Z6 S& ~8 H" ]; g8 Q}
    6 N1 l5 ~3 v$ p3 C& Y" z
    7 Z' j- p2 ]6 t- c
    5 V- V( q: q4 [6 R" O% F, a) S方法二:掉电模式    注意: IT0 =1
    4 ]1 f  C9 u2 B( e0 H由于,STC15系列,部分机型 中断中用PCON = 0x02; 会有意外,所以,掉电模式最好配合主程序使用。( R7 D: S- X# G  m/ _1 M
    3 x" H; `( b5 A/ G7 {
    bit Pause_Stats;1 i3 L* C* h) W& q7 r$ X
    sbit key=P3^2;: r% V' r5 E1 ^: p' w4 p2 Q6 E
    9 j; o) ~8 F, M- n9 }

    1 a; Y7 a1 X* Z$ h7 X, U& fvoid int0() interrupt 0      //必须要有
    7 q9 J" r' m; h+ a# V4 b# b7 m' e/ h{   
    " h5 O) I+ m. R2 w) w; X" ^' p, t4 V1 e, D4 U; a
                   EX0 = 0;   //关中断
    2 P% J! F( O7 ^# M* x; ]}
    3 g- l0 J4 n' M( E% Y, r; ~. K5 C* V- A9 Q$ Q" h6 g
    void main()& ~' a$ c7 N. j* U: b' Z
    {
    2 C# z( H  ?. ~$ H       unsigned char i;/ p2 m/ o  g& U4 t. h. `
         IT0 = 1;
    9 c6 S* [: e9 ^9 w     EX0 = 0;   //关中断
    ! A( ^) g$ z4 N4 G& k  K' a     EA  = 1;$ W2 }# q' L+ ^, K4 z4 A6 p
      while(1); n* s4 z. n6 l$ u* f' {4 P
      {
      s( s" g% `: U' R" i  e8 R" Q         if(IE0)  y# t9 P( a) o
             {# }* {* q; Y% M1 t$ u% t. Z
                   while((IE0) || (!key))- [+ M+ V# ^3 U9 Z' e
                  {
    ! u  t) q+ U' X3 i* k# S1 l5 Q" @                       IE0 = 0;7 p" I: k9 h( x1 ?
                           i = 200;7 {! d( Q( u; J9 a: h% `/ G
                           while(--i);9 z; T+ {0 n. J# r8 V2 D
                   }  //消抖 & 释放按键
    ; `. n' c2 }+ I- \  S9 }  I9 q: n                EX0 = 1;     //开中断9 m. ~- R2 |; N: u$ F# K% W
                     PCON=0x02;      //休眠           ' d4 b$ \- M" A; L) v7 y( U
                    _nop_();
    4 W% d! ]; ?7 l5 L8 O                _nop_();
    ( t, M3 a9 ]4 F$ v- F) n                while((IE0) || (!key))% D9 C, V& n' ]1 w" Q
                   {
    # Z1 T% A' C5 g                       IE0 = 0;: ^  _5 c9 Y) o; `, O6 n9 ~9 x/ G
                           i = 200;0 M2 e- a& ~8 h6 S- I& p/ v( e6 T
                           while(--i);
    / s$ w4 {4 K6 t3 R0 ^* h$ U                }  //消抖 & 释放按键
    ' r' {$ c4 Y& R$ ^  J6 \% u           }
    : U1 O. b5 ?9 q- D; p% C6 p}
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-29 10:20 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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