QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
我做到中断控制流水灯那一步, 作业完成不了,程序怎么改都是有问题,请了解的人指点下6 m% u# h$ o/ b' T* E/ j
程序:2 ~6 J2 v( R) x4 x/ C. Q& T8 L  m
#define uchar unsigned char //定义一下方便使用
9 ^& x9 b# K" T# n  O, q, h#define uint unsigned int+ [& A7 S* t  Z
#define ulong unsigned long
2 A5 D, r5 |3 G  Z* ]% R8 P; H1 A#include <reg52.h> //包括一个52标准内核的头文件
4 Z; K6 E, O5 z9 Q5 esbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了
5 ~, B* c; |0 k4 `8 ^sbit P11 = P1^1;
, L! `# x! O4 }% [) l- A* ]: Isbit P12 = P1^2;! S# o/ N! S. a- F
sbit P13 = P1^3;
$ i- v3 Z# J8 }9 Ubit ldelay=0; //长定时溢出标记,预置是0; @& c5 S! [, @2 f) z) Z- D. G
//char code dx516[3] _at_ 0x003b;这是为了仿真设置的
& W5 H( C' z+ s, \" M//定时器中断方式的跑马灯
9 z9 r2 N2 v" q! l9 ]6 h' D, mvoid main(void) // 主程序( C) a" o% T) {: D
{
* V! Y! F6 d! `unsigned char code ledp[4]={0xf7,0xfb,0xfd,0xfe};//预定的写入P1的值  这四个值改变次序后发现没有影响,怎么回事?. u9 L. l$ b" R/ o1 r
unsigned char ledi; //用来指示显示顺序
4 U1 Y. F0 O/ v( b: t- aRCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
0 k! Q, _6 k+ z; H2 a1 G( w9 hRCAP2L =0x00;" m8 ~, Z5 _1 z- C
TR2=1; //启动定时器9 _: J6 ]2 `' J; f. g  r, t
ET2=1; //打开定时器2中断
4 o# J: Z. Z3 H+ V2 R6 zEA=1; //打开总中断
0 W8 ^: w7 n1 B# U- Rwhile(1) //主程序循环  C! p6 I6 a  x
{
$ `7 L* A3 Y1 ~if(ldelay) //发现有时间溢出标记,进入处理
  E/ e9 |) V' [  a- ~1 n8 P{
, A1 j( _+ ?# J; A6 Ildelay=0; //清除标记  N  T/ T' N# J
P1=ledp[ledi]; //读出一个值送到P1口 0 a* _# K; }8 N! q$ x, Y: f
ledi++; //指向下一个
: i3 n% d7 c! r3 \: f- }( g& Yif(ledi==4)ledi=0; //到了最后一个灯就换到第一个
* P8 `0 ]3 I$ S4 F
}- B5 I' k; Z0 h% @( z
}5 L; p* j  ]; m' G8 n$ I% F$ o
}4 W0 F6 Y5 ?* E1 d8 K+ O5 J. X4 }
//定时器2中断" {- E2 H. p2 [; t, z! B
timer0() interrupt 5
" q# `0 m+ i% U1 l9 A1 ?{
* |2 C/ ?; C, x' u6 Dstatic unsigned char t;
* R! ~9 g% _& kTF2=0;
) ?8 r! g, f; u+ U( ?! Dt++;1 {+ d' F$ W& M$ V% Y4 O
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ. ~& O1 T( l* I  @0 `6 L# P' J
{
! b* B  |  }* d) et=0;! S0 s4 E9 L6 |# E+ @
ldelay=1;//每次长时间的溢出,就置一个标记,以便主程序处理( C/ S) s, F  O! P0 ?5 A
}# J* m9 k" V: a8 B# `
}+ G: S3 L$ c" M. t5 z% w1 @7 c0 t9 _
×××××××××××××××××××××××××××8
. v/ z7 p$ \5 z) r4 p就是那个切换的地方(蓝色标记), 作业要求让灯自右向左显示,我改了好多地方总是不能成功, 我把; w' {1 ^* }6 X( _6 T0 Z
ledi++; //指向下一个5 I4 h1 f5 A- B% P( Z
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个   
. `, a5 a  s* {: d7 p) ?
改为
8 l# d! O; k/ `! l9 Zledi--; //指向下一个$ E8 e8 |4 O$ S4 W" ]! n7 S6 S/ ]
if(ledi==0)ledi=4; //到了最后一个灯就换到第一个
0 L* t  P) O: ^' Z6 I! G
只有第一个灯(P13)亮, 让后就是全亮,再好长时间都是这样没反映了, 应该如何改动? 实在想不出了,请了解的人给指点下,谢谢了
% y, @+ ^! ]* g: `" X) `% U, G$ W
[ 本帖最后由 sinkayu 于 2007-8-27 10:46 编辑 ]
 楼主| 发表于 2007-8-27 11:02:49 | 显示全部楼层 来自: 中国江苏扬州
找到问题所在了,原来是* J5 t5 I/ y8 ]
ledi++; //指向下一个- O' V! U, m& \/ a
if(ledi==4)ledi=0; //到了最后一个灯就换到第一个

* e' y1 [1 u: q9 n这一块把 ledi=0; 变为{ledi=0; } 就是从右到左了,
3 Q% X6 ?/ Y, v, T8 P可是这个大括号{}到底起到的作用是什么呢? :o
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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