QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 1529|回复: 1
收起左侧

[讨论结束] 初学单片机遇到关于中断的问题,了解的人给指点下

 关闭 [复制链接]
发表于 2007-8-27 10:18:52 | 显示全部楼层 |阅读模式 来自: 中国江苏扬州

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下4 b5 \. ?' [5 y  v' p  w( l4 Q
程序:
* n7 g  ^% i' w$ {& ^. Z  ~) X#define uchar unsigned char //定义一下方便使用
4 B* X. {9 N0 t6 V+ A( b2 m1 T#define uint unsigned int
# U8 y  O6 H0 x3 X#define ulong unsigned long5 N/ [5 ^* ]6 D9 @* l
#include <reg52.h> //包括一个52标准内核的头文件! @& U) d' H9 D/ z; [* h3 o
sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了
2 g3 P0 j  V8 h! Esbit P11 = P1^1;
3 L  Y, G8 }) r$ b0 n3 f/ gsbit P12 = P1^2;
4 Y+ i' [. \5 `: jsbit P13 = P1^3;
  r! X# e  e. v# w' @bit ldelay=0; //长定时溢出标记,预置是0
- g# [1 F7 g, f( ~3 V/ I  ?& f//char code dx516[3] _at_ 0x003b;这是为了仿真设置的
1 Y) p! H  k9 m& [2 }9 I* N  V//定时器中断方式的跑马灯- `+ E, A! s, m
void main(void) // 主程序
+ e  R* J" M# L5 A+ s5 p! i* }+ _{7 O6 |) i" b0 T3 {8 v. f
unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值  这四个值改变次序后发现没有影响,怎么回事?/ Q6 H* Y+ `& Z) S$ z$ P$ a7 f
unsigned char ledi; //用来指示显示顺序. p: A3 W  C" n$ x$ B
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
$ I0 }" C; |; E- |. rRCAP2L =0x00;
$ P0 ^1 l) J) ~! JTR2=1; //启动定时器* [; L  Y# x; `% C0 q' k$ o5 Z
ET2=1; //打开定时器2中断. r0 j4 f) M0 v* r  R) ?: v+ `
EA=1; //打开总中断" D- t! f( d' H$ r- c# T
while(1) //主程序循环
! [4 s( F4 D. h" N{" X( E7 Z. I# m7 s  b" Q0 ?
if(ldelay) //发现有时间溢出标记,进入处理
  v. R# a" |5 M{& `+ ?4 u  ^* @' s' F* X/ R* t( J
ldelay=0; //清除标记
0 e8 @: G0 i8 I: S+ |: T! N# {P1=ledp[ledi]; //读出一个值送到P1口
" {+ O! C  X, u& B4 K% Fledi++; //指向下一个9 u: y; n3 D) I& {5 D
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个
/ S& Q7 o' y0 Y7 J
}# ^. X; c2 t" V) O) y
}* v& C5 B  D5 Y- u
}* l# j6 M. W3 l6 ^/ p
//定时器2中断
/ T4 e3 f& I5 [+ o: @" Y. |, jtimer0() interrupt 5
4 P! p9 y6 l* b2 x! _% o{+ V+ m* [% e) T# k
static unsigned char t;
& L" O" A. M/ P3 c$ R, `TF2=0;
4 B/ ^( S0 Z6 f( }8 l/ m3 ~$ Rt++;# Q$ Z4 w" t% K
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ4 C5 b1 F$ u7 M& P, m+ R; o8 Y
{
) C: U# n: B! nt=0;  _7 m4 l  D7 n
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
" @  V2 }3 \( S0 V& @}
+ Q+ c' U# e; k# e7 z$ k1 v}
1 T" r" O3 t0 h; V×××××××××××××××××××××××××××8
' ]; Y( k: Z3 N" Q! ^$ I1 }# t: N就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把( s1 |- n' B5 ]! d% ]- Y% u# C$ z
ledi++; //指向下一个7 U) X# g7 T0 q9 n1 n2 R. m
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个   
" n; F: ?  t5 i9 h7 s
改为# r0 m; N! B+ H3 B
ledi--; //指向下一个
3 Q4 |; X# x% k! p$ J! T0 s: Vif(ledi==0)ledi=4; //到了最后一个灯就换到第一个
2 W' U2 }  G) w- f+ M( h
只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了
9 m9 |! C4 Z% }+ q& b0 K0 h2 e( M+ l  g' H: O% c  |
[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ]
 楼主| 发表于 2007-8-27 11:02:49 | 显示全部楼层 来自: 中国江苏扬州
找到问题所在了,原来是' H/ g' Q! @% s* j
ledi++; //指向下一个
  r2 {( S; [' vif(ledi==4)ledi=0; //到了最后一个灯就换到第一个

& X9 H( a! j; `8 P9 O6 i这一块把 ledi=0; 变为{ledi=0; } 就是从右到左了,
* [$ ]: ^0 _+ \+ G5 P- c+ T. v可是这个大括号{}到底起到的作用是什么呢? :o
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

快速回复 返回顶部 返回列表