|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下# }' p3 k- Y* j0 Y8 I4 [0 `
程序:0 j4 _" ?" O; _$ s8 Q
#define uchar unsigned char //定义一下方便使用5 g) L' m$ b5 n* G, D, Y5 U
#define uint unsigned int/ X ?8 a) x$ H. `$ f$ p1 _
#define ulong unsigned long
: T7 v6 b. I! e7 g* A: y+ ?#include <reg52.h> //包括一个52标准内核的头文件4 d3 w h0 V" f' q) W# D9 v
sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了+ O7 }9 V [: A( s" _% P( N3 m- x
sbit P11 = P1^1;- D3 z+ g5 x! A6 `) n
sbit P12 = P1^2;
# t" W& Z3 ~0 H1 S( ]; ?sbit P13 = P1^3;5 @) g; F1 ^- t0 b1 O O
bit ldelay=0; //长定时溢出标记,预置是0
3 ~ _/ a" M; V$ ]' F x, b% q/ o( H//char code dx516[3] _at_ 0x003b;这是为了仿真设置的1 Z# n' g/ A, a
//定时器中断方式的跑马灯
- I* A' }- i$ _% ]* d1 G( x0 fvoid main(void) // 主程序
$ {/ k% d0 F6 [5 a4 I; L. B{) b3 M2 T; N2 L7 }
unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?
9 T# d8 ?; k- t0 Uunsigned char ledi; //用来指示显示顺序5 n3 L1 G2 T; ?: D& S3 E
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
5 d! I: `0 t% `0 t0 ^6 nRCAP2L =0x00;, Y: f! R. R0 w- y* D+ p, H
TR2=1; //启动定时器
1 P+ i5 [ I/ bET2=1; //打开定时器2中断* Z# ^0 `" C- f/ ~8 Z6 W G H# w
EA=1; //打开总中断
/ v$ n: p j; G. Y% o7 B5 lwhile(1) //主程序循环: j8 c! Q4 M1 k, R$ G
{3 W, x) P, w U6 S" b% l
if(ldelay) //发现有时间溢出标记,进入处理
$ S- v7 f/ U3 C{7 E9 |! V' a7 w' I' @$ S; Q5 ?/ Y
ldelay=0; //清除标记; G) e" ]# k, J5 y$ m
P1=ledp[ledi]; //读出一个值送到P1口
* B* e3 j @5 x5 L- v' g) g& ]ledi++; //指向下一个, F8 n" E& P' C; o- B
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个
+ l) h( w i0 A* Z}4 u6 f4 G/ _$ b( N: P
}
4 P+ p4 T# P% ^% w! X+ X% t}; {2 `% H7 c& g+ j! e2 j* j* H# f0 [; j
//定时器2中断
6 p j: v/ `5 L" Ttimer0() interrupt 5
3 I3 U" X- d& J* Q{+ o! X7 p) I. |' P
static unsigned char t;
( \" v; A( m' X: |+ \TF2=0;
+ O& v. }/ H" J5 d3 ^$ Y( Kt++;
4 `+ l4 c* m# L0 j7 V; X1 d. rif(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ7 v9 k& R' E& G
{- _& ?- i4 N4 ?& a; S9 Y2 `+ F4 x
t=0;
% b) f! p1 e2 h8 A+ x. ?ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
4 I9 p- I2 r/ Y1 V6 p$ h}
* ?" }- D" [) u}
, a& b2 g- N% j×××××××××××××××××××××××××××87 {1 p6 w% ]. N+ C# {, X1 I: D
就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把
( E4 _) ^, P8 I/ v5 v9 T1 C/ h$ S. Gledi++; //指向下一个
7 V, h. }; p# E; u/ Xif(ledi==4)ledi=0; //到了最后一个灯就换到第一个 . [+ Y% e7 S' l' g! H
改为
6 s$ r& }) `& _% Rledi--; //指向下一个
, \6 b; x5 B, S7 ]2 K0 V4 g7 ~( B3 ?. Gif(ledi==0)ledi=4; //到了最后一个灯就换到第一个
* ?/ r6 ?0 `- [8 u4 x1 X只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了
9 C9 b/ h6 p4 U3 V5 ~4 D7 I9 [, {% _2 x
[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|