|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下/ v. [6 F" |2 \1 a& z$ G* s* v6 i
程序:
6 k9 Q$ K; `# b3 J/ S, x#define uchar unsigned char //定义一下方便使用* o9 S3 W- X9 }6 }0 a( i2 z1 Y
#define uint unsigned int
9 Q! U' A( e' _# A7 v& V) A#define ulong unsigned long" R I+ t; E4 V5 Z, k" F. m) `! T
#include <reg52.h> //包括一个52标准内核的头文件$ _8 Q0 w3 O% X5 y
sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了 t% |+ ^3 F' h9 }4 Q
sbit P11 = P1^1;" e5 A5 P; T; D, n }1 o
sbit P12 = P1^2;
( D- u. q& C$ x8 c% C5 _2 x# Gsbit P13 = P1^3;
2 ~- i; D, O* z# e! ]bit ldelay=0; //长定时溢出标记,预置是05 x- a, q4 P1 d, U# V3 t9 z
//char code dx516[3] _at_ 0x003b;这是为了仿真设置的
$ F7 ]$ c2 s# V% `( |6 t//定时器中断方式的跑马灯: m' d' C' a4 Z3 S8 Z; j4 s% y
void main(void) // 主程序6 D8 R- x; @2 K- N, v9 D( ?# O
{
9 H k E0 h/ Q- z7 v, F* Ounsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?" Y7 I3 P0 I2 Z5 T( a
unsigned char ledi; //用来指示显示顺序4 `7 w" b3 u c# I& m
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟: T. `) m; @5 }7 T& M
RCAP2L =0x00;
~% w" i8 w7 x! M6 J) Z* [TR2=1; //启动定时器
# I; i4 Y c; SET2=1; //打开定时器2中断1 Z1 ^. V% N" Q2 i1 O% o d: i( V
EA=1; //打开总中断5 y. I7 P* @: z: f' q! P
while(1) //主程序循环- j: c+ k& n4 p+ V2 v- D
{
3 i0 }% R" t0 \! s$ |! Fif(ldelay) //发现有时间溢出标记,进入处理7 D& ]0 f" M! F! I3 G
{
1 [6 A# N6 {% `+ F: E9 G( Tldelay=0; //清除标记
& I5 T; `$ |8 q- z1 _1 EP1=ledp[ledi]; //读出一个值送到P1口
7 H* _2 T( o+ h( K, }ledi++; //指向下一个
! w( I. b4 F6 _5 N+ X0 V- ]# vif(ledi==4)ledi=0; //到了最后一个灯就换到第一个
8 y# E; F9 U5 v/ I; p" g; P) A( v}
! O" K0 n+ ?0 B: S' p& G* H}
/ u+ [( ^% W; N" t}% V( A: y/ a2 t! \8 A
//定时器2中断
6 A0 p* D1 G% y+ J; G- c$ x! F3 dtimer0() interrupt 59 R; C5 ~% f5 F! s
{
4 b4 w* l& ^9 i5 \& o5 Dstatic unsigned char t;0 W8 ]- N/ H0 P* J' P
TF2=0;
" {# Z2 o" }/ s7 J3 ~0 wt++;
3 [7 |: C# }! o2 sif(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
" N; k2 c: x1 B8 u2 P# g/ r0 P{$ _) _" l5 H3 g
t=0;3 a/ h4 m7 f; E, u8 E5 s- A/ Y
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
0 u; L3 W' L/ w}
& s2 e$ B3 X4 T0 K6 w}
# S: t( m$ Q3 W& y3 b7 ]) i$ y×××××××××××××××××××××××××××8
7 _; C. _' k. D$ B# a7 @/ r就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把
$ f4 _5 B* d; l+ Z# \! g4 ~ledi++; //指向下一个7 v5 V5 y+ N: _6 ?
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个 ) _9 s% L( J, Y/ L8 ?, t; V- }
改为
% j% [6 q1 A3 L) c' Hledi--; //指向下一个' S9 I7 H9 W( A! s0 b# d* V! }
if(ledi==0)ledi=4; //到了最后一个灯就换到第一个
$ \: Y% g3 i E* g3 p* Z只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了
9 L2 D; k( E4 Q6 c. u, W2 x) q% [' F% J" f x: K) ]
[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|