|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下% _6 i. y F: A9 ?; m/ ?9 l1 h
程序:
3 Y, I% _, |7 P8 p#define uchar unsigned char //定义一下方便使用2 {$ p' q G0 B* j, Y2 t W
#define uint unsigned int1 ~" u1 p' Z/ p* k6 C
#define ulong unsigned long
/ W$ H( _! \7 C7 {: l0 J) @: t#include <reg52.h> //包括一个52标准内核的头文件5 h1 u1 ^2 g* Y
sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了5 m8 a+ \" M7 k; T" Z
sbit P11 = P1^1;5 J6 w$ a7 f* X, Z* Y
sbit P12 = P1^2;
0 t- f1 f* `) M- g, ^sbit P13 = P1^3;
1 X* X: y. b$ {$ ?, Ybit ldelay=0; //长定时溢出标记,预置是01 m4 S. |0 j7 {5 d
//char code dx516[3] _at_ 0x003b;这是为了仿真设置的
3 T* S5 J+ o( v$ U" I. F3 C//定时器中断方式的跑马灯
# j# A6 B# e) Cvoid main(void) // 主程序0 q- l8 ~. c% [7 }% _: a* i0 X
{( l' F+ _ Y: ?& j
unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?
4 W. v9 E. @8 G5 V& B* G& Wunsigned char ledi; //用来指示显示顺序
; E3 @/ T; P! |5 N& URCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
" W5 w v8 h& ?# J1 BRCAP2L =0x00;
9 }9 ]0 s: {( L+ ATR2=1; //启动定时器
2 N) j" e$ r1 U3 A/ A$ mET2=1; //打开定时器2中断
- ^8 Q( u2 R' O( J3 Z9 f* CEA=1; //打开总中断
) w% S% x* y8 }2 M8 owhile(1) //主程序循环4 E! w7 \8 |+ h$ ^3 u; w0 z; H
{
8 g) D6 q! N2 [1 R) O1 ` d; q, m) Z' m6 h6 Pif(ldelay) //发现有时间溢出标记,进入处理
) S" w% W' _! ~- a4 k/ }{6 r# |. d# w, U* i |% Z. F$ _
ldelay=0; //清除标记
0 Q+ _# n1 U# V( O( DP1=ledp[ledi]; //读出一个值送到P1口
n Q+ _$ G$ ~5 _# @7 k3 c6 f; Tledi++; //指向下一个1 V: a5 v0 w+ a$ n' Z
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个$ E% j" z ]0 o
}
6 }) U* d( \% p}
4 M2 F- F' z I7 w& J- V: g; _}
t& i: K& O2 ^3 b$ x//定时器2中断8 C) X: G# Z4 b9 P# O* S
timer0() interrupt 5
* u7 F# Y, C8 j+ d+ R. s( w{
: [# H' }, r+ G% estatic unsigned char t;% P3 L- u% E5 e# [! W# c
TF2=0;
! H2 J' Q0 U, e0 O- I* B1 at++;( v2 I6 b" \7 j- b" J
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
2 ~! M% b0 j2 J- O8 d* q{
. m; I+ p" s1 |3 Ut=0;' a7 H0 ]; j& C2 J! n7 s
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
3 k0 M. c7 S+ f6 Z}9 t0 y- w+ n! o! _, {
}
% s! \ t" p/ h3 p: D" L6 v! Z" d×××××××××××××××××××××××××××8
( b+ a, \ Q/ [6 J4 U就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把5 g$ s4 E7 e- }( a: O, O# e w3 U
ledi++; //指向下一个# v5 @ e6 C- _# W' O$ q1 M
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个 G. L, e, k+ V; D' G" r
改为
' G8 O8 [; g7 d5 {ledi--; //指向下一个
3 J. `* `0 F2 _6 @* tif(ledi==0)ledi=4; //到了最后一个灯就换到第一个
$ n, E2 `( O! u2 |只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了# ^$ k& A4 _/ k
: p' A( _* T% z- |8 Z# G
[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|