QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下
& w- F( l+ Q' a; ]程序:
% G! q+ b. n7 f0 P' @4 [8 b1 [#define uchar unsigned char //定义一下方便使用
9 M* u" n5 `" h! `  O' d, f* f9 W#define uint unsigned int. x( D: p+ v5 S, z, N
#define ulong unsigned long) G/ q+ y; N6 y. Y# Z( l) g
#include <reg52.h> //包括一个52标准内核的头文件5 ^' O2 T  r' Z# q% d6 v5 e8 @
sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了
( h2 m% Y5 Z/ l0 O' E4 v% K' ~* `# Usbit P11 = P1^1;
" I; H: c4 [' `9 ~8 u4 [1 nsbit P12 = P1^2;
+ G$ |) r2 T! F4 O5 C! Jsbit P13 = P1^3;/ ^3 t' x* J( z8 f( G/ J" j5 M
bit ldelay=0; //长定时溢出标记,预置是0
5 Q( ?1 \+ k0 X& {% y/ F//char code dx516[3] _at_ 0x003b;这是为了仿真设置的- M3 D, X3 f- L7 `+ Q( `/ }
//定时器中断方式的跑马灯
* G% T8 |% T+ u& y! v# j! Pvoid main(void) // 主程序
5 q/ D& _/ [1 n+ T; m% b) U{
$ j! B( |0 b9 ^* ]6 ]2 ^7 |6 kunsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值  这四个值改变次序后发现没有影响,怎么回事?
% X* x* D& a$ Xunsigned char ledi; //用来指示显示顺序
- g& w# X2 n7 \7 I: }1 g9 X1 D, ^' @RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟8 V" `+ e# l- `/ ]7 K
RCAP2L =0x00;
3 O7 x$ Y% D9 K* FTR2=1; //启动定时器4 ^3 C' s  A" _6 y/ z
ET2=1; //打开定时器2中断
/ t: @& W4 J2 N* c: C0 oEA=1; //打开总中断4 p2 \3 L' ^' @: c
while(1) //主程序循环; `' Z4 a* \) f
{' N+ s' q/ b5 w3 x# q
if(ldelay) //发现有时间溢出标记,进入处理
( e3 I# l9 m: h/ c{
5 N# M  e8 S9 F, kldelay=0; //清除标记/ P, Y+ l$ q0 _4 u
P1=ledp[ledi]; //读出一个值送到P1口
0 R7 o. _2 e5 b7 g) o" A1 C% Xledi++; //指向下一个
: S2 c8 ^; [3 D! Z* zif(ledi==4)ledi=0; //到了最后一个灯就换到第一个  _8 j8 i+ I( @; }: ]: m6 A
}
: I' H/ c4 N' S) X}
1 }& }: \! o3 e. s}
- Z+ k& q; m: i: y. E//定时器2中断8 Y$ h" u3 {' X# i- n  m) \
timer0() interrupt 5
7 G  q7 e" I2 n( u5 b% C{
4 A( [" @1 W- T. `( q$ }/ U3 e+ w0 Qstatic unsigned char t;% P. D2 {% @/ w4 {
TF2=0;
2 C$ J6 D5 X6 ^0 @1 ht++;# U9 a* l$ w6 [
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ4 J5 t; j) b3 |( Y5 [/ G4 O$ L! z
{# M9 n& {8 U  ], j3 }
t=0;
4 i) Y7 |) X$ h! Z. r4 ]& kldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理3 p) R6 c+ j5 U6 e, z$ [
}
" M9 {# g1 H- Q1 y: n" L! R}$ s2 \: G& r7 W; p, P
×××××××××××××××××××××××××××8
1 g+ X! h4 Y# p& N! C+ ^8 N+ L就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把
& E* r9 @. E0 {. \ledi++; //指向下一个+ g# k) @) J  t7 @. a0 n
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个   
3 a6 y6 [1 j: r" i$ j6 w( c8 R
改为8 M& M+ H/ j9 _4 F
ledi--; //指向下一个% u1 Z0 ~: S$ h( f: ]: Y
if(ledi==0)ledi=4; //到了最后一个灯就换到第一个

. i3 C+ A: N" U" B2 h只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了: I2 b$ C7 |% ]/ \

( w9 v7 I' p: I; e3 Y8 t4 }; ?[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ]
 楼主| 发表于 2007-8-27 11:02:49 | 显示全部楼层 来自: 中国江苏扬州
找到问题所在了,原来是) O, M3 T; f, Z) h. h" w
ledi++; //指向下一个
. i6 I" `( Q' {if(ledi==4)ledi=0; //到了最后一个灯就换到第一个

2 x4 b) r) W) P4 T这一块把 ledi=0; 变为{ledi=0; } 就是从右到左了,
1 t. e: |% N" F; h: x可是这个大括号{}到底起到的作用是什么呢? :o
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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