|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下4 b5 \. ?' [5 y v' p w( l4 Q
程序:
* n7 g ^% i' w$ {& ^. Z ~) X#define uchar unsigned char //定义一下方便使用
4 B* X. {9 N0 t6 V+ A( b2 m1 T#define uint unsigned int
# U8 y O6 H0 x3 X#define ulong unsigned long5 N/ [5 ^* ]6 D9 @* l
#include <reg52.h> //包括一个52标准内核的头文件! @& U) d' H9 D/ z; [* h3 o
sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了
2 g3 P0 j V8 h! Esbit P11 = P1^1;
3 L Y, G8 }) r$ b0 n3 f/ gsbit P12 = P1^2;
4 Y+ i' [. \5 `: jsbit P13 = P1^3;
r! X# e e. v# w' @bit ldelay=0; //长定时溢出标记,预置是0
- g# [1 F7 g, f( ~3 V/ I ?& f//char code dx516[3] _at_ 0x003b;这是为了仿真设置的
1 Y) p! H k9 m& [2 }9 I* N V//定时器中断方式的跑马灯- `+ E, A! s, m
void main(void) // 主程序
+ e R* J" M# L5 A+ s5 p! i* }+ _{7 O6 |) i" b0 T3 {8 v. f
unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?/ Q6 H* Y+ `& Z) S$ z$ P$ a7 f
unsigned char ledi; //用来指示显示顺序. p: A3 W C" n$ x$ B
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
$ I0 }" C; |; E- |. rRCAP2L =0x00;
$ P0 ^1 l) J) ~! JTR2=1; //启动定时器* [; L Y# x; `% C0 q' k$ o5 Z
ET2=1; //打开定时器2中断. r0 j4 f) M0 v* r R) ?: v+ `
EA=1; //打开总中断" D- t! f( d' H$ r- c# T
while(1) //主程序循环
! [4 s( F4 D. h" N{" X( E7 Z. I# m7 s b" Q0 ?
if(ldelay) //发现有时间溢出标记,进入处理
v. R# a" |5 M{& `+ ?4 u ^* @' s' F* X/ R* t( J
ldelay=0; //清除标记
0 e8 @: G0 i8 I: S+ |: T! N# {P1=ledp[ledi]; //读出一个值送到P1口
" {+ O! C X, u& B4 K% Fledi++; //指向下一个9 u: y; n3 D) I& {5 D
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个
/ S& Q7 o' y0 Y7 J}# ^. X; c2 t" V) O) y
}* v& C5 B D5 Y- u
}* l# j6 M. W3 l6 ^/ p
//定时器2中断
/ T4 e3 f& I5 [+ o: @" Y. |, jtimer0() interrupt 5
4 P! p9 y6 l* b2 x! _% o{+ V+ m* [% e) T# k
static unsigned char t;
& L" O" A. M/ P3 c$ R, `TF2=0;
4 B/ ^( S0 Z6 f( }8 l/ m3 ~$ Rt++;# Q$ Z4 w" t% K
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ4 C5 b1 F$ u7 M& P, m+ R; o8 Y
{
) C: U# n: B! nt=0; _7 m4 l D7 n
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
" @ V2 }3 \( S0 V& @}
+ Q+ c' U# e; k# e7 z$ k1 v}
1 T" r" O3 t0 h; V×××××××××××××××××××××××××××8
' ]; Y( k: Z3 N" Q! ^$ I1 }# t: N就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把( s1 |- n' B5 ]! d% ]- Y% u# C$ z
ledi++; //指向下一个7 U) X# g7 T0 q9 n1 n2 R. m
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个 " n; F: ? t5 i9 h7 s
改为# r0 m; N! B+ H3 B
ledi--; //指向下一个
3 Q4 |; X# x% k! p$ J! T0 s: Vif(ledi==0)ledi=4; //到了最后一个灯就换到第一个2 W' U2 } G) w- f+ M( h
只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了
9 m9 |! C4 Z% }+ q& b0 K0 h2 e( M+ l g' H: O% c |
[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|