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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
我想做个系统,要求单片机在任意时刻,按下按键系统暂停,再次按下按键的时候恢复继续执行。我用了2种方法都有问题。) R. F! r1 j) X4 }# K2 P  G8 D# V0 e
方法一:中断和按键用的同一个引脚(部分程序,中断开启在初始化中做了)
! _6 p2 A# }7 }4 {* K' C  E* @bit temp;
( p% ^! T- A! {$ Msbit key=P3^2;* a2 d5 P# F% I+ h7 P
void int0() interrupt 0
/ \' E' G6 K7 h* U7 u6 w0 E{
4 V' R# c1 A! u       temp=1;- q- i2 h( c. V; T6 _
       while(temp==1)
4 c% h' F) T' d       {
8 G! W( i7 p( f- S" J               if(key==0)
: k& s/ l8 T& N9 i4 Z! v8 F; K              {6 S1 _* @$ @  ~1 ^; U+ J
                      delay(10);
0 s1 F- R: E$ }( x& s: W                      if(key==0)6 r7 ^) P$ z+ A. S0 e7 J1 [1 Z
                     {
3 b) @! O- c' \! P1 P  z                            temp=0;/ U: h$ X% W, c! m8 I( F
                            while(key==0);, u# E  r7 y; Z( C& R$ _$ ^+ @
                     }
; x4 n2 t, F* i. P5 M, h              }( U3 E9 ?, u/ k, d. l. o; K) ^
       }* L# ~# M* @- _- v) _) K
}
1 m/ `! b  n% i; Y  K方法二:掉电模式+ N, v9 X" Y% j2 \3 r
void int0() interrupt 0      
' o4 }3 l5 P4 |; A{   
* v9 k' [) q% ^- |- F+ U        uint x=0;
( c5 v) I& z& p. n4 G        IT0=0;
" j3 u7 b: U! X# V        EX0=0;/ G  _6 V/ ?3 c, O9 f- T8 b
        while(k1==0)2 O" }) n5 j- g% B% f2 {* |- M* Y
        {1 Z. b6 j9 K$ ]4 g
                x++;
7 A& d* x4 A2 ?8 s, l                delay(10);% p! Z3 K; ]6 e. r
                if(x>=1000)
9 @0 Z% M* i1 @& A9 V  r                {# n+ a! x3 Q% z' S' Z* ^* U
                         PCON=0;% `1 R4 w! f8 R5 l$ \
                }                  
5 E" e) D' l1 t; R# L  L        }! `. Z* |  i. q# o  {/ T
        if(x<1000)* j' [( R7 Z& n  q$ ^
        {$ A0 @& Y' K# L
                IT0=1;$ w% q* {: S# h* o- O
                EX0=1;) y' B3 P0 ?9 j4 K( E! g9 }
                PCON=0x02;
7 Z- Y0 m3 k  i. T                delay(10);7 w6 D( r, t4 A6 k) @/ n% S% e1 N
        }              * t1 @: m( H) W6 H: S
}
, a# O, t6 b( [. h% C" ?2 V4 X' h( \4 K+ ]2 `
  • TA的每日心情
    慵懒
    2022-1-21 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    3#
    发表于 2022-5-30 14:32 | 只看该作者
    单片机, 是不存在暂停的, 要起到看上去"暂停"的效果, 要么让他 在一个地方 傻跑, 要么休眠。你的两个思路都对,但是代码都有问题。
    # }* @8 r& ?9 R8 l7 ^. E  i0 S5 Q$ T- \0 E, A0 ?2 }+ r
    方法一:中断和按键用的同一个引脚(部分程序,中断开启在初始化中做了)
    + A+ J& `7 X/ [; m3 C( _. e注意: IT0 =1
    0 {* L, n; H3 [) A' a% K' Tsbit key=P3^2;2 N3 {% i" N# Z5 H! D
    void int0() interrupt 0  R, x9 I, T& B1 D& n
    {
    " M0 J$ J1 E3 X1 \5 M% w: o3 E  a. Y
           unsigned char i;- Y+ e4 V8 j8 e' N+ [3 l( g1 i
           while((IE0) || (!key))
      Q3 F+ ^/ a( J; N$ \       {# s: X4 ?1 ~1 \& k$ W
                   IE0 = 0;
    6 J) k3 [' ?1 h2 T4 a" `               i = 200;
    * o: g$ J9 H) I- ]0 B               while(--i);
    & X  y  ]0 o3 C$ D) ~/ l/ R/ ^+ T       }  //消抖 & 释放按键0 i- ~* d" _) k$ R: O/ ~
           while(!IE0);        //暂停现象" O2 {. e* ^( i! {! ]7 m6 z
           while((IE0) || (!key))& h: C' ?' w, A) H
           {
    , ~# [# L: N/ ]               IE0 = 0;* R- ^5 c! @6 g  `. j8 j/ S& i* I( H
                   i = 200;: G# l( x! t- f" `1 ]5 S3 `. x( f, M
                   while(--i);* S( s( p7 B4 K" F/ V* A" Z
           }  //消抖 & 释放按键
    5 E% U# W- x" Z: F( ~9 o}7 L3 B+ _- K7 q4 t/ x& p

      ?2 h5 K  R# y7 D* M% M' e
    , H7 x0 o) L0 a. ^% ~方法二:掉电模式    注意: IT0 =1
    ( u4 Z9 A1 y* O6 F# w4 S1 I/ f4 J由于,STC15系列,部分机型 中断中用PCON = 0x02; 会有意外,所以,掉电模式最好配合主程序使用。
    # ^  L- T+ e) Y+ }$ ^( I& T
    7 E5 X7 [6 K/ N0 xbit Pause_Stats;# n( q* `  e  P3 k+ Q
    sbit key=P3^2;5 V9 G+ F% ?; w# Z, Y
    ( e- l: ?& ~! N9 i. a

    : i3 E6 _3 n; P2 V, ^void int0() interrupt 0      //必须要有
    2 D; }' d' m! O0 C: Y{   4 r2 U9 J  J" R. p1 _' e
    # O6 h5 a6 G5 M6 _4 T- w: Q# j
                   EX0 = 0;   //关中断
    . ?! |% C" V; \}5 m5 u9 w9 T1 j+ t$ P! m
    ' G( u" [) J5 W: i
    void main()- G" h  Z1 [$ r1 ]. }5 {
    {
    ) J* Q' }- Z: O  |- F% i4 C4 y) G       unsigned char i;; g$ W5 ]2 h9 G- d% b! i% o) F8 |( M  o
         IT0 = 1;
    : i6 [" h6 o/ C# w8 j6 ]     EX0 = 0;   //关中断( l, P5 Y2 ^. n0 j! `! f+ {& F
         EA  = 1;
    & s. Y, B9 w% A* |* O  while(1)
    ) M7 C' Z  v, }- J  {
    $ f8 I& r& A! E6 \$ y4 f( b         if(IE0)
    1 s( W/ F9 }# n8 V0 L2 i; w  }         {
    8 Z+ y; d% |" h5 D, f               while((IE0) || (!key))9 I2 E3 X2 @7 u6 b. \# n0 X4 \4 q7 B# c6 l
                  {
    , Q/ K8 v- w" l/ G                       IE0 = 0;+ V" f& Z2 u5 K2 g) S& Z7 B
                           i = 200;2 f3 z/ c2 A* C, ?
                           while(--i);
      E3 z: a6 ^8 d! w               }  //消抖 & 释放按键
    $ h( s; [! p- A5 `0 n3 {4 s% A2 m                EX0 = 1;     //开中断
    , Q  Q# d. \5 O: l: t3 e' X                 PCON=0x02;      //休眠           
    & [8 U. }! U9 i/ e3 d9 s! J                _nop_();
    ( E' H3 M7 u/ i2 V8 q* y                _nop_();
    % m0 ^$ I- t( F. T; M                while((IE0) || (!key))
    7 W: Y% @' p7 ?1 g0 H               {/ V$ J% x4 ^6 z' c) z
                           IE0 = 0;
    - e$ `  X$ r0 c. [                       i = 200;, ]4 a' N, {0 t7 Q! _% B+ S$ M
                           while(--i);
    ( ]4 k% b: L2 G& S2 E8 m7 m; t                }  //消抖 & 释放按键
    1 u+ M+ L% ]9 C7 q* b" {           }5 V1 A  {2 ^: @( ?& \" W* _$ M
    }
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-18 10:34 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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