|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下2 ?3 _, j5 I; i
程序:4 L% }0 J8 R. [1 H
#define uchar unsigned char //定义一下方便使用
7 `3 I4 C4 y0 q i2 x#define uint unsigned int
2 I$ v& X' f' e. U#define ulong unsigned long
& L" T) e/ O2 |. \#include <reg52.h> //包括一个52标准内核的头文件
$ ]# M+ _4 A; M, i( \sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了
, [- [; j& [ `! n2 V i K2 Y& \sbit P11 = P1^1;* C2 W6 q8 R& g7 Q! s6 }
sbit P12 = P1^2;
: i x6 n9 P2 \) a+ u2 Isbit P13 = P1^3;) _- \9 S- x9 M
bit ldelay=0; //长定时溢出标记,预置是0
. X$ ?$ @* A6 J1 R* `//char code dx516[3] _at_ 0x003b;这是为了仿真设置的
, Q k s5 A$ d5 }; K( e//定时器中断方式的跑马灯/ E# A8 X0 W8 C+ ]( T# _
void main(void) // 主程序
4 `6 v* U( m: Z3 d5 O{% O- f3 g0 c1 D5 c
unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?
0 `! x6 R( b; [( b: J1 m+ o4 {unsigned char ledi; //用来指示显示顺序
+ }4 u- d( w; m3 DRCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
" @5 h- l0 B0 k8 @ uRCAP2L =0x00;) K- h" v: F+ M' e% J
TR2=1; //启动定时器
8 g- b2 ~4 N! zET2=1; //打开定时器2中断
1 }6 a/ Z, e) J" ~/ z u- r% rEA=1; //打开总中断
6 q1 E0 W I" u2 O6 U3 ]while(1) //主程序循环+ ?8 J1 l- N: d- ^# m: S
{
% o8 w# G& E) I; t5 \! u+ {if(ldelay) //发现有时间溢出标记,进入处理
f% O$ z, v+ M{" f b6 ]) T! W1 @" H6 k' E
ldelay=0; //清除标记
2 M( H. x, B0 W( G' x+ cP1=ledp[ledi]; //读出一个值送到P1口 - E4 Z3 |/ @( |2 g/ e4 n, B
ledi++; //指向下一个
$ n. x8 e5 _4 Z& W* I4 N+ u! H7 ~if(ledi==4)ledi=0; //到了最后一个灯就换到第一个
" z0 j4 z7 X! U7 t}
: E0 c( m3 M; @/ L- ^8 q* [- l5 k}! I0 c+ K2 u1 t& ~
}
, [, x5 \9 p! _$ [9 U- E2 x//定时器2中断3 a9 J+ U/ h, P; E
timer0() interrupt 5
" p2 c0 W/ {; q{
6 W! u- A% o" o" @# n, K2 Ostatic unsigned char t;' k0 W/ l4 l. Y- x+ a
TF2=0;
9 U9 D9 T4 U- ~* z$ n! b9 Ct++;4 h- Z( j: \% l7 e
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ" T; R: f4 v J; q& k- |
{
# ^* F$ ?! c) kt=0;
" H2 a. m) M Q- v e0 [5 Bldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理0 z+ Q5 H9 Y0 Y9 Y+ J6 k4 u
}; _* t' ^& r( ]' J
}% G5 N3 `1 i/ M
×××××××××××××××××××××××××××8
! Z* B: f. |3 F% e$ [! r, A就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把
4 X& [# j' B0 T" ]6 yledi++; //指向下一个5 S7 @/ e# X; U$ W# y9 j
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个 - z1 c* M' t- b2 F1 v1 W( n
改为
; V; U2 u9 [$ e( d; w. p+ gledi--; //指向下一个1 d4 i9 p( X5 E# Q7 Y* l' y1 Y
if(ledi==0)ledi=4; //到了最后一个灯就换到第一个
* |: H8 i3 ~! T$ Z; X" X. a只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了1 J' i* N& |1 H5 C" j; W) `
P1 v( Y. X: z; J0 X Q
[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|