|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下" ^! G y$ @8 b) L' k6 n) f( e) j
程序:! c7 Q0 {0 P' q
#define uchar unsigned char //定义一下方便使用" u, x, d2 m& b
#define uint unsigned int
( h9 c7 a, _3 y0 a. r6 j9 s#define ulong unsigned long0 ^" o6 x: @0 b3 Y8 l
#include <reg52.h> //包括一个52标准内核的头文件: y3 a/ s- l2 x
sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了8 `: [" T Y- v$ w
sbit P11 = P1^1;7 X6 R3 k( M" t' H3 S: e
sbit P12 = P1^2;0 x$ S0 Z. U7 r" q) `8 t
sbit P13 = P1^3;$ \! i" i: B1 I" `* d
bit ldelay=0; //长定时溢出标记,预置是0; m: a2 W# f# I
//char code dx516[3] _at_ 0x003b;这是为了仿真设置的
4 J. ]" f0 M7 a8 j8 c: v1 C4 t: `//定时器中断方式的跑马灯
) t( q8 l$ a0 Jvoid main(void) // 主程序& M4 C' z# _# O% O4 O
{- k+ J4 \6 e$ d3 w7 N4 A
unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?
4 u3 w# \( G9 Y+ d2 [# Bunsigned char ledi; //用来指示显示顺序. b6 I) p" A6 F
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟 a6 j+ y" I. p1 V; T3 N1 X
RCAP2L =0x00;# p P! R1 i" n$ t+ o( g x7 _
TR2=1; //启动定时器
1 ?4 ^0 Y0 Q$ \0 _* YET2=1; //打开定时器2中断7 H, ^. Z+ z. `+ U' h
EA=1; //打开总中断
+ p; m" A5 \ V' z) c! Cwhile(1) //主程序循环) A* W3 b' c; Q) ~8 A
{; \# J9 l: e( Z& m& u
if(ldelay) //发现有时间溢出标记,进入处理
% ^: X) |1 u6 c; r, I{
/ G( m y, N& ildelay=0; //清除标记- A8 [0 k0 a& a( ^" h, Q* Y8 f3 T
P1=ledp[ledi]; //读出一个值送到P1口 1 t0 x+ \. M; Y8 Z. E8 a+ B
ledi++; //指向下一个# K) C2 L5 o! h( I3 x% J7 I
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个 L# y# N& l* ^% g& u, {% ^% j, W
}
5 B1 D6 k+ D! I4 p8 `! V}% c: f0 j* v& d, @- H f
}, h# G/ k$ U! {1 t: X8 {
//定时器2中断5 {& b& N4 Z4 N$ E+ `
timer0() interrupt 5
4 Q8 ?! e' H- V{
5 M. t# {: i1 a% f/ Ystatic unsigned char t;
. b( g. `: W% ]! [( GTF2=0;! ~1 D# X6 Y5 ~) M! ?/ c- J- ^& ]
t++;; E2 Q, k, {0 V" o% f" N
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ% w5 F* n% | _7 d7 J6 _0 b
{1 `( v+ w+ ]6 ?( ^) k
t=0;2 c4 y! U% ]' b7 O6 q7 q
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理3 u6 Z5 n4 y0 ~' }, T
}" i+ O4 C" `4 i J w
}
% `: ~% h. U0 `2 q% Z9 p" z' [×××××××××××××××××××××××××××8
! Q; Z) ~, {9 I* u& M就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把/ Y4 j& M9 f# t/ d" }( w9 P
ledi++; //指向下一个3 J4 @- e2 j2 b8 ~9 N- |1 b7 p
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个
9 L8 S6 f: A' X' S; o改为+ f8 z |; B# M* `5 n
ledi--; //指向下一个
0 R# T" H+ h- W- C! p& yif(ledi==0)ledi=4; //到了最后一个灯就换到第一个
% ~# Y" _! b' s- o% S: [; d7 v3 L只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了7 g" S# P$ s, V% g1 y" {
/ S2 l, ~3 t+ \) T+ n2 y! j3 |) ]* n
[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|