QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下/ v. [6 F" |2 \1 a& z$ G* s* v6 i
程序:
6 k9 Q$ K; `# b3 J/ S, x#define uchar unsigned char //定义一下方便使用* o9 S3 W- X9 }6 }0 a( i2 z1 Y
#define uint unsigned int
9 Q! U' A( e' _# A7 v& V) A#define ulong unsigned long" R  I+ t; E4 V5 Z, k" F. m) `! T
#include <reg52.h> //包括一个52标准内核的头文件$ _8 Q0 w3 O% X5 y
sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了  t% |+ ^3 F' h9 }4 Q
sbit P11 = P1^1;" e5 A5 P; T; D, n  }1 o
sbit P12 = P1^2;
( D- u. q& C$ x8 c% C5 _2 x# Gsbit P13 = P1^3;
2 ~- i; D, O* z# e! ]bit ldelay=0; //长定时溢出标记,预置是05 x- a, q4 P1 d, U# V3 t9 z
//char code dx516[3] _at_ 0x003b;这是为了仿真设置的
$ F7 ]$ c2 s# V% `( |6 t//定时器中断方式的跑马灯: m' d' C' a4 Z3 S8 Z; j4 s% y
void main(void) // 主程序6 D8 R- x; @2 K- N, v9 D( ?# O
{
9 H  k  E0 h/ Q- z7 v, F* Ounsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值  这四个值改变次序后发现没有影响,怎么回事?" Y7 I3 P0 I2 Z5 T( a
unsigned char ledi; //用来指示显示顺序4 `7 w" b3 u  c# I& m
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟: T. `) m; @5 }7 T& M
RCAP2L =0x00;
  ~% w" i8 w7 x! M6 J) Z* [TR2=1; //启动定时器
# I; i4 Y  c; SET2=1; //打开定时器2中断1 Z1 ^. V% N" Q2 i1 O% o  d: i( V
EA=1; //打开总中断5 y. I7 P* @: z: f' q! P
while(1) //主程序循环- j: c+ k& n4 p+ V2 v- D
{
3 i0 }% R" t0 \! s$ |! Fif(ldelay) //发现有时间溢出标记,进入处理7 D& ]0 f" M! F! I3 G
{
1 [6 A# N6 {% `+ F: E9 G( Tldelay=0; //清除标记
& I5 T; `$ |8 q- z1 _1 EP1=ledp[ledi]; //读出一个值送到P1口
7 H* _2 T( o+ h( K, }ledi++; //指向下一个
! w( I. b4 F6 _5 N+ X0 V- ]# vif(ledi==4)ledi=0; //到了最后一个灯就换到第一个
8 y# E; F9 U5 v/ I; p" g; P) A( v
}
! O" K0 n+ ?0 B: S' p& G* H}
/ u+ [( ^% W; N" t}% V( A: y/ a2 t! \8 A
//定时器2中断
6 A0 p* D1 G% y+ J; G- c$ x! F3 dtimer0() interrupt 59 R; C5 ~% f5 F! s
{
4 b4 w* l& ^9 i5 \& o5 Dstatic unsigned char t;0 W8 ]- N/ H0 P* J' P
TF2=0;
" {# Z2 o" }/ s7 J3 ~0 wt++;
3 [7 |: C# }! o2 sif(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
" N; k2 c: x1 B8 u2 P# g/ r0 P{$ _) _" l5 H3 g
t=0;3 a/ h4 m7 f; E, u8 E5 s- A/ Y
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理
0 u; L3 W' L/ w}
& s2 e$ B3 X4 T0 K6 w}
# S: t( m$ Q3 W& y3 b7 ]) i$ y×××××××××××××××××××××××××××8
7 _; C. _' k. D$ B# a7 @/ r就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把
$ f4 _5 B* d; l+ Z# \! g4 ~ledi++; //指向下一个7 v5 V5 y+ N: _6 ?
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个   
) _9 s% L( J, Y/ L8 ?, t; V- }
改为
% j% [6 q1 A3 L) c' Hledi--; //指向下一个' S9 I7 H9 W( A! s0 b# d* V! }
if(ledi==0)ledi=4; //到了最后一个灯就换到第一个

$ \: Y% g3 i  E* g3 p* Z只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了
9 L2 D; k( E4 Q6 c. u, W2 x) q% [' F% J" f  x: K) ]
[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ]
 楼主| 发表于 2007-8-27 11:02:49 | 显示全部楼层 来自: 中国江苏扬州
找到问题所在了,原来是  [  ]; D" _* u
ledi++; //指向下一个
. h% w+ V7 U. i, }, yif(ledi==4)ledi=0; //到了最后一个灯就换到第一个
  F( l# @' U  s% f. G( \
这一块把 ledi=0; 变为{ledi=0; } 就是从右到左了,
) \9 e5 Z& Y, p8 M  w$ z可是这个大括号{}到底起到的作用是什么呢? :o
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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