QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

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 编辑 ]
 楼主| 发表于 2007-8-27 11:02:49 | 显示全部楼层 来自: 中国江苏扬州
找到问题所在了,原来是
6 I: x0 }/ s( h, u5 I# U& Oledi++; //指向下一个
: y9 b% H* p7 C( y' x) kif(ledi==4)ledi=0; //到了最后一个灯就换到第一个
( @+ o8 r4 L2 u
这一块把 ledi=0; 变为{ledi=0; } 就是从右到左了,
8 s# \* B- t8 s& P( S1 D可是这个大括号{}到底起到的作用是什么呢? :o
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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