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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
使用定时器中断实现8个LED亮1000MS灭1000MS的问题3 _) Q0 _; Y/ X  \, A
: C# m2 y; v' C; [2 F/ W; [
问题: 使用定时器中断实现8个LED亮1000MS灭1000MS,要求不适用软件延时。, t- S  v5 G: Y
我的写了一个程序,但是没有实现要求,哪里出错了呢?
1 @3 }4 F5 Z  v* I* t程序和原理图如下:
4 i! v: |6 R$ J  J
; D! h2 Q# M0 k4 {3 c1 m% \  Q#include<reg52.h>
9 Z& D. Y& f  E$ V- K#define uchar unsigned char0 c# q  H& F; L9 [& i  Q5 r1 h
uchar count;
& }9 E2 J$ G  R6 o/*定时器中断初始化*/& {) {) d& C$ H5 z1 D! q
void inint()- D/ S; ~+ |; a& R# ]' F
{& o% H% X& C% T1 x# y
        TMOD = 0x10;//选择定时器1  \3 s6 Z2 _0 Z* P9 V# @
        TH1 = 0x4b;6 u$ }1 D4 P5 d
        TL1 = 0xfd;//定时50MS( ~* g5 _# h0 R4 O5 F
        TR1 = 1;' B/ q  T5 A8 ?' _! w" T% |  g
        ET1 = 1;
5 g) j7 g3 J( E        EA = 1;
7 m/ x4 }+ H  {* U2 V}+ ]$ k& @( ]+ {: z; W
int main(void)2 H1 Z+ N$ v9 {/ w  K; \, c
{6 B! ]. L1 Z5 z8 k. n/ m. s
        inint();: A! I5 x  Z9 m# P  f
        while(1)4 O9 M4 S  {2 B, q4 y2 n4 g
        {
2 O2 `- u9 k0 H& e                P1 = 0;      
. ?& v7 z2 q, ^, e        }7 h; S; n# E# k1 Z" _" S9 l9 y
        return 0;# T. Q5 `& U/ E
}
+ e1 ]& U0 E% G* p/*定时器1中断服务程序*/
& B4 h! q! X- z$ f5 F& rvoid timer1(void)interrupt 3$ v1 P6 w- M0 \9 z% K
{      
3 z* i; C8 \3 G4 q8 m  T        TH1 = 0x4b;
/ B% T$ D2 g  N8 F0 k0 W9 U: i& s) g1 a        TL1 = 0xfd;- A+ z3 e8 G7 V4 l$ \" [
        count++;" |: m3 J6 c4 Z+ x
        if (count == 20)/ g8 y/ ?9 l5 E% e5 l1 ]
        {                ( J" d! T- u, D0 s
                P1 = 1;2 x- a# Z3 r- u* N5 C9 l9 i
                count = 0;
4 g  z- n; E8 \& W/ r$ W  |        }
8 B: j( ?( s' C) M' D/ J4 \}
2 T, o8 j+ Q- Z. Y# i5 @8 w, F1 ^2 r8 E1 X

. ]: K6 ?8 O! r
. O; W6 E# k% r9 i$ y7 ?

该用户从未签到

2#
发表于 2019-5-17 14:50 | 只看该作者
while(1)
( x% k0 Z; Q2 x' t        {
1 `/ h- Q8 R$ u# v                P1 = 0;      
6 K8 _7 A& O& H; T) h        }
, k; A+ }- ?5 M  y) N8 w死循环

点评

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

该用户从未签到

3#
发表于 2019-5-17 14:57 | 只看该作者
#include<reg52.h>% \6 N  b0 P7 M! T+ P! G  t* S
#define uchar unsigned char
# p) i  J( I+ K7 q) h5 m+ iuchar count;0 q( f2 D* _' R; P+ w. Y/ R
/*定时器中断初始化*/
( I3 B( X1 V$ Y0 g8 ]" mvoid inint()9 T4 {2 z, F; v& s/ x
{
& u# c. h: _" x1 A" p        TMOD = 0x10;//选择定时器1
. ?' |5 S  P. V" {+ a5 l! k1 v        TH1 = 0x4b;8 ]. U9 u$ z/ O# i
        TL1 = 0xfd;//定时50MS
: {8 O, Y! F4 C        TR1 = 1;. B. Z! H" A5 d9 M2 ?5 H  S
        ET1 = 1;
$ M1 _; u4 h. R$ c5 ^% o" E% b        EA = 1;
# V" y/ r# k: Z4 `" w5 N1 u}, _3 B4 d- R: }# R7 y3 T9 D3 ]  O
void main(void)
: E0 l8 b; l, Q# @3 b* ~{
3 Z' f, K7 k  S: R0 \        inint();
! @: ~" ?0 R& n" [        while(1);4 X/ h' g) F, K# x8 P7 f6 l+ |4 ]2 I* @
}( i) A- p& b/ ]$ p
/*定时器1中断服务程序*/
" }1 a: p3 d9 p4 Q+ N0 v7 U) z7 h9 zvoid timer1() interrupt 3: d6 [0 e9 a1 n  n; ~7 Y
{        
" d: u! J) A8 I% q; W/ d- r8 ?        TH1 = 0x4b;1 J, V+ v4 J7 ~) |& q! o
        TL1 = 0xfd;
. K/ \: A+ i* t8 @5 z& K; y        count++;
* c! a3 s# S7 e, H) \% U5 \: k        if (count == 20)
* M1 P% ~8 \0 }: v, k* w        {                  L& ^/ A# \6 T# i* v" N
                P1 =~P1;
* M  X; v! i) G: ]                count = 0;
/ C6 t9 X2 D2 R' l2 u. u        }8 `; z$ K, q* Z& G$ K
}

该用户从未签到

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
  A7 q' o. _) I4 e3 X中断会被主程序刷新,所以应该吧while里的P1=0去掉,把中断中的P1=1改为P1=~P1

' G* R( ~, t% }( Y) K) H中断会被主程序刷新,是什么意思?可以给我讲讲吗?% z' V/ D5 |( G- Y0 {7 ]

该用户从未签到

6#
 楼主| 发表于 2019-5-17 15:13 | 只看该作者
kinidrily 发表于 2019-5-17 14:50
8 S* E# ~0 N2 x" \* _+ d' Rwhile(1)
! p6 F% N  x: y+ R/ I0 b$ s        {. C$ U: G- E1 T& V, k- I" Y4 e
                P1 = 0;      

5 \) i+ G; d2 x: j3 Y9 u对啊,我的理解是while(1)中的P1 = 0;,程序先运行当中断出现时,转去运行中断服务程序中的P1 = 1,完了再回到主程序运行P1 = 0;。哪里错了吗?$ E( v& M/ t8 |) S+ m/ `; J' O

点评

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

该用户从未签到

7#
发表于 2019-7-12 16:41 | 只看该作者
小黄豆 发表于 2019-5-17 15:13
9 U. k- c1 H1 r4 t" B, \对啊,我的理解是while(1)中的P1 = 0;,程序先运行当中断出现时,转去运行中断服务程序中的P1 = 1,完 ...
: |/ X, M- y1 I$ U3 |; E& A
中断里执行完P1=1后,立马被主程序里的P1=0给覆盖掉了,想当于你没执行过P1=1
4 c3 D7 y! H2 k  c- G, J
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-27 14:56 , Processed in 0.093750 second(s), 32 queries , Gzip On.

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

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

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