|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下
& |% x; U) v# l2 R程序:; f. ~0 |; }/ V8 S1 r
#define uchar unsigned char //定义一下方便使用
0 ^& B1 A3 V+ H& {#define uint unsigned int
b+ `! Y$ Q+ ?/ n7 P#define ulong unsigned long1 p9 n" X' c1 g! `: r0 L n
#include <reg52.h> //包括一个52标准内核的头文件" [- h. J- f* f/ c) [
sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了4 x p, S5 g( r/ d% s J! M
sbit P11 = P1^1;" y) ?! h. v5 e! C
sbit P12 = P1^2;$ W4 j# \9 c5 Z/ b/ f' I, n/ M- E4 x4 ^6 B
sbit P13 = P1^3;0 q+ N* n) q! O% Z0 F- } p9 }- `1 _
bit ldelay=0; //长定时溢出标记,预置是0, ~) L7 K. x& A% |8 b3 u8 @
//char code dx516[3] _at_ 0x003b;这是为了仿真设置的$ R- A& ], L; H% T' K+ @3 b
//定时器中断方式的跑马灯
y5 p; K) {% P$ [" c# Svoid main(void) // 主程序
: X/ j* d* ?* X4 l) w/ y# S9 U{( i/ L8 [ O7 S1 _+ g
unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?) S, j7 ]: X2 b2 M& A: ^: H
unsigned char ledi; //用来指示显示顺序
% E2 y8 E m! j/ k7 nRCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
$ O+ p3 v# |/ z3 rRCAP2L =0x00;, n+ u' k8 K1 P7 ]/ m3 u
TR2=1; //启动定时器3 `7 ~/ I( H7 Y% K
ET2=1; //打开定时器2中断1 H( }! ^0 ?5 s' u, z, T9 T& N: N
EA=1; //打开总中断4 x6 {+ X7 F$ I, E' h" b+ V
while(1) //主程序循环- f* W; Y. X& x, O( J9 }+ X
{. `& ]) b5 }% e
if(ldelay) //发现有时间溢出标记,进入处理
2 r% Z2 o3 a& M* x0 S( {{* J' Z% F1 U+ g
ldelay=0; //清除标记
- Q& c% J( S- L% E; W7 U' WP1=ledp[ledi]; //读出一个值送到P1口
& o- `; j, Q+ o: U( D' K; Uledi++; //指向下一个; L, K) q5 h$ N' E1 a
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个
# c; [6 _1 f; A( T}
! i" Y' N, f4 d}' p* p" \6 M# @; e+ H3 K
}
( V$ P; V& D/ i7 n3 A$ ?6 G' e6 `5 Q//定时器2中断
/ h$ r' O3 m8 |/ Htimer0() interrupt 5- m4 r" w' o @* b: U" U- W- A( E: t
{4 V2 Q: q# L3 m/ d
static unsigned char t;1 g7 u) ^) s7 x
TF2=0;
. @/ E- r4 ^% Jt++;
6 y! b: i/ r5 H* R0 j7 lif(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
3 X+ Y+ l; J* \) F9 C+ Y6 g{3 U' @& q9 J: Y! p
t=0;& e7 E! k7 e/ ?7 w( K2 K ^
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理- Z% n5 T! K" d+ V
}7 l9 o& n* M2 C2 F0 K* |
}( q4 H% j& e7 O3 g8 H
×××××××××××××××××××××××××××8& A/ Q; X: a2 U& z( J7 \% p1 c
就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把
( N6 T( M6 r9 k i$ c% P* a. {ledi++; //指向下一个5 w5 u% H, h) y, o+ l3 H
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个
" a( a T6 L8 k% @! s- g改为
+ x' T2 e& {( @" R6 \) q- l# E% jledi--; //指向下一个
1 s4 g7 t2 L$ E- U4 w# oif(ledi==0)ledi=4; //到了最后一个灯就换到第一个
8 e. G/ g. O/ E3 T6 X6 F' z只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了& j5 }% K: g# I, y
2 c/ [9 o3 W# i; D[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|