找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2126|回复: 7
收起左侧

我想让他循环点亮一次就行 然后 熄灭 不知道为什么就是熄灭不了

[复制链接]
ID:105616 发表于 2016-2-16 22:40 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

void delay(uint z){
        uint x,y;
        for(x=z;x>0;x--)
                for(y=114;y>0;y--);
}
void main(){
   uchar i;
        for(i=0;i<8;i++){
                P1=P1<<1;
                delay(500);
                if(P1==0){
                        P1=0xff;
                                        }
        }
        }        
我想让他循环点亮一次就行  然后 熄灭    不知道为什么就是熄灭不了
好假啊  那么大神帮我看下那里出错了  或者给个代码   点亮一次然后熄灭就够了

回复

使用道具 举报

ID:105616 发表于 2016-2-16 22:42 | 显示全部楼层
几天前我都可以点亮完然后熄灭 不知道为什么 过几天在做一个就不行了 想让他点亮一次 然后就熄灭了 不知道  他为什么一直在循环点亮
回复

使用道具 举报

ID:72781 发表于 2016-2-17 13:36 | 显示全部楼层
本帖最后由 暗光 于 2016-2-17 13:39 编辑

首先你要知道一点,单片机的程序要有一个死循环!也就是进入循环后就不再出来了,因为单片机程序没有结束,不能只运行一下就结束什么都没有了。据图代码如下,你感受一下
void main()
{
     uchar i;//进入主函数,定义变量,初始化各器件,或者执行一下功能
     while(1)//进入死循环,一直运行里面的东西不再出来,除非有中断或者用goto语句(不推荐用goto语句)
     {
         for(i=0;i<8;i++)
         {
                P1=P1<<1;
                delay(500);
                if(P1==0)
               {
                    P1=0xff;
                }
        }
    }
}//总结,你的程序因为没有死循环while(1),运行一下后,程序结束,灯的状态就不再改变,就是你看到的情况了。死循环还有for(;;)等方式
回复

使用道具 举报

ID:72781 发表于 2016-2-17 13:44 | 显示全部楼层
好吧,好像我回答的并不对症,没有仔细看问题和程序,第一眼望去就没有while(1),你这个问题原因是没有初始化P1口。然后没有进入死循环,主函数运行完会复位重新运行,上面我的回答程序是循环点亮,下面是点亮一次:
void main()
{
     uchar i;
     P0=0xfe;
     for(i=0;i<8;i++)
    {
          P1=P1<<1;
          delay(500);
          if(P1==0)
          {
               P1=0xff;
          }
     }
    while(1);
}
回复

使用道具 举报

ID:105146 发表于 2016-2-18 01:01 | 显示全部楼层
楼主没有看回帖吗?
回复

使用道具 举报

ID:105616 发表于 2016-2-18 21:00 | 显示全部楼层
暗光 发表于 2016-2-17 13:44
好吧,好像我回答的并不对症,没有仔细看问题和程序,第一眼望去就没有while(1),你这个问题原因是没有初 ...

我的那个代码是错在变量声明  我变量声明在void maim 里就是循环  变量声明在void main 前面就是点亮依次
回复

使用道具 举报

ID:72781 发表于 2016-2-18 23:49 | 显示全部楼层
vip2428 发表于 2016-2-18 21:00
我的那个代码是错在变量声明  我变量声明在void maim 里就是循环  变量声明在void main 前面就是点亮依次

是的,main函数在单片机编译中是个死循环,main执行玩了,会重新执行main,就像复位一样,所以加一个额外的死循环while(1),这样就不用让单片机重新运行了,你设计的单片机产品不是用来反复重启的,而是用来工作的。你把变量声明在main里,每次执行完都会把变量重新初始化,比如你的P1,每次都被初始化为0XFE,所以会循环点亮,这个循环不是你要的循环,是单片机执行完main重新开始了才循环的。如果你把变量声明在外面,是全局变量,编译器会分配一个字节保存这个变量的值,刚开始是0xfe,执行一次是oxfc,最后变成了ox00,最后main执行完,这个变量是不会被初始化的,所以下一次的P1初值是0x00.所以显示是只亮一次
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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