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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
求助:关于51单片机中断嵌套; r. t% v/ ^: {7 r

* y; T& }" q! `9 _4 h* P' r" Y/ }# Y3 P5 T! R8 K
各位大神,如果我用STC90C516RD的
单片机,默认的中断优先级,单独跑两个定时器中断,都OK,两个定时器一起跑就有问题了,定时器0中断正常的,定时器1中断却像没有执行一样,这是为什么?两个定时器服务程序对换也是定时器0没问题,定时器1像没有执行一样。; S, o* E! @5 l6 T- c3 a/ f

该用户从未签到

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

该用户从未签到

3#
 楼主| 发表于 2019-4-12 14:18 | 只看该作者
void init_timer(void)
* |4 j# w, T) v# ?6 L% m+ q{$ V7 ^8 U+ P, T9 G. b
  //AUXR &= 0xBF;  //定时器时钟12T模式1 b6 ?- @& L$ a, {3 L3 K! j* R& t
    TMOD = 0x11;     //设置0定时器模式1( ?: C9 j$ ?- O1 F9 `
    TH0 = 0xFF;    //设置定时初值3 C+ z5 O# Q9 G  p2 M8 x) R
    TL0 = 0xF6;    //设置定时初值 10US4 D0 ^% O) `- Z  {1 {8 v2 Z6 y
    TF0 = 0;
6 G4 C2 I. h% q' w6 m( |    TH1 = 0xFC;    //设置定时初值/ C+ O% _: r! h8 ~" Y+ Z
    TL1 = 0x66;    //设置定时初值 1mS
2 A4 @7 i+ b- k- H* f$ d7 r; @    TF1 = 0;
: z. o0 z9 l; i: Y9 K. X( h0 q    ET1 = 1;
9 k; }0 _! V) V$ \; B    ET0 = 1;
3 C* S6 N7 ?$ o( p6 c1 @! j   EA = 1;) s4 m& z% t3 p# K5 N4 z; c
   TR0 = 1;, F- e! d- M: t$ {$ [
   TR1 = 1;
! [6 P, @  a9 a}: s) W' {( w) _1 M0 U7 ~, \5 d6 _+ b
void key_scan(void)//按键扫描% v6 J. j9 I& g0 ?6 _
{5 u& n. w2 c3 i5 N4 w% n6 E5 @- K
   key=1;
3 j2 T: B/ x* y- e/ Z8 nif(key==0)
& l+ N3 U# B- a: g- J% V{$ Y: l9 q6 ]* K5 f0 p; ?( b3 X
  delay_nms(15);+ F4 o7 I; g2 `5 z/ M! [  \
   if(key==0)
- R' m" ]$ S6 j  h$ T/ Q4 f# r- @   {. s6 z8 O! `% c/ P) t3 {* t% `
key_flag=1;
, t. _. b) |# F/ W; ~$ i+ \   }" g0 V# V" h' X* X( S  x% C3 c
}
: o% R- h9 A# w2 C; E9 |; v}
2 y# k* X5 f+ d( ~. a, C2 g! y2 Mvoid main(void)% ^9 N$ H' h# `1 R( k
{ " E$ E8 v) s* V5 y/ h, }
  init_timer(); //初始化定时器
. `" _' W/ T* i8 M. b$ P) y  Init_BH1750();       //初始化BH1750+ n( i" w2 p4 ]: t- E( K
  Delay10ms(2);: @1 V( v. f, b- t, m% z
  Single_Write_BH1750(0x42);
  W: R2 ~& X# a+ M  Single_Write_BH1750(0x65);   //设置透光率100%" m$ v5 v3 c' w0 q0 m$ Y
///////////////////////////////////////////////////////////////, o, Y4 ~3 @4 Y6 [1 X$ Q; `$ b! ^- Z
  while(1)
, p6 {# F; P& G. A  {
" K+ s4 N* i8 U9 P8 _2 X* K   key_scan();4 H: _! z: T9 }) r3 q' U0 v: i
  if(flag_BH==1)
9 j* e$ h2 F+ }. p& ?' j{
! ]; t) {) @$ o7 `0 o  flag_BH=0;
  D& D( H9 Z. K- {. D9 x+ W   Single_Write_BH1750(0x01);   // power on
  D; u/ w1 p8 X# V   Single_Write_BH1750(0x10);   // H- resolution mode
) J1 v( \' m* x   BH_flag=1;
3 H) U+ m, S# m; |1 {3 X5 C}9 T0 _: t; J2 _' N
   if(flag_key==1)8 S( _, z7 n3 s+ [/ l  [) A
   {
+ f2 u; _5 c6 t& [) F" w! JPWM=0;
  Y$ U7 i# S. j0 u  a/ tbh1750_con=1;
0 i4 c1 m5 {, d/ {! i/ I6 n   }( }3 _6 ~* u% x4 ?/ o1 E2 d3 B" o
   else
- r' U3 s* d& F7 x, |   {! f6 l& E: w) q7 a  S
    bh1750_con=0;: N6 ~) H$ n) t) L1 [( G. a
   }
7 t$ u( S$ x; O* |  }6 \1 p5 k3 ~. r# u  Y3 P
}
+ R* y; G2 c; o# U///////////////////////////////////////////////////////////
3 j8 Y) O. V- }, x- i1 @void timer0()interrupt 18 o/ p* u- ]  O. N  y& U; G; ^) z
{
) C8 x% H' O6 [  p7 k" R5 [, y1 h  @TH0=FF;
* Y5 J5 F" K7 a2 k. o4 ETL0=F6;; U) k9 P, j5 B0 T% f# b
n++;- Z- V  i! g" K, K) [3 N
if(n==100)
1 {# G- b2 {5 x( b3 `{( `( _' R. N$ T) A
  n=0;           ;
+ |# o' B$ @. L2 k, x4 [0 X  led=0;' s% D( f. `+ r/ J" s, M7 w, Z
  j++;
: x0 \/ [4 g% \3 d" E( ~0 I( |}       ! ]( ]! u1 t, T$ a# W
if(j==200)3 l9 x! }+ j8 R
{
4 ]7 o; P) r+ c& t/ Q  j=0;# r5 ^6 i) i) W5 p+ R5 a
  if(flag_key==0)- V5 M. ?3 Z- y1 o+ u
  {
; G! l% `9 I! v0 X) U7 L, j" H6 L. f    if(Data>15&&PWM<100)! y4 n3 {- e+ m: L, z1 L
{6 s$ H1 [; N. Y5 B4 j, ]! B
     PWM=PWM+1;
+ W- v6 w! Y* Y" o) @  K( a) M- V    }# `$ ~  I0 p# N- ]  M
    else if(Data<5&&PWM>0)
& Q9 u  C; x- g! k, u) u% v; ^{+ c4 l; X% ?( v3 [
     PWM=PWM-1;
& P0 h6 ?7 Q  m" b1 {' \}
  }# Z& {* {- z: [  }
7 `7 a; A5 Q2 {; Z5 \6 f}+ J4 n+ B' d" d; u
//if(PWM==0) con_l=1; ) v) S% a. u) A# {9 e; k
if(PWM==n)
1 b4 a8 S3 a* e2 ^3 n  {  H+ D. ]% y9 _$ n) x) R
led=1; //输出高+ a* O2 s# b  h- ^6 Y
  }# `: p  i0 G# {* e9 r
} //PWM越大,占空比越小! [$ n) F+ E& u* R5 R7 Y
///////////////////////////////////////////////////////////////6 t$ l! O9 X' x0 U4 {2 s! B: _- D
void timer1()interrupt 3
7 _: O: b+ Q# k% H$ P{
# N/ G! x' y4 c/ d( @TH1=FC;; d3 E3 r( E8 O; {* E2 o& C' ?
TL1=66;
  B4 _9 T2 I: z4 j0 Q" y7 Qif(key_flag==1)
; ^7 b# N* }1 }9 |{
- K* P: ]( m/ b5 a/ q3 i) L) x  i++;; B7 {0 m, p$ ^
   if(key==1)
0 U7 h2 l, J+ O% f7 x" B( _  {
0 v! E  k+ }0 G9 M   delay_nms(5);
! N/ T9 [4 b, S1 g0 ?( g2 w   if(key==1)
2 X, O% Y8 V/ t6 T5 ?6 g  |4 |   {
+ J/ z0 v2 P# F7 U5 s    if(i<=100)
3 f5 Y" I6 [; s7 ~9 J    flag_key=1;+ m6 ?. n; X' t* h" H; a! i' E- M
    else if(i>100) flag_key=0;
4 k1 z0 s) {) _# e" y    i=0;( g: \+ U% \/ H
key_flag=0;0 }( Q" T/ V6 I1 X
   }6 l, e: l0 e$ ]: B4 j# C
  }
7 s. P4 w2 I" I4 x}+ W% n8 H) K6 [6 q/ c+ f( j! |
if(BH_flag==1)
! W0 O8 O% ^8 w+ {9 Y2 I; I# ], h{2 c$ s  n; g. K" o) X. K! `1 w
  BH_c++;5 ~- L& y. ~  ~, p4 ?0 C) ~
  if(BH_c==180)* d1 [; \6 j' E" d. ~& s% c
  {7 e1 g  J4 o$ |! U
   BH_c=0;0 L0 o9 S% o& R& R& x
   Multiple_Read_BH1750();       //连续读出数据,存储在BUF中/ Y; d' c# ]$ B7 v/ r+ W
   Data=BUF[0];
( O( E5 v6 l8 ^3 c3 Y   Data=(Data<<8)+BUF[1];//合成数据,即光照数据
9 D4 ]; x8 L% Z9 w3 C   Data=(uint)(Data/1.2);' j1 p$ U8 A) i- t! v2 e8 A
   dif=abs(Data-10);  F( G- {4 [3 {  X; e' [
   BH_flag=0;
9 @0 o( x, i* M# i  flag_BH=1;
  G) ~% i4 Q- u2 I* L  }
" @9 D$ c+ N9 m}
9 ~+ `$ N! ]' w. K) p}

点评

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

该用户从未签到

4#
发表于 2019-4-12 14:46 | 只看该作者
小黄豆 发表于 2019-4-12 14:187 W; s* E6 z0 K9 C' G' j( t$ Y
void init_timer(void)9 |+ h* X1 g0 D# r
{
# H. d" y' ]: _+ T  o: z, y  //AUXR &= 0xBF;  //定时器时钟12T模式
, X: O4 v+ u& I+ A( T8 D7 k
卡爆了!定时器0定时10us太短了,进入中断执行都超过10us,之后中断又来了,如此循环,定时器1根本进不了中断,因为低优先级无法打断高优先级。解决办法就是使定时器0中断时间长一些,或者进入中断时先关闭中断,退出时再打开
$ o; d  S% \+ B  X( f- k8 ^' B

点评

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

该用户从未签到

5#
 楼主| 发表于 2019-4-12 14:56 | 只看该作者
fanichicl 发表于 2019-4-12 14:46* `: W% i2 A5 Z. ?: z( E9 }- B' [0 I
卡爆了!定时器0定时10us太短了,进入中断执行都超过10us,之后中断又来了,如此循环,定时器1根本进不了 ...

0 h  }5 C! n) b4 b果真如大神所言,10us的定时加长以后就OK了,谢谢啊。2 }+ N8 Q3 R5 y& ^1 E, C% y
我想在问下,如果用1T的单片机会不会好点?
, W- E1 ?. {; P! [0 C: X

点评

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

该用户从未签到

6#
发表于 2019-4-12 15:32 | 只看该作者
小黄豆 发表于 2019-4-12 14:56& }7 x. T1 ]( z/ h) d, f
果真如大神所言,10us的定时加长以后就OK了,谢谢啊。3 B7 V0 X( O* F7 g! D
我想在问下,如果用1T的单片机会不会好点?

! j) s& k  w8 g5 p) Y程序执行速度会快点,最关键的是进入中断的执行时间不能超过定时时间8 s: Y- C: I( V; v, N

该用户从未签到

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

“来自电巢APP”

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-17 21:14 , Processed in 0.125000 second(s), 29 queries , Gzip On.

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

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

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