|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下
. |* n& ^# r% c' K$ S0 I程序:2 t" w5 R+ h) \5 ]* O
#define uchar unsigned char //定义一下方便使用# j8 V3 Y2 R& ?8 g. R+ {$ r
#define uint unsigned int R# {: ]/ c2 e5 [- v" k
#define ulong unsigned long
# l3 A# c+ f- O: M- n6 [#include <reg52.h> //包括一个52标准内核的头文件
" r, K0 f+ H N$ H2 V7 F2 Fsbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了
) z+ V. a5 w! p9 j' ~sbit P11 = P1^1;
8 Q S( {) r$ msbit P12 = P1^2;$ D6 M' S( J( f1 v8 m7 s
sbit P13 = P1^3;
k/ ~" s. J) qbit ldelay=0; //长定时溢出标记,预置是02 r# X) I& x' C9 s
//char code dx516[3] _at_ 0x003b;这是为了仿真设置的
7 S4 |4 \9 h0 v; b//定时器中断方式的跑马灯
) j# I/ \8 }8 I" v% i; _: o1 tvoid main(void) // 主程序5 {6 D- K% p7 N6 ~' p0 [" z
{
4 l8 E/ Q: U% u1 Kunsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?* P' f1 |: P* c# f: _+ S
unsigned char ledi; //用来指示显示顺序
. T0 C1 h. k0 s% nRCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
4 Z( P* m" Q+ u. ORCAP2L =0x00;' j- {- Y$ j1 ]; r; q
TR2=1; //启动定时器
* W6 x" c- c% x8 v5 e5 VET2=1; //打开定时器2中断
3 R* S+ J9 ?3 A" G+ R( c O/ KEA=1; //打开总中断
, L& y% L* N: |, M) B% }; |% twhile(1) //主程序循环% z0 Q/ j2 \7 ~; @
{, o$ n- F! i7 L3 k
if(ldelay) //发现有时间溢出标记,进入处理
) W4 q0 I6 G2 v4 E{9 R- x2 h* `( x o9 y3 E/ s
ldelay=0; //清除标记3 s8 I% ^$ {, e1 I
P1=ledp[ledi]; //读出一个值送到P1口 5 r6 `' [# T. |8 L* K* q5 p% J) ^
ledi++; //指向下一个
+ l9 R" N! @# i$ y$ { {. Uif(ledi==4)ledi=0; //到了最后一个灯就换到第一个# y/ v$ j7 ~* A( K) {1 s3 p
}# c3 R4 m E( O$ d7 |
}
. M9 i( C$ s4 z' {}
* v# I2 i3 Y; j: Q3 x3 b* S//定时器2中断
' q7 }# b$ {- e2 `+ g2 atimer0() interrupt 5
# y$ E0 Z3 N0 S( e0 L* K- v6 q{$ k; H% Q% q- y; n/ C
static unsigned char t;; s7 P3 m6 s% _" X$ g6 l& u1 J
TF2=0;
* C* w9 ]8 A+ x1 |. z; D0 ht++;9 ] `4 s2 {/ A
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ6 U3 z/ @5 l1 H7 j/ N. b
{
7 L H7 m1 h- D8 r- Ot=0;+ _7 h2 Y6 e+ [0 s5 C$ H
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
# O/ d4 t7 o9 k}
8 a6 `1 G. K. E1 G& m j& w6 l}
! y' E9 n6 M/ P5 h% f7 b# h×××××××××××××××××××××××××××8
% @. P N) G) C$ p4 p6 t5 n就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把
* W5 s& @' w$ ]ledi++; //指向下一个
, a8 G8 C& \, ]( nif(ledi==4)ledi=0; //到了最后一个灯就换到第一个
% O8 V$ ?1 {" f- q# _& W改为 i, J2 [: g, G5 w) Q
ledi--; //指向下一个- B0 u+ S& X$ t8 c: ^
if(ledi==0)ledi=4; //到了最后一个灯就换到第一个
* Y; \! P/ |, g) ~5 E9 @9 t只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了; ~% W: k2 W8 f
& k% @' F, C, `8 m4 j+ L
[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|