QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下% {# {4 w: ]4 b5 z4 H& ~% v1 J
程序:' g% |5 \2 B1 M2 I' b9 J
#define uchar unsigned char //定义一下方便使用9 A. h7 n9 H$ r+ ^) u
#define uint unsigned int
, W9 _+ r$ G6 P: P/ T, [#define ulong unsigned long; E3 N1 c: {5 m3 P0 ?( X
#include <reg52.h> //包括一个52标准内核的头文件
+ U  r( [$ u: \, jsbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了
+ ?2 ?$ n) p1 c0 ]1 n$ Csbit P11 = P1^1;
, K6 H) W  C; Z7 Y5 psbit P12 = P1^2;
. k9 J: s7 x, \1 ssbit P13 = P1^3;
$ A# s1 q" k- pbit ldelay=0; //长定时溢出标记,预置是0
& I0 |7 C# Q# K9 M5 R) ]//char code dx516[3] _at_ 0x003b;这是为了仿真设置的% \  G: \' {" i+ ?
//定时器中断方式的跑马灯) N7 g' y) E- F2 l
void main(void) // 主程序
/ E# A+ O% X0 n0 Z. n{
6 p3 k) a$ Z# k# P. @7 C- x2 i) l8 y( ~unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值  这四个值改变次序后发现没有影响,怎么回事?  b8 @! n) ~: X( ~& Y5 C. L  H
unsigned char ledi; //用来指示显示顺序
' L+ x# X: B; a+ PRCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟5 N0 _% m" E: g3 u' Q1 s
RCAP2L =0x00;5 b+ \/ }$ Y) f$ O$ ]/ t7 N
TR2=1; //启动定时器0 H2 s, \% d/ U8 }0 r6 R
ET2=1; //打开定时器2中断
9 _% q: p3 O8 lEA=1; //打开总中断! G+ X8 {/ ~) c" F
while(1) //主程序循环2 {5 ^" a* f( g; d
{
9 s7 C4 Y/ z5 Q0 x+ aif(ldelay) //发现有时间溢出标记,进入处理# o2 z' t' F2 K' i
{; {- q$ w, ]6 [5 V7 j' \
ldelay=0; //清除标记3 U( \5 a4 }: ^; I  U( T
P1=ledp[ledi]; //读出一个值送到P1口
8 y4 C2 h9 j- I5 v1 R7 xledi++; //指向下一个
. T) J( B) m8 {% B$ Pif(ledi==4)ledi=0; //到了最后一个灯就换到第一个
; w8 H. [2 D8 z% s) Z! b7 ^
}6 M! H( @, x& k% q8 r
}1 Y3 M! c! K5 t) e. ?7 R
}
4 T9 E! x: I! B( @5 P  p/ }//定时器2中断5 F# k" @: a9 y5 ]4 C
timer0() interrupt 5, w) b: G$ R  U3 U* Q
{! j" q% ^: W* i
static unsigned char t;
7 L1 V( Q6 v6 ^- T+ ~! t3 J* CTF2=0;, ]* g  R8 P# t1 O% _  U3 a
t++;
! h0 o" [9 o0 oif(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
4 |& }6 ]5 {* h& ^6 o{& _# Z! a6 K( Q- A( ^1 q  I
t=0;3 j2 R2 G1 j) {) {
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理2 v: ?" H; j5 Z" x. D& ]
}  E5 a" y  H! D! |1 [
}& I1 [) B% s  K& Q; T
×××××××××××××××××××××××××××8
  p/ x+ i  i+ I9 D8 f) D就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把8 S, k( }: b& A, W
ledi++; //指向下一个* V: `* V3 Q. H. g" |) \3 p
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个   
( q  m0 [& B8 N0 r. a5 |+ P! W
改为. X3 @' D: t9 g- ^: s2 l, r
ledi--; //指向下一个" T+ h5 Z. }4 @
if(ledi==0)ledi=4; //到了最后一个灯就换到第一个

2 q; }2 s4 ]# A, t) }. k, a只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了" w" T! K1 Y0 Y) ~. m

  \3 u8 ]! r# r$ h. r9 g[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ]
 楼主| 发表于 2007-8-27 11:02:49 | 显示全部楼层 来自: 中国江苏扬州
找到问题所在了,原来是# Y6 X1 ]8 M9 `' |9 P
ledi++; //指向下一个
$ b3 G& u3 V; |if(ledi==4)ledi=0; //到了最后一个灯就换到第一个
4 e6 C4 g: P0 |
这一块把 ledi=0; 变为{ledi=0; } 就是从右到左了,
+ ^' u) X/ G  P" I- k( ~6 e可是这个大括号{}到底起到的作用是什么呢? :o
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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