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

求助:关于51单片机中断嵌套

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
求助:关于51单片机中断嵌套
8 ~( z9 F) |+ O: C& Y1 a9 n; o9 T! o* \

* F  u& J$ |6 J% u* e2 W( m各位大神,如果我用STC90C516RD的
单片机,默认的中断优先级,单独跑两个定时器中断,都OK,两个定时器一起跑就有问题了,定时器0中断正常的,定时器1中断却像没有执行一样,这是为什么?两个定时器服务程序对换也是定时器0没问题,定时器1像没有执行一样。8 N! s% |6 M* e( e" P

该用户从未签到

2#
发表于 2019-4-12 13:59 | 只看该作者
估计是定时器1设置不对,贴上程序看看啊

该用户从未签到

3#
 楼主| 发表于 2019-4-12 14:18 | 只看该作者
void init_timer(void): W7 f2 L4 Y& v; `1 R
{5 T$ w# S' w& Y: P1 |7 |9 g
  //AUXR &= 0xBF;  //定时器时钟12T模式4 |( S+ R/ i" Y6 V1 ^+ B% m
    TMOD = 0x11;     //设置0定时器模式1/ n1 ]$ F% F7 H/ X4 _$ L
    TH0 = 0xFF;    //设置定时初值# b: }3 k, W" j: a1 L
    TL0 = 0xF6;    //设置定时初值 10US0 Y- p% @; {6 C
    TF0 = 0;; N* a2 V8 V: H% r: G/ A$ E2 P
    TH1 = 0xFC;    //设置定时初值) }' M, ?5 \; @/ Y1 ?0 E8 J7 S
    TL1 = 0x66;    //设置定时初值 1mS
; I5 T: C) }$ Y; z, z    TF1 = 0;" E. L  ]6 N) B/ I( W& L
    ET1 = 1;
' R1 d3 c$ D! y1 C$ c: j    ET0 = 1;
8 G8 U1 N/ B  s+ }   EA = 1;5 s2 R$ r4 _3 y* p2 _' i) h  j. K; y
   TR0 = 1;4 a& q: x: ?5 }9 }4 Q5 q! ^1 v
   TR1 = 1;* [  T! E2 u/ I0 ]4 K8 b/ V) P+ {- C! S
}, s0 Q# x+ G, U. d
void key_scan(void)//按键扫描
3 t) a# b8 s5 d9 t0 o4 i) ]! G0 ]{
/ {# [3 i* k: L, S5 w3 M7 I   key=1;7 |( @2 B1 L: U: \5 v
if(key==0)" m1 }6 v; ~& m  E8 s
{
8 F) o9 A7 k4 `6 d; H0 q" `  delay_nms(15);$ m! U5 ^4 F/ Y7 e- H
   if(key==0)
: `2 y6 J; i" Z, p8 x% J& L   {
$ n' e% G3 ^$ m% ~+ fkey_flag=1;" z0 r8 [. N$ G
   }' S, E" F. b+ P4 u$ b* y
}. Q) r) t$ V. {; N
}
; J3 c- X& v1 x( u0 vvoid main(void)
- J9 }, K2 a! B: ?4 x1 \$ l{ ) G2 m3 v3 S5 U8 d) m. g
  init_timer(); //初始化定时器2 B- a" v' v2 `# q9 q  n( a
  Init_BH1750();       //初始化BH17509 }& l# k7 @3 K$ y8 t& w
  Delay10ms(2);6 M; a7 \% Z+ n- E
  Single_Write_BH1750(0x42);
( k  M: C; i! ?$ X) j* P3 d0 ~2 `3 M  Single_Write_BH1750(0x65);   //设置透光率100%
$ a% b2 J  G" ^% j0 p3 @( v* A///////////////////////////////////////////////////////////////  n. R! y, L7 l
  while(1)
) U; [$ l7 O8 U$ ^% o& Q9 h% _9 d  {( n% P7 g. |- i  J
   key_scan();7 v4 ]% t8 Q' ^( E; k! {
  if(flag_BH==1)- F7 M4 w4 k& X
{- _  }/ B* N( P, @6 [4 M
  flag_BH=0;
$ k! T0 L  P: [8 ~6 J% T' Z8 Y8 A   Single_Write_BH1750(0x01);   // power on( A& E  q( r" H6 v0 c: S( k0 }
   Single_Write_BH1750(0x10);   // H- resolution mode
1 x# V' P  a- r   BH_flag=1;+ }$ K, U/ C9 H: T/ x
}) c# o! ~: ^* N/ N% n! R! J
   if(flag_key==1), r+ a  @" n* Y* G* S. [
   {( l( ?6 t8 F4 c( D/ n% W
PWM=0;
7 Y9 G, g6 @) w8 ^- t8 Y+ Wbh1750_con=1;
5 f! T# r. k% O   }
$ W# Y& s; B) Y# Q" e   else
& l/ A0 \. e0 e* X% e( F: W8 X" a   {2 J4 }: N  {' s$ ]8 o7 M
    bh1750_con=0;( J% N6 Y5 F# y. T2 U2 H/ a
   }
8 f: o. K- b/ k7 `, N  }: \# J% u; J! C8 ?. F
}5 i% K- U; [) V1 V/ D1 `+ `
///////////////////////////////////////////////////////////; {, b! E" {3 f2 @! w, P
void timer0()interrupt 1
+ `6 j! V1 f* z  h{# I5 e+ ~! f: X! q( j1 w0 Y
TH0=FF;) ^* K7 h' b( m$ V: d2 A$ F
TL0=F6;" @  N- @& y/ Q9 B- `% o  u! Z
n++;
) O! @  @* N; I1 _% D' Lif(n==100)
) N7 C7 p, J2 b{! h7 p' P. [9 s3 l, m
  n=0;           ;5 W4 z* W: J7 g
  led=0;! _/ T* R9 P( I
  j++;
  K- {7 \( j: T}       1 g! @% e3 X2 g$ G& E: v: {) U) ^. \. C
if(j==200)# `7 d# ~3 z) c: {5 s& E
{8 @/ S3 W( x# h
  j=0;
! B) q9 [' o! x2 z* W3 t& k% ^8 ^  if(flag_key==0)
/ R8 R0 ]6 E: T* i) j' l$ U  {
  F. c0 A7 D. I# E  M    if(Data>15&&PWM<100)
! C( J1 j- r: `- h& {: S- v$ I# S{
1 Z" r, C  q, M5 l- ~! R* h     PWM=PWM+1;
. W* K% E0 j: X0 R$ [0 e5 ]  ]    }9 a0 |) V: d2 \# m" U
    else if(Data<5&&PWM>0)
8 A+ F* c% h. G8 W{) ~! x! g+ R2 |! W2 K' H/ ?# G! m
     PWM=PWM-1;& m+ I  x6 Y) w7 `3 Q, D) y
}
$ G1 ^, y" [3 B8 [  h6 p  } ( o- \5 j1 `# c9 |& o4 u2 m# a
}
$ Y( t8 S+ m) M//if(PWM==0) con_l=1;
% R" X! a5 W5 ^. cif(PWM==n)
! y$ ^# U- W# m! E1 c  {/ }, i. t9 O! k3 ?$ {6 v$ z
led=1; //输出高- `- o$ T- A. l# ~2 y* H
  }
& ?8 ^3 U4 v+ j) |% }/ O} //PWM越大,占空比越小
0 R& ~% y4 U0 K& s8 X9 D4 B( J( Z# |, J///////////////////////////////////////////////////////////////
* H4 ], {' D/ W  D! c$ [void timer1()interrupt 3
5 n. g! ^- ]" e2 B+ A: ~0 P{) E# `4 m& _4 Q
TH1=FC;
. S  u1 G1 `/ P; d9 p, f6 E7 uTL1=66;: Q: a: ~" N1 J6 l: y4 ~
if(key_flag==1)
! S- @9 y' f1 a# k{
5 b9 E! ]/ {5 _* D0 ^  i++;
6 I  B+ J6 u, {9 S' }   if(key==1)6 w  [3 g/ h) n9 B
  {# J3 b1 {  I$ `. J* t
   delay_nms(5);
' o8 s9 t$ X6 |2 t( p   if(key==1)
% \" R: ~3 R. m4 q: o1 j9 L+ o   {
2 H, [" r  P! n  c' V2 Y/ g    if(i<=100). Z: ?8 `; L4 U2 I* d
    flag_key=1;2 `) b/ s- ]( S+ J8 L
    else if(i>100) flag_key=0;9 C8 O' v; F* D+ N' p: E
    i=0;( \  a# M' ]& J  S+ W% Y. @
key_flag=0;
& P) l" i0 h/ ]6 z, |/ u$ M5 i   }: T1 Y+ B) _5 h
  }
5 j6 `* l% u0 k2 ~( G- T}
0 B; ^* m( z+ v% p' Yif(BH_flag==1)7 H5 \1 }2 f; D8 U5 a
{
* K2 N8 p' e3 V# G% I$ L+ D  BH_c++;; _9 I( A0 i" b' [7 U& ]
  if(BH_c==180)
& A" E5 g4 T+ a9 h1 K  {
1 ^# x: ~& j# x/ K0 n0 e: P   BH_c=0;
: J0 E5 X# u9 L1 a0 X   Multiple_Read_BH1750();       //连续读出数据,存储在BUF中0 R/ M; u2 I3 ^  m
   Data=BUF[0];6 U8 B; I2 H$ [+ _6 S0 K0 O
   Data=(Data<<8)+BUF[1];//合成数据,即光照数据
  q/ [$ G* L! ?8 }  i   Data=(uint)(Data/1.2);' D8 z7 a& P2 h
   dif=abs(Data-10);# P4 y3 f+ L0 r1 R9 P
   BH_flag=0;  o6 N+ x. K  D% u
  flag_BH=1;8 `8 }) T: n2 @! S, {, n
  }, |; Y/ X: }4 F7 z, s  [: x, g+ Y7 r
} ' A8 a3 \5 E$ U1 |% s/ Q
}

点评

卡爆了!定时器0定时10us太短了,进入中断执行都超过10us,之后中断又来了,如此循环,定时器1根本进不了中断,因为低优先级无法打断高优先级。解决办法就是使定时器0中断时间长一些,或者进入中断时先关闭中断,退  详情 回复 发表于 2019-4-12 14:46

该用户从未签到

4#
发表于 2019-4-12 14:46 | 只看该作者
小黄豆 发表于 2019-4-12 14:186 v8 S) N% c2 n  B& p# b
void init_timer(void)
& G, T5 J( [, q  y* F{- V9 h  V* l7 O2 G. D& h* d% z
  //AUXR &= 0xBF;  //定时器时钟12T模式

5 f- \  C1 k2 e1 H卡爆了!定时器0定时10us太短了,进入中断执行都超过10us,之后中断又来了,如此循环,定时器1根本进不了中断,因为低优先级无法打断高优先级。解决办法就是使定时器0中断时间长一些,或者进入中断时先关闭中断,退出时再打开" x, A* ~0 O" l; b6 z, m

点评

果真如大神所言,10us的定时加长以后就OK了,谢谢啊。 我想在问下,如果用1T的单片机会不会好点?  详情 回复 发表于 2019-4-12 14:56

该用户从未签到

5#
 楼主| 发表于 2019-4-12 14:56 | 只看该作者
fanichicl 发表于 2019-4-12 14:46
8 A) R# K: o: i! ]5 ?6 `卡爆了!定时器0定时10us太短了,进入中断执行都超过10us,之后中断又来了,如此循环,定时器1根本进不了 ...
; E/ _! W' X* k! u4 Q+ G
果真如大神所言,10us的定时加长以后就OK了,谢谢啊。6 ?) Q$ @! O; r; `) K* ^( D9 j/ q
我想在问下,如果用1T的单片机会不会好点?: @+ H: A: W& \. K6 ^# v% H

点评

程序执行速度会快点,最关键的是进入中断的执行时间不能超过定时时间  详情 回复 发表于 2019-4-12 15:32

该用户从未签到

6#
发表于 2019-4-12 15:32 | 只看该作者
小黄豆 发表于 2019-4-12 14:56# @" o% v: O7 R% H' h+ M# g
果真如大神所言,10us的定时加长以后就OK了,谢谢啊。
  H6 j9 X% I6 G5 l9 |! K7 D$ o我想在问下,如果用1T的单片机会不会好点?

7 |1 m5 }/ f0 T" e  ]程序执行速度会快点,最关键的是进入中断的执行时间不能超过定时时间! {+ b+ Y5 c6 I! u8 h0 d

该用户从未签到

8#
发表于 2021-8-16 13:50 | 只看该作者
手动点赞

“来自电巢APP”

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-25 11:48 , Processed in 0.093750 second(s), 29 queries , Gzip On.

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

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

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