如果学习单片机,最基本的考题就是流水灯了,呵呵,可是有时候一个很厉害的工程师,还真是不好弄出来,当然,我不是工程师,可是学习51单片机也有很长时间了,回想起当初学习51的时候,一直都是没有自己的核心的东西,今天就谈谈c51循环移位的见解
记得如果你打开intrins.h(51自带的一个头文件),你会发现其中有关于定义_crol_()(字符循环左移函数)(一般我们用的多的是这个,呵呵),还有一个是_cror_()(字符循环右移函数)
可是,如果你去面试的时候,这个时候,你难道还用它自带的循环函数么?当然不能了。真是的(有时候我们自己小组出的笔试题就是流水灯,可是我却紧锁眉头,感觉很是窝囊。咳,今天就把源程序写出来。)这时候就要用到你的c语言知识了,呵呵。
假如说是共阴极数码管的话:
程序可以这样(只写主要算法):
while(1)
{
temp=0x01;
P1=temp;
delay(100); //延时100ms
for(i=1;i<8;i++)
{
temp=temp<<1;
P1=temp;
delay(100);
}
}
可是假如是共阳极流水灯的话,就得写成这样,更好些:
while(1)
{
temp=0xfe;
P1=temp;
delay(100);
for(i=1;i<8;i++)
{
P1=(temp<>(8-i);
delay(100);
}
}
看到没有,其中核心的一条语句就是 temp=temp<<1;P1=temp; 和P1=(temp<>(8-i);,其实第一个可以用第二个代替,不过对于共阴极的太过简单,直接写出来就行了,可是对于共阳极的话,就得思考思考了,先左移,然后和右移的数进行相或,这是相当经典的(8次)。呵呵,可能还有更经典的,以后有时间补充上,呵呵。
关键字:c51 循环移位
引用地址:
c51循环移位的浅谈
推荐阅读最新更新时间:2024-03-16 15:09
几种常用的模拟SPI读写一体化模块(C51)
说明: SPI接口有一个特点,即在时钟SCK的上升沿打入数据MOSI,在下降沿读入数据MISO. 片选信号CS有正负区别.在硬件上MOSI与MISO是可以短路变为SIO可读写IO的. 故SPI可为(不包括CS) 三线(SCK,MOSI,MISO)协议,两线(SCK,SIO)协议 再者,SPI一般为双向同时高速收发数据的,方向由时钟SCK的跳变沿决定。 根据以上所述,模拟SPI读写模块编制成为一体化模块是必要的。 而且调用规则只需注意读数据时要写入0xff即可。非常方便好用。 例如: res = SpiReadWrite(val);//模块写 SpiReadWrite(0xff);//模块读 对于具体器件,由于涉及到命令、地址及
[单片机]
小白自学c51笔记之独立按键
先上个单片机开发板上独立按键的图(我的有四个): 上述按键中23之间,14之间(即引脚之间距离长的)本来就是连通的,按下按键后1和2,3和4连通,如果想让按键连接两支路则可把两支路分别连到1,2或分别连到3,4(我觉得连到任两引脚都可)。 开发板原理图上独立按键模块: GND为接地即低电压,如果按键k1按下则接通相当于一条导线,那么对应的P3^1也为低电压。 抖动现象:一般持续时间为5ms~10ms 按下按键后 在程序中判断P3^1或其他三个口电压是否为低电压,即0时由于存在抖动,可能造成错误,所以要消除抖动。 为了消除抖动现象,有两种方法,一是硬件消抖,二是软件消抖。本质都是延时(这个本质是我自己方便理
[单片机]
Keil c51指针变量
单片机c语言支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer)。 1. 1. 一般指针 一般指针的声明和使用均与标准C相同,不过同时还能说明指针的存储类型,例如: long * state;为一个指向long型整数的指针,而state本身则依存储模式存放。 char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。 一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。 2. 2. 存储器指针 基于存储器的指针说明时即指定了存贮类
[单片机]
C51 用一个外部中断0检测过零脉冲,并产生脉冲
用一个外部中断0检测过零脉冲,然后用一个定时器产生一个脉冲即可。 #include reg52.h #define uint unsigned int /*宏定义*/ #define uchar unsigned char /*宏定义*/ //#define Time_5ms (0x10000-5000) //fosc=12M #define Time_100us (0x10000-100) sbit P2_0=P2^0; uint Time_5ms=10000; void time_initial(); void main() { P2_0=0; time_initial(); while(
[单片机]
Proteus C51仿真学习板6——ADC
在将ADC之前,先聊聊其前因后果——由于计算机在自动控制、检测以及其他领域广泛应用数字电子技术,而大自然的信号全是模拟信号,如果通过计算机保存自然信号呢?那么就需要ADC(模数转换器Analog-Digital Converter)来讲模拟信号转换为数字信号,这样才能存储到计算机中。 那么ADC是如何转换的呢? 对选定一个瞬间对模拟信号进行采样; 将值转换为数字量; 按照一定编码格式转换。 一个模拟信号肯定是不能采样一个点的,而是许多点集合而成。当长方形又窄又长时几乎接近竖线时,就可以很好的还原之前的波形了。用官方的话说:抽样定理——若原图的最大频率是fmax,那么采样频率要比原图的最大频率2倍还要大,这样才能准
[单片机]
Keil C51中函数指针使用注意事项
在C51 中,结构体成员采用函数指针后,发现main函数中局部变量的值被修改,开始以为堆栈溢出,后发现,单片机使用函数指针会使得调用树出错,在帮助文档中,搜索 function pointer 中,note 指明 Note: Because of the limited stack space of the 8051, the linker overlays function variables and arguments in memory. When you use a function pointer, the linker cannot correctly create a call tree for your p
[单片机]
C51单片机看门狗电路
采用89C51单片机和X25045组成的看门狗电路,X25045硬件连接图如图1所示。X25045芯片内包含有一个看门狗定时器,可通过软件预置系统的监控时间。在看门狗定时器预置的时间内若没有总线活动,则X25045将从RESET输出一个高电平信号,经过微分电路C2、R3输出一个正脉冲,使CPU复位。图1电路中,CPU的复位信号共有3个:上电复位(C1、R2),人工复位(S、R1、R2)和Watchdog复位(C2、R3),通过或门综合后加到RESET端。C2、R3的时间常数不必太大,有数百微秒即可,因为这时CPU的振荡器已经在工作。 看门狗定时器的预置时间是通过X25045的状态寄存器的相应位来设定的。如表1所示,X25
[单片机]