返回顶部

【51单片机系列】点灯大师三之流水灯

本文实现了LED D1 ~ D8 ~ D1逐个点亮,表现流水灯的效果。

LED流水灯的实现

硬件实现

使用proteus设计如下LED模块。

共阳极LED模块

软件实现

轮流点亮过程中用到了头文件intrins.h中的函数_cror_()crol_()。附录提供了intrins.h头文件中的内容及说明。

函数_cror_(val, n)将unsigned char类型的数据val循环右移n位,若n=1,即首先将数据右移一位,然后将原来bit0的数据放到bit7的位置;比如对于数据11011001调用_cror_后得到11101100

函数_crol_(val, n)将unsigned char类型的数据val循环左移n位,若n=1,即首先将数据左移一位,然后将原来bit7的数据放到bit0的位置;比如对于数据11011001调用_crol_后得到10110011

实现代码如下:

代码实现LED流水灯

仿真结果

LED流水灯仿真结果


附录

intrins.h头文件内容如下:

/*--------------------------------------------------------------------------
INTRINS.H

Intrinsic functions for C51.
Copyright (c) 1988-2010 Keil Elektronik GmbH and ARM Germany GmbH
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __INTRINS_H__
#define __INTRINS_H__

#pragma SAVE

#if defined (__CX2__)
#pragma FUNCTIONS(STATIC)
/* intrinsic functions are reentrant, but need static attribute */
#endif

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);
#if defined (__CX2__)
extern int           abs       (int);
extern void          _illop_   (void);
#endif
#if !defined (__CX2__)
extern void          _push_    (unsigned char _sfr);
extern void          _pop_     (unsigned char _sfr);
#endif

#pragma RESTORE

#endif


比较常用的是上面8个函数,作用分别如下:


空操作指令函数_nop_

  • _nop_()函数产生一个NOP指令,该函数可以用作C程序的时间比较,C51在_nop_函数工作期间不产生函数调用。

测试并清零指令_testbit_

  • _testbit_(val)函数产生一个JBC指令,该函数测试一个位,当置位时返回1,否则返回0,该函数只能用于可直接寻址的位,在表达式中不允许使用。

循环移位函数_cror__crol__iror__irol__lror__lrol_

  • _cror_(val, n)将unsigned char类型数据val循环右移n位;
  • _crol_(val, n)将unsigned char类型数据val循环左移n位;
  • _iror_(val, n)将unsigned int类型数据val循环右移n位;
  • _irol_(val, n)将unsigned int类型数据val循环左移n位;
  • _lror_(val, n)将unsigned long类型数据val循环右移n位;
  • _lrol_(val, n)将unsigned long类型数据val循环左移n位;

posted @ 2023-11-22 09:21  Zoya23  阅读(103)  评论(0编辑  收藏  举报