打印

这么简单的程序怎么有问题呢 我是新手

[复制链接]
1768|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
按五次led亮,再按五次led闪烁,在按五次led灭
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
uint i;
void delay (uint z)
{
  uchar x,y;
   for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}
void main()
{
IE=0x81;//开总中断,外部0中断开启
IT0=1; //下降沿触发
P1=0xff;//关闭所有LED
if(i==5)
{
P1=0xfe;
}                 //按5次 一个led发光
if(i==10)
{
while(1)
{
  P1=0xff;
  delay(1000);
  P1=0xfe;
  delay(1000);
}
} //按10次闪烁
if(i==5)
{
P1=0xfe;
}   //再按5次关闭所有led
}
void INT0_1() interrupt 0 //外部中断触发事件
{
  i++;
}
我感觉就是if那里有问题 可是又不知道 用proteus仿真 一点反应没有 电路在附件    我是新手 能说详细一些么?  谢谢了

相关帖子

沙发
bingxiangyu|  楼主 | 2012-2-7 13:05 | 只看该作者
大家帮忙看下啊

使用特权

评论回复
板凳
joyme| | 2012-2-7 13:37 | 只看该作者
自己说简单,可看起来你对程序还一无所知

1、程序没有主循环,执行完就只能“死”了
2、真要实现你说的,灭灯是应该是if(i==15),而且灭灯执行完i要重新赋值0,才能再次按你的逻辑动作
3、按你现在写程序的习惯,写大一点的程序会很惨,建议多看些写的好的程序架构

使用特权

评论回复
地板
dosculler| | 2012-2-7 14:11 | 只看该作者
晤眼睇,建议你还是一步一步调试出来。
比如按一下亮、按一下灭,再扩展出来。
跟LS所说,
1、没有主循环,也就是while(1){},当然不严格来说,main()默认会做循环,但这样不严谨,而且前面定义的也被重复执行了;
2、if(i==10)进入后,进入了一个死循环while(1)里,没有跳出来,只能重启才能跳出来,这样做是错的。解决办法是在此处的while(1)里做个判断,if(i>10)则break,跳出这个while;
3、按照你说//再按5次关闭所有led,应该是if(i >= 15),并且关闭应该是P1 = 0xFF;
    并且记得进入if(i >= 15)后,应该有一个i = 0的清零语句,不然没办法从头计数,实现i = 5, i = 10的控制;
4、最后,也是很致命的是:加松手抖动,如果不加松手抖动,起码你得把所有判断语句设置为">=",不然很容易手振,按了几下按键,导致i = 16/17/18的,这时程序就判断不了了。

总而言之,新手就一步一步来

使用特权

评论回复
5
ningling_21| | 2012-2-7 14:29 | 只看该作者
先看看别人的程序结构...

使用特权

评论回复
6
bingxiangyu|  楼主 | 2012-2-8 14:47 | 只看该作者
你好 我按照您说的 程序是好了~~可是为什么要在主程序里面加while啊 如果加了中断还能执行了么? 这是我按照您说的改的
void main()
{
IE=0x81;//开总中断,外部0中断开启
IT0=1; //下降沿触发
P1=0xff;//关闭所有LED
while(1)
{
if(i==5)
{
P1=0xfe;
}                 //按5次 一个led发光
if(i==10)
{
while(i<15)
{
  P1=0xff;
  delay(1000);
  P1=0xfe;
  delay(1000);
}
} //按10次闪烁
if(i==15)
{
P1=0xff;
i=0;
}
}   //再按5次关闭所有led
}
还有 我问一下 这个程序不能简单一些么  还有就是 如果跳出 不while(i<15) 按照你说的用 break  该怎么写啊 谢谢你了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

208

帖子

1

粉丝