找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1328|回复: 3
打印 上一主题 下一主题
收起左侧

请教单片机流水灯程序问题

[复制链接]
跳转到指定楼层
楼主
ID:891939 发表于 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开发板

请问这是哪有问题?

先谢了

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:195446 发表于 2021-3-15 01:31 | 只看该作者
软件仿真只能参考,与实际运行有时是有差异的,而且这种差异往往很难解释原因,还是以实际运行为准,不必纠结仿真差异。
回复

使用道具 举报

板凳
ID:213173 发表于 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);
        }
}   
回复

使用道具 举报

地板
ID:380037 发表于 2021-3-15 12:39 | 只看该作者
应该是第八灯P07端口吧?赋值时就点亮第一灯了,进入for后就给第一灯延时,然后点亮第2灯P01了,也就是0对应点亮2灯P01,6点亮8灯P07端口;然后7给8灯延时后点亮1灯,加1=8后跳出赋值又点亮1灯重复循环,所以正常啊;延时放在前面是在第二次循环中给上一个灯延时,也就是从一灯开始循环;放在后面是灯点亮后延时,也就是从2灯开始循环;(第一灯赋值亮一下就转2灯,时间太短应该人眼看不到)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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