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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
使用定时器中断实现8个LED亮1000MS灭1000MS的问题+ ~5 H" e! i/ u+ J

- v# X+ ~. Q2 P) }$ R& ~问题: 使用定时器中断实现8个LED亮1000MS灭1000MS,要求不适用软件延时。
. N7 x- |' j; e1 h7 w- ~/ x我的写了一个程序,但是没有实现要求,哪里出错了呢?8 d, p9 z7 Y# o# I
程序和原理图如下:
, l4 M" I0 O/ \$ k- G5 B2 ]+ o0 |- S2 {$ W
#include<reg52.h>) S8 z7 U  z; `% Q- T. w' }
#define uchar unsigned char# T* U$ Z4 n6 d; H
uchar count;
" W( v3 I0 S! K: {1 K6 C: X' S/*定时器中断初始化*/- [3 M  m9 U' M% x0 [( b/ `, X+ `
void inint()
4 K! F1 S/ A/ a* ]* \! x! f' H1 N{
2 t. h1 p7 C3 J+ i" Z+ p        TMOD = 0x10;//选择定时器1
1 x9 C( J5 z0 R/ J3 D        TH1 = 0x4b;
, a* w0 N1 P# w% t3 \        TL1 = 0xfd;//定时50MS; n# R# g4 X2 ~  d0 T
        TR1 = 1;
- k1 W. O) O* v        ET1 = 1;5 q' j/ s+ `7 T5 {5 n
        EA = 1;
; A1 i  m& u- R9 F}
* f9 N8 I/ v' r' R: K8 Qint main(void)" Y$ N: J- t! r) s! E  y  ]3 X* ?: z
{
$ O- z# T; I$ N7 ?6 c7 B" c        inint();
* U" K0 j: B! g2 F; X( v        while(1)
" b& F# y2 m# g9 S1 S        {
9 S" p! N9 e+ v' H- W" S                P1 = 0;      
, f  e) Y# u9 ~+ M        }& V: V8 D$ `( V
        return 0;
+ g$ h5 a( @2 M: i}
% d+ `; h% O7 n, F. K) c- I1 s: q  q2 M/*定时器1中断服务程序*/
+ S- l0 ^8 ]" c/ [, Uvoid timer1(void)interrupt 31 y- o0 A" u, q' ?: V
{       " |! W/ I) H0 B
        TH1 = 0x4b;  h; }  g) [# v5 R
        TL1 = 0xfd;; w: K! d7 y; [/ K4 C; y. y" U6 o/ |
        count++;* ^+ `2 a$ u# w% B. ^( o1 o
        if (count == 20). O6 C1 N0 s. t( u& [1 z) |5 ^5 S
        {               
4 @6 ]6 O) j( ?# t                P1 = 1;" b# M$ ]& r1 U# ~
                count = 0;
  u. Y$ B3 F( l( v$ t3 {7 Y2 d! o8 s        }
7 ^% W6 {7 X! k! r+ @0 p6 ^}
5 c8 f% e. x  D% o8 Q( {: v# P8 v/ ]& S3 s, S  y; A( D" h
. x% B1 `4 ?- m! K. _9 `, F. Q

4 ~3 D% E' y6 C

该用户从未签到

2#
发表于 2019-5-17 14:50 | 只看该作者
while(1)8 P( ]* l- T1 [
        {7 H$ o- x" J1 Z
                P1 = 0;       / o, \4 I( n. W: m. V
        }
; r! m: {1 \5 L/ |' C死循环

点评

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

该用户从未签到

3#
发表于 2019-5-17 14:57 | 只看该作者
#include<reg52.h>
) L& y/ D" x8 I# |: N#define uchar unsigned char
& C) K# A) v  W, L- H& u. J: Iuchar count;
+ z) W: l) I- u( G/*定时器中断初始化*/
# x% y3 K( x6 Z' G+ W0 d: V5 f! `& Uvoid inint(); J6 t" W+ j" O  A, t5 u
{; Y$ C$ C6 N, n* L
        TMOD = 0x10;//选择定时器1
9 {/ [' f% Q# n! `* y# U+ w        TH1 = 0x4b;
9 {+ H5 }8 N4 j) W# t9 n7 x        TL1 = 0xfd;//定时50MS$ G) N6 r: T- @. D0 f0 i6 M
        TR1 = 1;2 r1 K+ X$ D3 ]* s
        ET1 = 1;: x! f* J6 y2 X! ?- ?. Y7 F
        EA = 1;7 R. |) N7 j! i1 k5 f5 P
}& ^6 P* j: a5 _$ ^& ?
void main(void)% ~" ~1 ?5 b, M" G% r
{' B& s6 s& U5 h. I
        inint();
' B, _# i9 Y4 d        while(1);
, @9 \: P: Y' |; p- x: o! h}
) H4 Y( M7 a. f5 k/*定时器1中断服务程序*/
+ L4 m; G7 g' Jvoid timer1() interrupt 3
7 m, j* R+ x4 P9 p3 S$ g/ x( s{        
3 B8 `/ T3 D# G9 D3 r- P        TH1 = 0x4b;7 ^9 S7 p: w2 b! N7 n2 [7 z7 g; ~
        TL1 = 0xfd;
8 Z! M0 l/ Y3 B        count++;
. E8 M. Y, K% Q. Z" M        if (count == 20)
9 d7 L! o$ w: ~# Q. b' O        {                - ^/ N: J% w% U8 M4 X; C$ i
                P1 =~P1;$ |5 b# ~5 X7 {" k
                count = 0;
; |0 J) c& [, i        }
" T) M6 a6 ?. M3 ]( G1 G8 |8 [}

该用户从未签到

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
( Y$ q  O& W" s0 H7 c  }: ~5 E6 {  D中断会被主程序刷新,所以应该吧while里的P1=0去掉,把中断中的P1=1改为P1=~P1

. q/ @% O( s1 q6 {/ Y中断会被主程序刷新,是什么意思?可以给我讲讲吗?
9 w0 `8 e$ Q/ p) o

该用户从未签到

6#
 楼主| 发表于 2019-5-17 15:13 | 只看该作者
kinidrily 发表于 2019-5-17 14:503 Y2 ?* s! c2 h, I$ b* ?8 G
while(1)  g- Y: i1 d( ]/ [$ m( H
        {. L5 d& r2 L( @% y* W! I5 x
                P1 = 0;      
' s" a6 D0 Z" c( h  i5 D
对啊,我的理解是while(1)中的P1 = 0;,程序先运行当中断出现时,转去运行中断服务程序中的P1 = 1,完了再回到主程序运行P1 = 0;。哪里错了吗?
& o! ~4 I2 ~& J" r) L- X. z+ d

点评

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

该用户从未签到

7#
发表于 2019-7-12 16:41 | 只看该作者
小黄豆 发表于 2019-5-17 15:13* f" e% r) h" L% g: [' i5 W1 s
对啊,我的理解是while(1)中的P1 = 0;,程序先运行当中断出现时,转去运行中断服务程序中的P1 = 1,完 ...

  |: V: D# T/ t! ~$ X. l中断里执行完P1=1后,立马被主程序里的P1=0给覆盖掉了,想当于你没执行过P1=16 M9 V2 M) T5 }* W1 M" c' X0 |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-17 21:18 , Processed in 0.140625 second(s), 32 queries , Gzip On.

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

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

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