QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 1510|回复: 1
收起左侧

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

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

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

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

x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下
& _' y3 ?: v$ u/ f, C/ O# v! A程序:
& n0 v" `+ S. D1 f( q#define uchar unsigned char //定义一下方便使用
; h1 S; r! R0 I, m; ]3 P5 d#define uint unsigned int8 I& l( }; V7 X% r# t0 k
#define ulong unsigned long; }) U8 ~5 j! N7 O  g' X/ k
#include <reg52.h> //包括一个52标准内核的头文件! k* x% \7 o( l! d# b, D0 ?
sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了6 x4 b6 F' j/ K' o0 p
sbit P11 = P1^1;& V7 y, N" M  Q4 l. B3 y
sbit P12 = P1^2;
: d! V2 t! ~" @sbit P13 = P1^3;
. B) N( M/ ^4 A- |9 H; f; ~* Vbit ldelay=0; //长定时溢出标记,预置是0/ {3 Y' l) z8 D$ p$ v
//char code dx516[3] _at_ 0x003b;这是为了仿真设置的2 f7 E) O+ z& i! B
//定时器中断方式的跑马灯# F. z* e* Q3 }8 A1 r
void main(void) // 主程序! B& m( Y9 ^  a6 g% W* n- O
{
  f4 e3 u0 H8 o3 sunsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值  这四个值改变次序后发现没有影响,怎么回事?$ ~! ?  O# _: H. V+ A
unsigned char ledi; //用来指示显示顺序
5 r- {) d, X1 i8 }- Z0 B7 H( i$ mRCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟+ X8 L' e* E4 a- A5 g: p$ X' B
RCAP2L =0x00;
# c! ~. d2 V  N7 V( R0 ]TR2=1; //启动定时器
5 v, J6 ]: ]) T& ~ET2=1; //打开定时器2中断" f* D" L: J7 f; }! s% R- g
EA=1; //打开总中断
" z* I; V: V8 g. uwhile(1) //主程序循环, d1 l6 N5 D  `, e$ o+ Z
{+ F; [  H# S: z6 X% o/ _  |% Y
if(ldelay) //发现有时间溢出标记,进入处理
4 `' _8 U% s* H. ?! Y{9 R+ j0 O( D, e3 c+ \2 J. W+ m
ldelay=0; //清除标记
, D0 d, P3 S8 r( GP1=ledp[ledi]; //读出一个值送到P1口
0 ^+ u. R1 N' Bledi++; //指向下一个
( ^% g0 R- d) N, p# S- aif(ledi==4)ledi=0; //到了最后一个灯就换到第一个
* r0 H; R* p2 [% q9 x6 d: u
}5 v7 E1 Z8 L8 {* p+ Z: p
}! U. o' W6 P- {, K4 p- e2 j9 P
}0 U" m8 E3 T- I, C' \& W8 c9 {) p
//定时器2中断' n1 ~, C2 q/ {% ^/ z- F
timer0() interrupt 5
# Q, a4 J7 O& T, p5 ]2 F: m{
9 z% F8 L# ?- C6 {0 y2 Gstatic unsigned char t;% }2 y5 \2 p# |
TF2=0;
" `/ G) I+ @5 ~t++;
# t4 o& ~# G6 ~8 Y$ `if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
2 X2 o' ^: B% j1 A: `/ W{
% e0 G" B5 y0 g1 j- n% O% J0 Zt=0;
1 @' h) s5 z3 P3 R7 Sldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
$ w4 b$ T/ J4 C& b}! Z: F# V; ?& l4 m, W* X
}' ^/ R  c$ a$ j; U+ t( u1 d
×××××××××××××××××××××××××××8
; K/ [& c, Q$ y4 [就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把
  I- A  S7 V6 kledi++; //指向下一个* W) f. M' T  o3 {9 k- k
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个   

  P( R( i( O- i改为
0 l; |0 a0 `+ A6 D. D/ \) cledi--; //指向下一个) y* e+ @& E# @" O& I
if(ledi==0)ledi=4; //到了最后一个灯就换到第一个
' w  _0 G0 r0 G' O' V: Z
只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了# O5 a+ v3 L2 }( D+ G' _

  C3 ]0 m* T9 D2 o4 v[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ]
 楼主| 发表于 2007-8-27 11:02:49 | 显示全部楼层 来自: 中国江苏扬州
找到问题所在了,原来是
1 j& [7 a4 f4 A" d5 tledi++; //指向下一个. q9 }; {4 A3 w6 o
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个

2 |" f; p1 v) C- }2 F7 T5 S# ^这一块把 ledi=0; 变为{ledi=0; } 就是从右到左了,
$ \# s" m& o0 Q可是这个大括号{}到底起到的作用是什么呢? :o
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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