单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

本人写的单片机左移到头接着右移,右移到头再左移的花样流水灯程序,求大师指点疑问

  [复制链接]
跳转到指定楼层
楼主
zhhdok 发表于 2019-2-9 20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人纯属自学单片机一下程序是我自己写
写了一个左移到头接着右移,右移到头再左移的花样流水灯程序
以下程序运行完好,但是如果把此句”delay(100);“延时函数放在P1=~(0x01<<k);的后边然后烧到板子上8个led灯从右移动到左第八位全亮,但是从左移动到右就好像哪种电流很小的样子led等很暗很暗,这是为什么?
板子是郭天祥的TX1C
我的程序哪里有错误请高手指点或者还有什么更简洁的方法?

单片机源码如下:
----------------------------------------------------------------------
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint i,j,k,ms,m;//定义变量
void delay(ms)//延时函数
{
for(i=ms;i>0;i--)
    for(j=110;j>0;j--);
}
void main() //主函数
{
    while(1)//死循环
    {

    delay(100);//调用延时函数并赋值100
    P1=~(0x01<<k);//P1口赋初值0x01左移k位
    k++;    //k值自加1
    if(k>=8) //如果左移程序中k值大于等于8则运行右移程序,如果右移程
                //序中的m值大于等于8则k,m值归0.
        {
        P1=~(0x80>>m);
            m++;        
        if(m>=8)
            {
                k=0;
                m=0;
            }
        }
    }
}


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

使用道具 举报

沙发
xuyaqi 发表于 2019-2-10 10:17 | 只看该作者
差别在于没改前,每执行一次P1= --- 后都有 delay(100);延时;改了后,P1=~(0x01<<k);后有延时,P1=~(0x80>>m);后就没了延时。
回复

使用道具 举报

板凳
就你?呸! 发表于 2019-2-10 10:43 | 只看该作者
自己再调调看,太基础的东西
回复

使用道具 举报

地板
熇熇熇 发表于 2019-2-10 17:14 | 只看该作者
改了之后,当执行过P1=~(0x80>>m);之后,程序回到死循环开始,会执行先P1=~(0x01<<k);这相当于没有进行延时就又把P1口的信号改变了
回复

使用道具 举报

5#
wulin 发表于 2019-2-11 15:56 | 只看该作者
//利用循环左移和循环右移函数完成的花样流水灯程序
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//uint i,j,k,ms,m;//定义变量
uchar num;
void delay(uint ms)//延时函数
{
        uint i,j;
        for(i=ms;i>0;i--)
            for(j=110;j>0;j--);
}
void main() //主函数
{
        num=1;
        P1=0xfe;
        delay(500);
        while(1)//死循环
        {       
                if(num==1)
                {
                        P1=_crol_(P1,1);//循环左移
                        delay(500);
                        if(P1==0x7f)
                                num=0;
                }
                else
                {
                        P1=_cror_(P1,1);//循环右移
                        delay(500);
                        if(P1==0xfe)
                                num=1;
                }
        }
}
回复

使用道具 举报

6#
sheng7533967 发表于 2019-2-12 01:29 | 只看该作者

当执行过P1=~(0x80>>m);之后,程序回到死循环开始,会执行先P1=~(0x01<<k);这相当于没有进行延时就又把P1口的信号改变了

评分

参与人数 2黑币 +43 收起 理由
static + 8
就你?呸! + 35

查看全部评分

回复

使用道具 举报

7#
 楼主| zhhdok 发表于 2019-2-13 15:58 | 只看该作者
wulin 发表于 2019-2-11 15:56
//利用循环左移和循环右移函数完成的花样流水灯程序
#include
#include

这个程序比我的要完美,我的那个程序运行一个来回要停顿一小会虽然时间很短但是看着总有些别扭,这个很连续,再弱弱的问一哈#include <intrins.h>这个头文件是干嘛用的
回复

使用道具 举报

8#
 楼主| zhhdok 发表于 2019-2-13 15:58 | 只看该作者
xuyaqi 发表于 2019-2-10 10:17
差别在于没改前,每执行一次P1= --- 后都有 delay(100);延时;改了后,P1=~(0x01m);后就没了延时。

感谢啦
回复

使用道具 举报

9#
wulin 发表于 2019-2-13 17:56 | 只看该作者
zhhdok 发表于 2019-2-13 15:58
这个程序比我的要完美,我的那个程序运行一个来回要停顿一小会虽然时间很短但是看着总有些别扭,这个很连 ...

#include <intrins.h>这个头文件包含循环左移和循环右移函数,不用自己写了。
/*--------------------------------------------------------------------------
INTRINS.H

Intrinsic functions for C51.
Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

extern void          _nop_     (void);
extern bit           _testbit_ (bit);
extern unsigned char _cror_    (unsigned char, unsigned char);
extern unsigned int  _iror_    (unsigned int,  unsigned char);
extern unsigned long _lror_    (unsigned long, unsigned char);
extern unsigned char _crol_    (unsigned char, unsigned char);
extern unsigned int  _irol_    (unsigned int,  unsigned char);
extern unsigned long _lrol_    (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);

评分

参与人数 1黑币 +35 收起 理由
钻牛尖滴刘尖尖 + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

10#
406443550 发表于 2019-2-14 11:30 | 只看该作者
这个程序有问题,左移的操作一直在执行,不管你的k>=8的时候;全亮就是因为delay(100)停顿下,让你看到了1左移了9位,那么P1=0了,当然全亮
回复

使用道具 举报

11#
iofree 发表于 2019-2-16 16:24 | 只看该作者
zhhdok 发表于 2019-2-13 15:58
这个程序比我的要完美,我的那个程序运行一个来回要停顿一小会虽然时间很短但是看着总有些别扭,这个很连 ...

intrins.h包含几个很有用的KEILC内部函数,有点汇编语言的意思:
_crol_ 字符循环左移
_cror_ 字符循环右移
_irol_ 整数循环左移
_iror_ 整数循环右移
_lrol_ 长整数循环左移
_lror_ 长整数循环右移
_nop_ 空操作 (相当于8051 NOP 指令)
_testbit_ 测试并清零位 (相当于8051 JBC 指令)
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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