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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
求助:关于51单片机中断嵌套
+ |' c  b3 N; g- G3 w" R1 }0 O9 q7 A2 S" x9 J" L

, v; \& F0 D9 A# f) `各位大神,如果我用STC90C516RD的
单片机,默认的中断优先级,单独跑两个定时器中断,都OK,两个定时器一起跑就有问题了,定时器0中断正常的,定时器1中断却像没有执行一样,这是为什么?两个定时器服务程序对换也是定时器0没问题,定时器1像没有执行一样。  r4 g  z' M/ T' @& m1 M% r7 W# h  p" |

该用户从未签到

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

该用户从未签到

3#
 楼主| 发表于 2019-4-12 14:18 | 只看该作者
void init_timer(void)
8 D$ c8 [$ B4 U' _  Q8 a+ B{: h) u0 Z+ r# J8 X- ?
  //AUXR &= 0xBF;  //定时器时钟12T模式) Z, ~: |* N; g& R" E: H
    TMOD = 0x11;     //设置0定时器模式1
( a' w  c/ k/ i) j    TH0 = 0xFF;    //设置定时初值5 C- y3 @! ^5 M' O1 `* q; G
    TL0 = 0xF6;    //设置定时初值 10US) m% _' V' X& u
    TF0 = 0;% ^$ G7 h1 Y9 D$ P) Q; l# l- C
    TH1 = 0xFC;    //设置定时初值
0 w8 `  Z7 k4 F    TL1 = 0x66;    //设置定时初值 1mS
8 g6 D( u( a5 H    TF1 = 0;7 w! m) y2 ^3 b
    ET1 = 1;# L; X2 a- ]+ d/ @. y4 q6 [3 K
    ET0 = 1;5 Y/ G7 l. d9 t+ B9 f
   EA = 1;
1 R6 L9 G" A, U! o   TR0 = 1;  g7 h! k& |! y0 h6 b2 Y9 H
   TR1 = 1;
7 x3 |3 s( `* D}
2 ^6 P9 y: z7 a! {2 Y7 Nvoid key_scan(void)//按键扫描2 a5 x" x, j, R+ L  l
{
2 e, F" k" S& k! N   key=1;
' L# O2 A" ^  u( i" @if(key==0)8 _. Y: _" U; a9 E% L% T' B/ A, {
{
; l: Z0 K, n5 M) D4 G  Q# B- P$ e  delay_nms(15);3 n( @9 e$ |3 C7 I4 V+ M' V* R7 t; i
   if(key==0)  p( Y% w1 }+ C7 D" M8 d4 C  w
   {7 ]8 o, |6 V1 j, Z0 G* U
key_flag=1;7 S9 N% [# |" Y3 ?: \
   }- a( @5 N, g5 ^0 R8 X7 S& J) H" E# g
}4 e1 G4 H4 ^2 i: f- K$ W
}
; A  }' M% L6 ]7 w3 K. }/ l2 R7 h9 [void main(void)4 Y) M; G% b1 b1 r# r4 I6 q3 ?
{ ( U( ]5 B# Z, B8 y8 N
  init_timer(); //初始化定时器
" d6 v1 T& b7 R  Init_BH1750();       //初始化BH1750) A( T5 c+ L, t3 R
  Delay10ms(2);
7 @2 V" W; B# C0 V  Single_Write_BH1750(0x42);" z& r. h, F, x  x. L* u5 t9 F
  Single_Write_BH1750(0x65);   //设置透光率100%
+ ?; N$ l- J7 z# d; A8 k/ ^///////////////////////////////////////////////////////////////
0 Z- \! T* O7 E. C$ i1 U; @- X/ j7 h  while(1)
/ S: w2 }, F  @8 b1 Y7 S; f  {
( h: I3 z4 B' x# c) O1 j6 q3 b   key_scan();* u2 w* D9 G6 c- j! ~
  if(flag_BH==1)6 W; H  K: r) z; _  U
{9 R- Y" _1 S5 s, \* w) D0 Y* K3 c
  flag_BH=0;& Q9 j7 v" a. d1 E, n. Z
   Single_Write_BH1750(0x01);   // power on8 K$ Z" x% y8 @2 C
   Single_Write_BH1750(0x10);   // H- resolution mode& C7 _# m, H0 x7 C
   BH_flag=1;
  @- `' p& _* G% {}
2 R& r$ [& k* ?+ n   if(flag_key==1)( J3 h( u' z1 u' H' Y( H" D: B1 A' [
   {5 [. e8 r/ Q/ |: p# S: L6 K
PWM=0;& h; a6 a/ P3 n) P. d9 ~( n+ {
bh1750_con=1;
3 d; s2 R( u4 s, e1 q* p   }. y2 P; I  `# F
   else
: m8 ^' |& u  o8 w! d   {1 u+ M8 A1 t# t
    bh1750_con=0;' K& U- f$ {: }5 }2 I
   }+ [( i1 b8 w7 s; `& l* Z
  }6 h5 X5 z. E5 N* c5 j! P! {: Q! C
}
6 j1 O* @6 G4 T/ S, D# H///////////////////////////////////////////////////////////
9 x6 Y- S! P" N! j3 R# hvoid timer0()interrupt 1. V0 R8 W, W3 u
{
& w* p: o. L  P& z! A( nTH0=FF;
0 Y( d) N3 L8 J9 I- M0 `/ pTL0=F6;! I9 u5 ]8 w# ]/ Q+ u
n++;
0 ]4 ?5 S8 e4 s; ?. ^8 ^# ?if(n==100)# V( e0 ^4 n! n8 z/ }2 h' U
{
) r" f9 s' t5 f  X7 B2 L  n=0;           ;
3 Q# f( i3 k& i/ Q5 l- w  led=0;9 M# h6 b9 [$ y7 N/ j' _/ V; ]
  j++;
- ], }9 E- Z, {/ E}      
& `3 F9 ^: L" R! dif(j==200)
& a. |9 u- b  P" D{4 V4 Z2 _/ f4 ^1 U; t2 N
  j=0;
* L; g( y: ], L2 z4 e  if(flag_key==0)
5 O5 v; n9 N, c$ Q  {
+ A- p2 K& ^; O1 q0 v    if(Data>15&&PWM<100)/ d6 V! i  E5 a. E
{
; @* Y6 |# n+ }& U4 |     PWM=PWM+1;
- Y8 [6 B! c$ l9 w$ ~5 h5 \    }
: u# O; N! s, _3 Q  Y4 p    else if(Data<5&&PWM>0)) Y6 C4 ^) y4 q& K( V: m
{
# {  N# A3 H3 D; f1 k- o     PWM=PWM-1;5 R; T) T! z- G1 H  t9 {, q
}4 H; i. L( a0 E% Z3 X# {
  }
3 j4 `: H' t3 p/ N6 b}
5 f3 e% h5 `( {4 u//if(PWM==0) con_l=1; 1 x# H4 Z! J! W4 c+ t
if(PWM==n)
1 h/ R$ I, O5 t* s0 x+ }: ]% W  U  {
, f# T$ A2 Z$ q2 ~8 V" P& ~led=1; //输出高
) f2 [/ y8 y: _* u. T! J6 N  }+ P5 }- {6 U! x. ?; T
} //PWM越大,占空比越小
4 b; y0 N0 ^) q1 h( t///////////////////////////////////////////////////////////////9 Q$ e3 w$ m+ E
void timer1()interrupt 3$ A6 I, h  c8 N$ W
{, o9 j- l, k  g2 j2 q, \
TH1=FC;2 {( U5 s# T4 ]# J! h* w: H1 k
TL1=66;
, {1 Y( \3 @$ V* P0 x1 q2 Zif(key_flag==1)
3 J* C9 [5 J+ n+ N4 ~{5 c1 z5 t# U4 R% w
  i++;
) [8 ^' X% y7 y8 Q- H   if(key==1)' S! w) K7 O3 _& }. s" @( v+ Z! j
  {
) r2 X* ~+ {  Q0 m( [   delay_nms(5);% ^1 m  S+ Y: ~  A: Q# k2 V3 k, K
   if(key==1)
7 p* g* p. E! @/ ?( w# u   {/ M* v' q3 e' ?/ U- F, Z& A
    if(i<=100)
$ n% D0 O; s  [    flag_key=1;1 s8 {( t: p! Y3 |( H7 w# A% o
    else if(i>100) flag_key=0;- _" W% d9 h, s' X
    i=0;
+ P1 f) Q* C8 ~4 v* ]6 skey_flag=0;
+ u# e& H$ {# W* v. v, b   }
+ R0 U& _$ a: |; q$ l9 a  }
3 `: v3 p4 G# l. y1 d}
* Y2 R) g) r! @3 S6 Kif(BH_flag==1)* i$ L; ]" \6 ]- [5 g) @+ o
{# V/ z3 |! |% s: m
  BH_c++;8 w7 W& A  g4 b. ^* Q/ G
  if(BH_c==180)
$ z1 g  T% g6 D8 q  {
, _  b5 e8 M% \9 O6 q" H( J! F   BH_c=0;
. U/ r7 N4 w: O6 Y" c" X   Multiple_Read_BH1750();       //连续读出数据,存储在BUF中
) f2 f" |" ]# n" q" |$ V   Data=BUF[0];
2 A9 e, k$ t/ `7 S, I   Data=(Data<<8)+BUF[1];//合成数据,即光照数据
% v  K! F! ~1 E1 Q$ K2 i5 u/ ?   Data=(uint)(Data/1.2);" w  l, x) `8 z. w
   dif=abs(Data-10);5 u" [3 v' i; X1 [. z2 h
   BH_flag=0;. F6 E1 x: B% E/ s" S4 s; {  F
  flag_BH=1;
& J" h) W& x/ p& g  }
4 a9 z. o1 D! O}
) S, A$ \. C7 X}

点评

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

该用户从未签到

4#
发表于 2019-4-12 14:46 | 只看该作者
小黄豆 发表于 2019-4-12 14:18, R8 Z( ]% M4 q; {
void init_timer(void)
: q* R% h$ C) q" f0 u" Q( @{
( b' R8 T/ h4 ]  //AUXR &= 0xBF;  //定时器时钟12T模式
5 N, u( \4 P; k2 G- e& Z2 m& X3 s
卡爆了!定时器0定时10us太短了,进入中断执行都超过10us,之后中断又来了,如此循环,定时器1根本进不了中断,因为低优先级无法打断高优先级。解决办法就是使定时器0中断时间长一些,或者进入中断时先关闭中断,退出时再打开
, }1 j$ X6 z' A

点评

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

该用户从未签到

5#
 楼主| 发表于 2019-4-12 14:56 | 只看该作者
fanichicl 发表于 2019-4-12 14:46  `" [, d3 t9 `% w. m# S8 |
卡爆了!定时器0定时10us太短了,进入中断执行都超过10us,之后中断又来了,如此循环,定时器1根本进不了 ...

8 k) v6 Z$ A! E( D果真如大神所言,10us的定时加长以后就OK了,谢谢啊。
; l3 W- Y# s7 ^. e; _5 K% P4 |0 Z7 a我想在问下,如果用1T的单片机会不会好点?
. D0 i( i1 z7 K

点评

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

该用户从未签到

6#
发表于 2019-4-12 15:32 | 只看该作者
小黄豆 发表于 2019-4-12 14:56
7 {/ a5 {$ Y* o0 K果真如大神所言,10us的定时加长以后就OK了,谢谢啊。
* N! {& ?5 d) x0 G我想在问下,如果用1T的单片机会不会好点?
) D& d# Z* H& G7 b0 D% ?8 k
程序执行速度会快点,最关键的是进入中断的执行时间不能超过定时时间
( }; d& g! q& m- o& h

该用户从未签到

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

“来自电巢APP”

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-10 01:01 , Processed in 0.171875 second(s), 29 queries , Gzip On.

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

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

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