QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 1486|回复: 1
收起左侧

[讨论结束] 初学单片机遇到关于中断的问题,了解的人给指点下

 关闭 [复制链接]
发表于 2007-8-27 10:18:52 | 显示全部楼层 |阅读模式 来自: 中国江苏扬州

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

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

x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下
# K: @$ G7 n+ h+ |程序:
: g( \  O* }7 x+ @* q#define uchar unsigned char //定义一下方便使用/ A* Q* I8 Z$ L- f2 f* x1 a: n
#define uint unsigned int7 V1 [4 l- a/ K+ p6 Y8 b1 _* `) ~
#define ulong unsigned long. a8 }# W2 n9 @2 b$ S( J6 d
#include <reg52.h> //包括一个52标准内核的头文件
3 j0 u% c# M( e0 L6 t* \sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了) g% K& Z/ z5 b$ O: Q" A' x' V
sbit P11 = P1^1;" H9 J: e) c3 Z& C3 ~
sbit P12 = P1^2;! E: m! \! N) ?+ {4 r
sbit P13 = P1^3;7 U  s2 X$ E0 u5 N( R: ?
bit ldelay=0; //长定时溢出标记,预置是0
- X+ e, S6 x7 ]& s//char code dx516[3] _at_ 0x003b;这是为了仿真设置的
% d6 ]8 W6 E1 k' u4 V//定时器中断方式的跑马灯% B: b8 p7 T: j
void main(void) // 主程序/ o' g4 |7 A2 Z0 x7 \; H, [
{
$ O& N$ m  c- M0 Bunsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值  这四个值改变次序后发现没有影响,怎么回事?
/ F( K3 ?1 o0 |2 J3 F% K& Funsigned char ledi; //用来指示显示顺序& h! {* I) k- I0 L7 B
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟, x' F# r- b- r3 e5 s2 j7 x
RCAP2L =0x00;7 P% y, \! X, Y3 I
TR2=1; //启动定时器
8 K5 g# B1 M2 G  T. tET2=1; //打开定时器2中断
/ q4 T2 @, S2 [EA=1; //打开总中断; s  N4 Z1 o( |
while(1) //主程序循环4 k: h- e6 H$ c3 Y7 M
{
+ u0 J9 x( M0 w) t: }! f4 {7 Y% Kif(ldelay) //发现有时间溢出标记,进入处理: D+ ^5 m, Y# K+ s' e3 I
{' d% `8 c7 I3 {& M9 P' x
ldelay=0; //清除标记
& X; F) J: \: ^. ]' Z9 s; }) _P1=ledp[ledi]; //读出一个值送到P1口 8 ~# W% [6 k; F) r- y" s! p7 g; b* B
ledi++; //指向下一个* w! Y9 r- S. k+ s0 O) u: e
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个
+ d) T  h# Z3 k& i7 K
}
3 \: ?; K) E6 Z0 U8 d$ n4 c9 y}+ ]% G: o1 b+ P
}# C5 j" I; \6 y9 ?3 V+ Z  H
//定时器2中断
9 ?5 P8 T$ z3 i! v" t, @/ Mtimer0() interrupt 5
; G1 Q# D7 X: ^# c{# _/ x% B" w# q. I. T
static unsigned char t;& @4 l+ B& \& e
TF2=0;: h; _5 l/ G7 V1 }- U) Q/ G
t++;- O* p9 d$ Z$ a$ ?. k- y& P
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ- D' E  A3 F% _
{
# a& B/ S( u7 t; ot=0;" F0 U3 U) z9 `
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理! D2 [( d2 I% M. N4 ^- \8 B! X
}  w/ y& v6 [$ G0 \$ _5 h5 r
}$ G) h% f  \" x" f6 G2 C6 C, P
×××××××××××××××××××××××××××8
8 s+ |/ M( V0 s1 P; H8 K就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把
0 @' L8 y( c, c. V" |2 n1 |& a/ n( c! Q! bledi++; //指向下一个4 e: P5 ]9 a+ d/ y. A
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个   

. L' f; \$ }& T; l  H- [改为
' X$ q- g& ]2 `' Y! e' k1 jledi--; //指向下一个: |3 j; v, c3 l6 F' |9 k
if(ledi==0)ledi=4; //到了最后一个灯就换到第一个

1 v7 j) q1 I4 _( g' o, T) v只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了6 Q+ S; c& M+ V# ]" B

6 H% I' j( p. q+ R: f0 M% ?2 Z7 W[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ]
 楼主| 发表于 2007-8-27 11:02:49 | 显示全部楼层 来自: 中国江苏扬州
找到问题所在了,原来是
& E/ Q( \+ S- ]3 G: Bledi++; //指向下一个6 {* ~4 |8 O. F! E1 n& e  X5 i4 O
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个

( d$ G; s2 y: j7 Z" }: O这一块把 ledi=0; 变为{ledi=0; } 就是从右到左了,+ e" @: w. q+ `( L5 s' x
可是这个大括号{}到底起到的作用是什么呢? :o
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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