|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下0 s9 p8 n* {' ~5 M" S. {1 ~! F
程序:
# N2 F2 S& J: |4 n+ w#define uchar unsigned char //定义一下方便使用
6 m. |3 I r* H#define uint unsigned int: @% F9 |4 l8 b5 {* H# I( `
#define ulong unsigned long
- z. H7 [5 m- n1 P#include <reg52.h> //包括一个52标准内核的头文件
6 V! z! q) e& T' H4 p# U( F% Nsbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了- V& F0 K2 {2 y( [0 g0 q1 E
sbit P11 = P1^1;
X6 {+ n/ R0 csbit P12 = P1^2;
. r* J/ y9 E/ f3 _sbit P13 = P1^3;
" I7 b' `9 T6 nbit ldelay=0; //长定时溢出标记,预置是01 q# p, O$ b! G( D6 f7 {( b6 N
//char code dx516[3] _at_ 0x003b;这是为了仿真设置的5 Z; P4 ?5 V5 I- k9 x; Y" Z4 @/ |
//定时器中断方式的跑马灯2 J% Q1 b: ?- T1 s1 a9 Y
void main(void) // 主程序7 [$ h# l+ [+ d7 Z2 y/ \
{' j8 L" D0 v# P6 |% G: n( P5 L
unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值 这四个值改变次序后发现没有影响,怎么回事?
, e" G! i) v# O+ h4 K% junsigned char ledi; //用来指示显示顺序- y+ Y. f) ?% ~- v5 ]. ?* p/ B
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟3 B) w7 l6 Q# ?9 ~: Z. N) n( ^+ I
RCAP2L =0x00;: u0 G' J/ `- c- z1 ^1 Y) q
TR2=1; //启动定时器* a: I. a- M# I _' r, P; {6 f
ET2=1; //打开定时器2中断8 E0 p6 p2 [" F4 D8 h- v/ P5 [# }
EA=1; //打开总中断
( l( z6 O. @2 o) T, wwhile(1) //主程序循环
* A8 {" c' s4 a/ o{( W( r' }; `4 P& t, D) x( T
if(ldelay) //发现有时间溢出标记,进入处理
; h: t) R. P, B1 R( m, n& q. k{
5 ~' b' |9 {5 V9 w3 D. gldelay=0; //清除标记7 D( s# u" G0 I! X7 q" E
P1=ledp[ledi]; //读出一个值送到P1口
9 @( d* d3 r4 ]5 |1 Dledi++; //指向下一个
2 Z% t5 R% H6 [4 u9 xif(ledi==4)ledi=0; //到了最后一个灯就换到第一个. c7 Q" X* I' {4 E$ b! A# f
}
- |6 ?2 B, M5 i; Q# n}
1 k9 R2 Z6 s9 X. M: P}
% v' V5 l; _/ M8 a4 J( N" S2 |* r//定时器2中断# s* J( N9 Q- G3 c2 _* A( l3 b
timer0() interrupt 5
; C# O7 F* G# m5 |" e3 s& F: m/ s) q{
9 T; k2 s6 O$ X' U6 `4 y" e4 Ystatic unsigned char t;9 ]: A7 H2 O, n
TF2=0;: D" ^& S o' C! |! q: Z
t++;4 v& {/ V' o; ^( Q* }8 K9 z: Y
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ+ s' l& Z0 b" z3 G6 w6 e
{
% l n& ~1 {* Mt=0;
5 P8 V! A$ F' E6 x& I; g7 ~; c" \ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
% Z6 t) l6 V; h8 | G" E. l3 F}
/ q4 k' z0 L4 \2 f5 X5 C7 X# a% [; R}
4 K( l; c6 W: u×××××××××××××××××××××××××××8
" H1 P2 g5 h! e就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把
/ h6 J% Z1 t& { t! e$ b6 A; Vledi++; //指向下一个8 M. i- b+ w8 o( {# t1 G
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个
# u% S, w% @7 e0 y8 |改为
) v, l% T7 L" `5 h( Xledi--; //指向下一个
/ b8 j2 P7 O) uif(ledi==0)ledi=4; //到了最后一个灯就换到第一个
2 B1 v. k$ f9 Q+ w# @ K; B只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了* C H! U0 ]6 D. J* k/ p
' n+ Z) C6 H0 @; ]7 s; y3 w[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ] |
|