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

有关于使用定时器中断实现8个LED亮1000MS灭1000MS的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-17 14:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
使用定时器中断实现8个LED亮1000MS灭1000MS的问题5 e# P, U* a) c6 P) Z% X

- h4 a) l# x4 h7 n5 b* ?问题: 使用定时器中断实现8个LED亮1000MS灭1000MS,要求不适用软件延时。
& H" ^& X! S- B% C9 k我的写了一个程序,但是没有实现要求,哪里出错了呢?
3 ?/ \2 C3 b$ w% u. T% U( g程序和原理图如下:
$ D+ f/ E% A+ j& x% e* O" O
' {( G' s5 \; ]) c5 `  `#include<reg52.h>9 B% J& s: c$ P
#define uchar unsigned char$ a6 d1 `& ^5 P" \
uchar count;( m% {9 W1 c! g$ t9 O6 w6 y6 H7 k
/*定时器中断初始化*/
" T- c9 {. D- A9 @void inint()
1 \1 t2 a9 z! K* N3 A/ h{. O+ B5 T3 `7 ?7 X! X
        TMOD = 0x10;//选择定时器1
# x, t, m1 E- |        TH1 = 0x4b;6 S( Z3 {. I, q' y  W
        TL1 = 0xfd;//定时50MS
; U" f$ O' L5 Z9 k; y        TR1 = 1;  b% n5 s6 y' ?* E+ N
        ET1 = 1;: d0 o8 h$ t; }1 g
        EA = 1;3 l0 T5 w& L6 j+ g$ e
}4 b8 R+ l- y$ b9 S6 c4 u- Y
int main(void)
1 H: v0 Q: X8 E+ x2 W. _{8 l+ ~$ s: l( C2 v1 k
        inint();
9 j' P5 c1 J$ y, e        while(1)3 ^+ n. E5 B' R0 o1 L
        {' `4 C5 Y* @: _
                P1 = 0;       / L: v+ C5 Q7 H  R% Q
        }
6 |) z0 F. p# X: _* `: s( y        return 0;
, x# C: |3 n- t/ m- @}# p) ?7 Y5 k0 r6 ?. b' L
/*定时器1中断服务程序*/1 H, k. W# j" O1 G
void timer1(void)interrupt 3
4 K7 @0 M2 [) Q% s4 v{         y0 U$ b, Z1 ]& {
        TH1 = 0x4b;
; y+ v: t2 Z4 Q% R+ ~7 @        TL1 = 0xfd;
& l, a" m- G* o5 y1 w3 B7 R: y$ o; N# C8 E        count++;
% ]2 j- b) |& [; A( \! a' x        if (count == 20)
, ~" K& T; Q  F. W/ Y8 ]$ H        {                7 u$ ~9 Z- X0 e4 I9 W. `+ t" i' I
                P1 = 1;" i! Q0 S- j" s! @3 D. j+ j
                count = 0;& H/ [0 b. @, [2 Z/ t0 R# ^
        }
. z9 O7 Y, M- n9 [}  h5 F  Q$ g1 `6 ?! u" r" j2 z

% V5 o5 s9 m3 ^+ V

+ U  N4 {$ u9 P, J
5 w" O: p1 Q; w

该用户从未签到

2#
发表于 2019-5-17 14:50 | 只看该作者
while(1)) e1 E( I: v' J- b. q: K
        {/ y  g- |2 t" Q3 H% B) R
                P1 = 0;      
9 ]" D- T! ?' R! ]        }
5 r4 Z! B" u: P6 C/ f" S死循环

点评

对啊,我的理解是while(1)中的P1 = 0;,程序先运行当中断出现时,转去运行中断服务程序中的P1 = 1,完了再回到主程序运行P1 = 0;。哪里错了吗?  详情 回复 发表于 2019-5-17 15:13

该用户从未签到

3#
发表于 2019-5-17 14:57 | 只看该作者
#include<reg52.h>7 z. l/ H* f1 ^( E0 g% ^) k! c
#define uchar unsigned char
4 z- L3 q1 T% ?8 a/ b5 K' }! `uchar count;( f# I! B3 D3 H- g  s
/*定时器中断初始化*/- y+ A1 S8 y9 R) A9 R. p/ Q& m
void inint()7 A6 ]4 z& ^, C+ P5 n7 o
{
" L2 a8 d' U! {9 U% }( f        TMOD = 0x10;//选择定时器1/ h  Z: I  S1 F, h/ L
        TH1 = 0x4b;. `6 t+ t: F# Y$ S) z
        TL1 = 0xfd;//定时50MS0 d, s4 V( v7 k2 X4 Q
        TR1 = 1;
; s# }9 ^  g9 ?        ET1 = 1;1 Q# _( ?& Q, J* `. \' E5 a
        EA = 1;
0 R8 u% h& T$ U: o9 O& R9 @1 n}
# ^2 o9 z2 L) X& K' J' G! z  n0 mvoid main(void)
" z+ f$ d9 c( h" Q{
: q4 P+ J  }4 T# D# U$ w" ?. p        inint();% O8 r5 \( [1 ~, x# T" C
        while(1);
8 y4 M7 W1 g# N" v: f1 z! b}+ t0 P/ H9 ?$ Y7 D5 O
/*定时器1中断服务程序*/
/ Y7 n( D& F: k7 m& kvoid timer1() interrupt 3
. v0 |  d' ^+ m% a/ N1 l{        
4 x" i8 s+ P* x& h& c4 Y- b        TH1 = 0x4b;
7 v% F: n$ ?, f; I2 C        TL1 = 0xfd;
  i! D+ c$ R- q# A/ U& K        count++;
$ |" g6 L9 z% Q/ l        if (count == 20)
% ^2 o% J8 C& o+ d  J3 U1 G4 V        {                : |5 B  a/ q3 e& _0 U- L
                P1 =~P1;
. Y6 W( B& j* K# h, e                count = 0;
/ ~3 F7 a7 I% S) {, n        }- p/ f$ x& `; W6 S0 t! t
}

该用户从未签到

4#
发表于 2019-5-17 15:12 | 只看该作者
中断会被主程序刷新,所以应该吧while里的P1=0去掉,把中断中的P1=1改为P1=~P1

点评

中断会被主程序刷新,是什么意思?可以给我讲讲吗?  详情 回复 发表于 2019-5-17 15:13

该用户从未签到

5#
 楼主| 发表于 2019-5-17 15:13 | 只看该作者
fanichicl 发表于 2019-5-17 15:12
& k% h0 \/ }9 }. E1 ?中断会被主程序刷新,所以应该吧while里的P1=0去掉,把中断中的P1=1改为P1=~P1

% H+ e. w$ N+ f9 E1 y( [中断会被主程序刷新,是什么意思?可以给我讲讲吗?
+ e& P6 O$ R* I: H" h

该用户从未签到

6#
 楼主| 发表于 2019-5-17 15:13 | 只看该作者
kinidrily 发表于 2019-5-17 14:501 k6 x. x( i+ ~( _6 l( R3 K& K
while(1)
. j- E& x# L6 H6 B9 ^, y        {
; r# S7 z. ]4 Z) \# f9 B  s1 E                P1 = 0;      

: b6 x% u( I8 ]0 E. y$ Y1 p5 r对啊,我的理解是while(1)中的P1 = 0;,程序先运行当中断出现时,转去运行中断服务程序中的P1 = 1,完了再回到主程序运行P1 = 0;。哪里错了吗?, ^2 ^7 P, q  K5 J" Y6 J, h1 F1 @9 e; Q

点评

中断里执行完P1=1后,立马被主程序里的P1=0给覆盖掉了,想当于你没执行过P1=1  详情 回复 发表于 2019-7-12 16:41

该用户从未签到

7#
发表于 2019-7-12 16:41 | 只看该作者
小黄豆 发表于 2019-5-17 15:13
; }4 c+ P  _+ _对啊,我的理解是while(1)中的P1 = 0;,程序先运行当中断出现时,转去运行中断服务程序中的P1 = 1,完 ...
" y( A) H/ b3 N' j& G7 _% ]
中断里执行完P1=1后,立马被主程序里的P1=0给覆盖掉了,想当于你没执行过P1=1  V( _) c' {4 P( B5 s% l" H
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-22 20:21 , Processed in 0.078125 second(s), 27 queries , Gzip On.

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

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

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