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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
使用定时器中断实现8个LED亮1000MS灭1000MS的问题
4 N$ R& k3 ~2 L# e. p  ~
" h: Q3 S* g# P8 d$ T: d问题: 使用定时器中断实现8个LED亮1000MS灭1000MS,要求不适用软件延时。7 v1 S# i5 M9 @/ x3 }
我的写了一个程序,但是没有实现要求,哪里出错了呢?
% Z+ K( t. b/ v6 |1 Y1 J- [程序和原理图如下:/ N2 B' ~& d  Y8 ?' }

) ]$ ^8 F+ P0 x/ r0 ?7 G2 C, T#include<reg52.h># J/ f. `' d7 G8 S9 B4 e
#define uchar unsigned char
# h* s+ a  q( @1 I$ ?. Buchar count;
3 e7 X+ ~$ Z& U7 S. g/*定时器中断初始化*/5 T9 N/ o$ F2 M+ K: `' o1 H
void inint()
0 X, F. [6 q; R' E{
9 T8 y3 u4 K+ d6 ]. s        TMOD = 0x10;//选择定时器1
  r2 X( p$ _8 V" N* n        TH1 = 0x4b;
: Y7 d2 X" b( }' D3 B0 L2 K( M0 c        TL1 = 0xfd;//定时50MS8 H% D, G6 `6 c1 X+ c/ ]
        TR1 = 1;6 B9 i" C/ i: t' Q" y9 n( b5 M
        ET1 = 1;& _2 @' }1 d* A6 [
        EA = 1;
4 y$ Q' J) J% p4 J2 i# `) Y' O}8 g! [9 D% F  q* R1 i8 k, c
int main(void)  z7 Y& p+ M* j( i
{
+ M* y/ X2 [7 u        inint();& A  l7 s3 Y8 T( J0 R: d: T
        while(1)
1 H9 h& R' o: y! U        {5 K5 Y! z7 J$ g' R/ o* d' F5 b
                P1 = 0;      
5 x- x# @3 D. @8 k( Z; T        }
; D" b6 E% a9 |5 \7 h+ m: U7 X        return 0;
' e& P: f( r' B" Z8 b; J}
* m% ^8 U6 H, F+ ]/*定时器1中断服务程序*/* U! W6 `. g' t+ P8 ?! u
void timer1(void)interrupt 3/ M( D, h) H8 C0 G1 J0 b
{       ) \8 O/ c# Z. s# y0 w/ `
        TH1 = 0x4b;
# K6 \# S- Z) ^  j) s6 [0 z        TL1 = 0xfd;% h3 z& Y' k! n; v0 `, h! L
        count++;. L& M! o  a3 x  N* `, J& W% a
        if (count == 20)
8 Z. T" O/ p0 H2 p% r        {               
/ G  L# M8 N- }5 b5 l                P1 = 1;
$ N7 `% n' z: r8 A- }                count = 0;6 q# i( g  L0 O- h; p7 _
        }  p$ o* G) k) y
}
7 |1 @' a, Y4 s
* N$ {8 J1 f" r. r1 C9 i

+ k& `3 ?+ y% X/ @) G0 T
# G* K" ?2 e4 G2 X7 m

该用户从未签到

2#
发表于 2019-5-17 14:50 | 只看该作者
while(1)
# N2 `6 C% C5 C( Z        {! @1 P! G+ d# i  o
                P1 = 0;       ; P# Z! W% d8 \  d
        }9 ^$ i  L/ V: n, \, @
死循环

点评

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

该用户从未签到

3#
发表于 2019-5-17 14:57 | 只看该作者
#include<reg52.h>4 N: K% P- k- W
#define uchar unsigned char
, I. r, }# A2 w! F5 z' muchar count;
8 M1 J/ d+ Z% K8 l* Q" K) x( {0 [/*定时器中断初始化*/+ z: i9 n, A# t& T5 r4 J0 Z
void inint()
' j! d0 W1 _: u8 S8 x{9 [, y! h5 N5 Y: k  q( k3 n
        TMOD = 0x10;//选择定时器1# s* d( v3 d, I9 y; L) v# d
        TH1 = 0x4b;2 u5 n. `' s1 |4 ^
        TL1 = 0xfd;//定时50MS
6 |, }: Y6 ]7 E% n) F7 B3 v0 f        TR1 = 1;/ }2 ]: Q5 z4 b9 h3 W2 @1 e1 _2 J
        ET1 = 1;
- m9 y2 y7 f  y  Q0 i' ~        EA = 1;
* o7 }0 s2 A4 L- O2 Z}
$ u8 Z; E' j& Nvoid main(void)
( G+ Z" z1 k% p5 z- ]1 f+ C0 C  t{+ w3 U( A5 x8 [" p: j3 h
        inint();* C7 X, [1 v3 ~
        while(1);7 \3 _3 q" I. K, r; [# k0 @) y
}
5 X# ^: L' f7 D2 t/*定时器1中断服务程序*/$ ?! W( X6 b: f$ {
void timer1() interrupt 3' y% ]' |8 a. M, t
{        , U7 E' [5 e! g
        TH1 = 0x4b;1 D* F+ _) u; N, y  K1 S) D
        TL1 = 0xfd;8 A2 q1 F( h) U: H' `/ G
        count++;/ `$ F' y+ b5 l- O7 |! Y
        if (count == 20)  P- B( w. y0 q2 l* u% t: `
        {               
0 e5 f8 q# [0 n* a$ {  B# m                P1 =~P1;
$ |: v/ N9 ~) W                count = 0;0 S: G' d; b4 [5 u
        }
& H$ ]5 f; X2 K" a( ^! Z. D}

该用户从未签到

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
4 c- N  Q0 }' L; b9 K9 g% I中断会被主程序刷新,所以应该吧while里的P1=0去掉,把中断中的P1=1改为P1=~P1

, @% K* Y6 O- X% x' p中断会被主程序刷新,是什么意思?可以给我讲讲吗?
" c; a6 E+ L' y4 L1 O4 o) x

该用户从未签到

6#
 楼主| 发表于 2019-5-17 15:13 | 只看该作者
kinidrily 发表于 2019-5-17 14:50
  l* i( V) G: a5 Y8 X3 qwhile(1)
2 n( d2 g8 U0 t1 h1 x        {6 Z# D2 A) J9 d  j/ d! k3 l3 H
                P1 = 0;      
; s. z, Y$ P0 ]- d' _, f$ x8 c5 c
对啊,我的理解是while(1)中的P1 = 0;,程序先运行当中断出现时,转去运行中断服务程序中的P1 = 1,完了再回到主程序运行P1 = 0;。哪里错了吗?
$ [0 r2 W% p# @- w8 |

点评

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

该用户从未签到

7#
发表于 2019-7-12 16:41 | 只看该作者
小黄豆 发表于 2019-5-17 15:13% W; P1 K$ m7 }/ _5 V
对啊,我的理解是while(1)中的P1 = 0;,程序先运行当中断出现时,转去运行中断服务程序中的P1 = 1,完 ...
) a$ a+ Z# K$ G/ |5 }' K& q2 _
中断里执行完P1=1后,立马被主程序里的P1=0给覆盖掉了,想当于你没执行过P1=1' o4 A" D% Z3 C  M4 ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-11 22:55 , Processed in 0.171875 second(s), 32 queries , Gzip On.

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

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

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