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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
使用定时器中断实现8个LED亮1000MS灭1000MS的问题
, ~. h9 g. S! H) l6 P: S( s1 d/ j+ a7 X0 ~" |4 X& ^- y
问题: 使用定时器中断实现8个LED亮1000MS灭1000MS,要求不适用软件延时。/ u1 O2 J3 j7 C% @$ T
我的写了一个程序,但是没有实现要求,哪里出错了呢?& T* B2 J, p+ P$ ~- L) A# T
程序和原理图如下:# c$ ~* O! w6 ?5 A7 b, s1 A8 x5 S

$ o- ~$ Z) e; l3 Z6 `% F2 j#include<reg52.h>3 Y* Y8 w' Q+ w- E  |; W$ @
#define uchar unsigned char% n" J5 U9 g4 f' Q! j6 I
uchar count;
' B3 ^: ^/ |- u1 G) g. B/*定时器中断初始化*/
1 N& H1 c! H$ S& R! E2 uvoid inint()1 F+ z6 s7 J7 `) x1 v- k" {% f
{
+ _6 b6 D# U+ J$ }# Q4 X        TMOD = 0x10;//选择定时器16 q' A3 l; ?/ J3 L
        TH1 = 0x4b;
! V9 U7 W4 b) |8 L        TL1 = 0xfd;//定时50MS! R# C3 a" G+ I' R: ?# C
        TR1 = 1;
8 s% E. q" n, ]5 e        ET1 = 1;
' U3 L: C8 n, G& \7 O5 }3 H        EA = 1;
4 R" F( D* C: c9 ?$ }" O$ i}/ d4 h8 O( E: t. M7 H# x$ [
int main(void)0 G# N  r5 J& N6 K
{
0 J" z, g: d5 S        inint();! m9 T0 j  b$ |, k9 {2 M  R& [
        while(1)
  y; ^/ t' Y' f7 ~' w( J! Y7 z9 K( f& D        {4 L. Z' x" Z3 h5 \: q+ y! l. Q
                P1 = 0;       % p4 g( a$ i/ n9 Y+ z0 C+ Q
        }
: }+ v! F4 `; |. ]6 i1 ^        return 0;7 A* |* \% m4 F6 _
}
4 _" t0 _7 g: e" {" U& m$ m/*定时器1中断服务程序*/
/ ?% c( N2 O- P2 X; [void timer1(void)interrupt 3- o( D  F: g( U* h+ e
{       1 p2 w% v9 n1 o9 A! V3 @
        TH1 = 0x4b;" C: u4 P* L. U
        TL1 = 0xfd;+ m) j' K9 ?$ n# G/ F# v
        count++;
+ |8 O" y  U( z1 P: p; Q  K0 K        if (count == 20)
$ w8 f, X% ?( J" l( l  o/ Y  c  ?9 y        {                4 F' u) D: i% X% Q$ O# L& F6 }
                P1 = 1;7 a+ W0 r; R4 w' p/ G
                count = 0;7 m) }  H2 b/ O3 }
        }/ Q- H( x4 `. q2 l
}
2 P+ M8 x2 Q) A9 k4 J. J* `# t, C3 [$ \" g, {" E/ ]3 `$ o9 f6 B

+ F2 G, m- ~; K) _$ n ' w( B  o2 F; t! p: J, t0 W

该用户从未签到

2#
发表于 2019-5-17 14:50 | 只看该作者
while(1)' d2 {# M" m# o# N% u# H4 C
        {
+ S9 o- X. [" t. O7 ]# C: G: |* _( `                P1 = 0;      
7 U3 v# W. N9 K0 O        }
4 h  r, r2 H) y! a% b$ |. Q死循环

点评

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

该用户从未签到

3#
发表于 2019-5-17 14:57 | 只看该作者
#include<reg52.h>
& `, o* J2 H2 _$ W9 A+ ?; e6 m#define uchar unsigned char4 u# _- T4 F0 B$ H) }
uchar count;: R, r3 z1 E) `* N! Y! I1 F9 }/ @7 n
/*定时器中断初始化*/8 C0 C4 E) |$ M( \7 I- N6 l
void inint()/ i# Q( e' z& m
{+ u( c' p1 }! z! g$ s
        TMOD = 0x10;//选择定时器1
5 U. h8 K5 J5 l        TH1 = 0x4b;3 W, t4 G3 F' n4 P' J' E' f$ p
        TL1 = 0xfd;//定时50MS! _  E* X7 K/ n! D( N9 @: R
        TR1 = 1;
5 p# B( q) a6 X3 d7 y# x        ET1 = 1;6 s) a4 H4 ?, x; [4 v8 Y: z8 m
        EA = 1;6 q" i! G: F5 ^  s& u- ~
}
( a" D- |. a0 [$ [, m: `void main(void)
4 i7 Y6 C) x: x0 ?. R{/ f9 f( }# ^3 G* s9 m8 x/ M- g0 |
        inint();5 A' P+ e5 Q; O; T& a3 m* Y5 Z4 u0 [
        while(1);, V4 T* A5 A1 n7 s
}
9 C6 a! V/ f, a: z4 V- l3 m/*定时器1中断服务程序*/
. T- @( p" X, t7 f5 t, Q' W+ bvoid timer1() interrupt 3. w0 ]# _& c9 H1 C2 |6 Z
{        ' c4 n) _, v1 K9 K' ]/ g* n; S
        TH1 = 0x4b;
, V  ~! c- O4 W' b- C6 Z        TL1 = 0xfd;
2 _: A. ]% ?& ]# O        count++;, ^  i* T7 e4 E; D& |. x
        if (count == 20)* g6 S% Y- c) @; o9 Y- [+ Z) {
        {               
( g1 Z9 X3 Y! q3 i! y4 p                P1 =~P1;0 f$ p5 g& |) N. a3 n
                count = 0;+ J" i$ n5 o& K1 H5 j
        }
$ l, a" i  b  M}

该用户从未签到

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
( n0 Z0 P5 W' w中断会被主程序刷新,所以应该吧while里的P1=0去掉,把中断中的P1=1改为P1=~P1
5 Z8 Y8 S* n4 K$ ?
中断会被主程序刷新,是什么意思?可以给我讲讲吗?# s2 L4 w, p9 a) h! U

该用户从未签到

6#
 楼主| 发表于 2019-5-17 15:13 | 只看该作者
kinidrily 发表于 2019-5-17 14:50
" }9 K8 V8 t9 K* K8 _while(1)
& y8 U; h4 m! c) H7 M) C        {
) l$ ?6 W% x. X4 F                P1 = 0;      
9 W/ u  |8 n3 X$ n
对啊,我的理解是while(1)中的P1 = 0;,程序先运行当中断出现时,转去运行中断服务程序中的P1 = 1,完了再回到主程序运行P1 = 0;。哪里错了吗?' P" f+ s. k0 b8 ?

点评

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

该用户从未签到

7#
发表于 2019-7-12 16:41 | 只看该作者
小黄豆 发表于 2019-5-17 15:13  S3 X8 C7 L3 b4 {7 S+ [5 ?; j/ K
对啊,我的理解是while(1)中的P1 = 0;,程序先运行当中断出现时,转去运行中断服务程序中的P1 = 1,完 ...
# [. \6 Y, m* t; w8 ^- E4 i
中断里执行完P1=1后,立马被主程序里的P1=0给覆盖掉了,想当于你没执行过P1=1
+ G& d+ G' |& F; L  q" P3 i
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-25 08:25 , Processed in 0.156250 second(s), 32 queries , Gzip On.

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

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

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