|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下% g+ t8 r1 m. S0 O9 Y: U4 K( ^& D# X
程序:4 {- b5 _3 m8 z# \+ a8 `7 L
#define uchar unsigned char //定义一下方便使用
8 r& a, v4 W) `0 D" d y#define uint unsigned int% ^. w+ p- r$ C5 K! s" z
#define ulong unsigned long
) Z& o2 O8 D0 u; Q; f ~#include <reg52.h> //包括一个52标准内核的头文件
) ~. O, P6 n7 E/ o4 c, jsbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了
7 o, j' u# T. h2 F5 H" s" Msbit P11 = P1^1;: l1 D- N9 H* X% N& }4 i
sbit P12 = P1^2;
/ N9 H; p& I( Esbit P13 = P1^3;4 F+ @: K# D+ z* f( C) y
bit ldelay=0; //长定时溢出标记,预置是0
( b( E4 E" C, _+ E4 M//char code dx516[3] _at_ 0x003b;这是为了仿真设置的* D) q. q2 y1 h
//定时器中断方式的跑马灯
/ p6 f! U/ S w" P2 ovoid main(void) // 主程序6 a$ {- v' T: P7 \
{
$ w1 M3 `. K" @unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?
5 p8 m: i5 |/ t1 }6 Yunsigned char ledi; //用来指示显示顺序 B0 ]5 m& c H3 b: G$ S, W
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟% w; S ^) o ~/ o# u
RCAP2L =0x00;- e) ] j) ?# i0 j! T5 }4 V2 [
TR2=1; //启动定时器0 t" W8 z' `) G6 K0 s( t
ET2=1; //打开定时器2中断
) d& f: {2 C1 D" }5 xEA=1; //打开总中断
% W4 U" U8 Q0 r" u5 cwhile(1) //主程序循环9 F, b3 U* S" @ H1 D1 x: X0 F
{. g7 c% ~% I+ [2 j) b
if(ldelay) //发现有时间溢出标记,进入处理
1 o& n3 w+ ?) M$ L{, Y2 R# f7 e5 |" O0 q$ H9 w" B
ldelay=0; //清除标记
8 @4 z5 d; B* X7 a1 b9 RP1=ledp[ledi]; //读出一个值送到P1口
J0 X7 T6 C% Q* v' N3 @7 |. ~ledi++; //指向下一个
/ I2 t3 l$ i9 z4 Z1 Vif(ledi==4)ledi=0; //到了最后一个灯就换到第一个3 ^. G$ i7 z' j) a! R9 B) G
}6 n7 ~$ p4 u# o% f+ r7 L
} q# ?, x8 n" x2 b$ z
}
; g3 I+ d0 l m. {9 f' d L; U. w- S//定时器2中断7 [ j; o7 f5 N
timer0() interrupt 5
+ R+ b4 P, F! r{/ V% Z; M% d0 i
static unsigned char t;3 o6 t( e; ^& M& \% \5 v$ v" V& i U
TF2=0;
" g* P, ~( g2 t9 K0 Z4 _t++;
4 i% d Z' A, f2 K2 cif(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
: F3 E9 l O. K3 Q, q{$ N8 H/ V4 o; ^2 q9 {: j) Y* {
t=0;
0 i# B% ?9 r; i4 q4 N* Dldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
' }; X. s) {* n u% J( c6 e}" `/ o8 S. }5 d$ a$ I' M$ a
} m% ~$ C3 M8 R3 T1 V9 o* w7 A7 }
×××××××××××××××××××××××××××8- m' ^: K6 w. v& z9 [# z% A, n; D, C3 Y
就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把( w; A; u2 g" n2 G4 P# t2 a
ledi++; //指向下一个; ~6 L# }* N5 a [3 S, t
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个 + e( L, N; }- o" C; l1 ^
改为! |4 }6 @; F4 J
ledi--; //指向下一个/ I( Y, S3 l: Z% Q3 w4 A
if(ledi==0)ledi=4; //到了最后一个灯就换到第一个
1 w Z! s. J; c' _. I( b. J- ~# A8 K只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了
0 `3 h" a7 b, S( W& h0 Z; z
3 W3 I1 n/ \4 I1 g0 _6 E0 Q[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|