标题: 请教单片机流水灯程序问题 [打印本页]

作者: xxx1949    时间: 2021-3-14 21:37
标题: 请教单片机流水灯程序问题
源码如下:
#include"reg52.h"
#include<intrins.h>

typedef unsigned long u32;
typedef unsigned char u8;

void delay(u32 i)
{
        while(i--);        
}
        
u8 led,j;

void main()
{
        while(1)
        {        
                P0=0xfe;
                for(led=0;led<8;led++)
                {
                        delay(10000);
                          j=~P0<<1;
                        P0=~j;
                        //delay(1000);
                }
        }               
}
分析后发现:
1、第七灯如不加注释掉的语句应该根本看不到亮就会转至第一灯,但下载后它却能正常工作。如果减少循环次数可以和分析的一样,最后的灯看不到亮就转第一灯。
2、软件模拟时parallel port 0会有多灯同时亮的情况。
用的是普中双核a6开发板

请问这是哪有问题?

先谢了


作者: mffhxa    时间: 2021-3-15 01:31
软件仿真只能参考,与实际运行有时是有差异的,而且这种差异往往很难解释原因,还是以实际运行为准,不必纠结仿真差异。
作者: wulin    时间: 2021-3-15 06:17
首位也得延时,循环只能移位7次。
#include"reg52.h"
#include<intrins.h>

typedef unsigned long u32;
typedef unsigned char u8;

void delay(u32 i)
{
        while(i--);        
}
        
u8 led,j;

void main()
{
        while(1)
        {        
                P0=0xfe;
                delay(10000);
                for(led=7;led>0;led--)
                {
                        j=~P0<<1;
                        P0=~j;
                        delay(10000);
                }
        }
}
也可以这样写
#include"reg52.h"
#include<intrins.h>

typedef unsigned long u32;
typedef unsigned char u8;

void delay(u32 i)
{
        while(i--);        
}
        
//u8 led,j;

void main()
{
        P0=0xfe;
        delay(10000);
        while(1)
        {      
                P0=P0<<1|0x01;
                if(P0==0xff)
                        P0=0xfe;
                delay(10000);
        }
}   
作者: wlefa    时间: 2021-3-15 12:39
应该是第八灯P07端口吧?赋值时就点亮第一灯了,进入for后就给第一灯延时,然后点亮第2灯P01了,也就是0对应点亮2灯P01,6点亮8灯P07端口;然后7给8灯延时后点亮1灯,加1=8后跳出赋值又点亮1灯重复循环,所以正常啊;延时放在前面是在第二次循环中给上一个灯延时,也就是从一灯开始循环;放在后面是灯点亮后延时,也就是从2灯开始循环;(第一灯赋值亮一下就转2灯,时间太短应该人眼看不到)




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1