|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下6 m% u# h$ o/ b' T* E/ j
程序:2 ~6 J2 v( R) x4 x/ C. Q& T8 L m
#define uchar unsigned char //定义一下方便使用
9 ^& x9 b# K" T# n O, q, h#define uint unsigned int+ [& A7 S* t Z
#define ulong unsigned long
2 A5 D, r5 |3 G Z* ]% R8 P; H1 A#include <reg52.h> //包括一个52标准内核的头文件
4 Z; K6 E, O5 z9 Q5 esbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了
5 ~, B* c; |0 k4 `8 ^sbit P11 = P1^1;
, L! `# x! O4 }% [) l- A* ]: Isbit P12 = P1^2;! S# o/ N! S. a- F
sbit P13 = P1^3;
$ i- v3 Z# J8 }9 Ubit ldelay=0; //长定时溢出标记,预置是0; @& c5 S! [, @2 f) z) Z- D. G
//char code dx516[3] _at_ 0x003b;这是为了仿真设置的
& W5 H( C' z+ s, \" M//定时器中断方式的跑马灯
9 z9 r2 N2 v" q! l9 ]6 h' D, mvoid main(void) // 主程序( C) a" o% T) {: D
{
* V! Y! F6 d! `unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?. u9 L. l$ b" R/ o1 r
unsigned char ledi; //用来指示显示顺序
4 U1 Y. F0 O/ v( b: t- aRCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
0 k! Q, _6 k+ z; H2 a1 G( w9 hRCAP2L =0x00;" m8 ~, Z5 _1 z- C
TR2=1; //启动定时器9 _: J6 ]2 `' J; f. g r, t
ET2=1; //打开定时器2中断
4 o# J: Z. Z3 H+ V2 R6 zEA=1; //打开总中断
0 W8 ^: w7 n1 B# U- Rwhile(1) //主程序循环 C! p6 I6 a x
{
$ `7 L* A3 Y1 ~if(ldelay) //发现有时间溢出标记,进入处理
E/ e9 |) V' [ a- ~1 n8 P{
, A1 j( _+ ?# J; A6 Ildelay=0; //清除标记 N T/ T' N# J
P1=ledp[ledi]; //读出一个值送到P1口 0 a* _# K; }8 N! q$ x, Y: f
ledi++; //指向下一个
: i3 n% d7 c! r3 \: f- }( g& Yif(ledi==4)ledi=0; //到了最后一个灯就换到第一个
* P8 `0 ]3 I$ S4 F}- B5 I' k; Z0 h% @( z
}5 L; p* j ]; m' G8 n$ I% F$ o
}4 W0 F6 Y5 ?* E1 d8 K+ O5 J. X4 }
//定时器2中断" {- E2 H. p2 [; t, z! B
timer0() interrupt 5
" q# `0 m+ i% U1 l9 A1 ?{
* |2 C/ ?; C, x' u6 Dstatic unsigned char t;
* R! ~9 g% _& kTF2=0;
) ?8 r! g, f; u+ U( ?! Dt++;1 {+ d' F$ W& M$ V% Y4 O
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ. ~& O1 T( l* I @0 `6 L# P' J
{
! b* B | }* d) et=0;! S0 s4 E9 L6 |# E+ @
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理( C/ S) s, F O! P0 ?5 A
}# J* m9 k" V: a8 B# `
}+ G: S3 L$ c" M. t5 z% w1 @7 c0 t9 _
×××××××××××××××××××××××××××8
. v/ z7 p$ \5 z) r4 p就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把; w' {1 ^* }6 X( _6 T0 Z
ledi++; //指向下一个5 I4 h1 f5 A- B% P( Z
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个 . `, a5 a s* {: d7 p) ?
改为
8 l# d! O; k/ `! l9 Zledi--; //指向下一个$ E8 e8 |4 O$ S4 W" ]! n7 S6 S/ ]
if(ledi==0)ledi=4; //到了最后一个灯就换到第一个0 L* t P) O: ^' Z6 I! G
只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了
% y, @+ ^! ]* g: `" X) `% U, G$ W
[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|