前言:51系列单片机硬件驱动

入门基础

流水灯是第一个单片机程序,或者说是最简单的单片机程序,但是里面蕴含了一个最基本的原理:用数据直接控制外设,小小的led灯即是数据的最直接体现。

目录

1.C语言移位指令实现连续点亮;

2.C51库函数实现循环点亮;

3.万能方法---硬写入数值并延时;

4.C语言掩码实现连续点亮;

5.C语言实现循环点亮

6.连续亮灭 


实验准备:

实验板P1口连接8个led小灯的阴极,共阳极接法,有限流电阻10kΩ。图略

1.C语言移位指令实现连续点亮

#include<reg52.h>
typedef unsigned int u16;    //typedef定义数据类型
void delay(u16 i);int main(void)                //主函数
{int j;while(1){for(j=0;j<7;j++){P1=0xfe<<j;delay(50000);}}}void delay(u16 i)            //延时函数
{while(i--);
}

说明:把输出口赋值和移位指令放一起,每次都从头开始。

效果:点亮第一个led;点亮1,2号led;点亮1,2,3号led。。。依次进行,每次延时约0.5ms

自动循环点亮。

2.C51库函数实现循环点亮

#include<reg52.h>            //添加库函数支持,可以调用左循环移位函数_crol_
#include<intrins.h>            //因为要用到左右移函数,所以加入这个头文?
typedef unsigned int u16;
void delay(u16 i);void delay(u16 i)
{while(i--);
}int main(void)
{int j;P1=0xfe;delay(50000);                //给初值添加延时,不然只闪一下while(1){for(j=0;j<7;j++)        //循环移位,和j值已经无关{P1=_crol_(P1,1);    //循环移位delay(50000);}}}

说明:每次延时后只点亮一个led灯,依次是1号led,2号led。。。。和方法1有区别

3.万能方法---硬写入数值并延时

#include<reg52.h>
typedef unsigned int u16;
void delay(u16 i);void delay(u16 i)
{while(i--);
}int main(void)
{P1=0xfe;delay(50000);P1=0xfd;delay(50000);P1=0xfb;delay(50000);P1=0xf7;delay(50000);P1=0xef;delay(50000);P1=0xdf;delay(50000);P1=0xbf;delay(50000);P1=0x7f;delay(50000);while(1);
}

说明:这种办法当然看起来最笨拙了。但是您有没有发现,不管你想让灯亮几个,用什么顺序亮,都可以用这个最笨拙的办法去实现(如果想不到移位循环什么的)。为什么要写得这么麻烦,原因有二,一是因为突出了单片机的核心思想,给端口一个1或者0,就会按照人的思路去走。二是因为看见有个同学在问,怎么让流水灯从外侧向内侧亮,如果把main()函数改一改就会有所发现了

int main(void)
{P1=0x7e;delay(50000);P1=0xbd;delay(50000);P1=0xdb;delay(50000);P1=0xe7;delay(50000);P1=0xdb;delay(50000);P1=0xbd;delay(50000);
}

是不是想玩什么花样的led灯,都能写出来(虽然很麻烦。。。)

4.C语言掩码实现连续点亮

#include<reg52.h>
typedef unsigned int u16;
void delay(u16 i);int main(void)
{int j;while(1){for(j=0;j<7;j++){P1&=~(1<<j);delay(50000);}P1=0xfe;}}void delay(u16 i)
{while(i--);
}

说明:和方法1含义一样,用掩码给字节写入数据,是典型的C语言方法。

led流水灯是51单片机的起点,从这里认识到通过数据操作控制硬件的概念

5.C语言实现循环点亮

int main(void)     //C语言自身的循环移位
{P1=0xfe;delay(50000);while(1){P1=P1<<1|P1>>7;     //位或符号不是序列点,P1中途不发生变化delay(50000);}
}

6.连续亮灭 

方法1的加强版,反复的移位实现不同效果

#include<reg52.h>
typedef unsigned int u16;
void delay(u16 i);void delay(u16 i)
{while(i--);
}int main(void)
{int j;while(1){for(j=0;j<8;j++){P1=0xfe<<j;delay(50000);}for(j=0;j<8;j++){P1|=0x80>>j;delay(50000);}}
}

 --------------------2022.3.20update-------------------------------------------------------------------------------------

抽象1:流水灯的实现包括写入数值和延时两个方面(方法3是最直接体现),要实现灯光移动的视觉效果,则加上移位。为什么要这样解释到最细,显得啰嗦,因为对初学编程的人来说,能像搭积木一样理解程序,会比较友好。比如P1=0xfe<<j;表示写入数值,外面加上for(j=0;j<8;j++)表示移位,或者写成

 while(1){P1=0xfe;delay(50000);for(j=1;j<=7;j++){P1=0xfe<<j;delay(50000);}for(j=0;j<8;j++){P1|=0x80>>j;delay(50000);}}

更直观,赋值,移位,延时一目了然。 会写了之后,改成下面那段代码更简洁。

抽象2:流水灯效果常通过移位来实现。移位写法不同,效果不同。

一.其中‘连续亮起’的含义是每次写入0或者1(由led灯接法确定,本例共阳极接法写入0),并且移动1位(或n位)。具体代码由循环(for循环或者while循环都可以)加每次移动1位(或n位)完成。这种方法每次给出的初值是确定的,例如移动1位初值是0xfe和0x80。 以上述方法5为例,如果main函数改成

int main(void)
{int j;while(1){for(j=0;j<8;j+=2){P1=0xfc<<j;delay(50000);}for(j=0;j<8;j+=2){P1=0xc0>>j;delay(50000);}}
}

可以发现如果每次移动2位,初值需要修改成0xfc和0xc0。

循环灭led灯有一个小bug,修改如下:

int main(void)
{int j;while(1){for(j=0;j<8;j+=2){P1=0xfc<<j;delay(50000);}for(j=0;j<8;j+=2){P1|=0xc0>>j;        //修改后达到逐渐灭灯的效果delay(50000);}}
}

产生的原因:右移时补0或者补1是有可能不同的,如果需要逐渐灭灯的目的,需要持续写入1,所以做了修改,前面的代码做了相应修改。

二.“循环点亮”的含义是每次只有一个灯的亮灭发生变化,用循环移位实现,本例中对应方法2,直接调用库函数。(C语言也可以写循环移位,但俺写了以后没成功实现)。因为直接参加循环移位,所以可能把初状态单独列出来写并延时。

另:谈到C语言的移位,在后面的接收字节数据和发送字节数据中也常常用到,被称为“移位或”。在硬件通信中,最基本的单位是“位”,而对于计算机来说,最基本的单位是“字节”。所以需要将位整合成字节实现通信。思路是接收变量所在的字节移动1位(左移或右移根据情况而定),与将要接收或发送的位相或,外部加循环(for和while都可以)8次,得到一个字节。具体代码见后续

-----------------------------------------------------------2022.4.6Update------------------------------------------------

再次发现用C语言移位指令实现连续移位最方便,下面第j位

形如:  P1&=~(1<<j);   //写0

P1|=1<<j;         //写1

加上循环指令,则可以实现连续写入。

一个一个写入的,就用循环移位指令

单片机C51之1:流水灯相关推荐

  1. c语言编程流水灯与交通灯实验,C51单片机实验报告_流水灯_交通灯_定时器_双机交互_时钟.doc...

    C51单片机实验报告_流水灯_交通灯_定时器_双机交互_时钟 学 号: 班 级: 自动化10班 姓 名: 张 指导老师: 胡 2012.12 单片机核心板实验要求 流水灯实验 实验目的: 简单I/O引 ...

  2. c51单片机学习笔记-LED流水灯实验

    目的:实现 LED 流水灯,只需循环让 D1-D8 指示灯逐个点亮. 方法:点亮 D1 且把 D2-D8 熄灭,延时一段时间后再点亮 D2 且把 D1. D3-D8 熄灭,延时一段时间后再点亮 D3 ...

  3. 51单片机-LED模块-来回流水灯

    51单片机-LED模块-来回流水灯 1. 视频 哔哩哔哩视频地址: https://www.bilibili.com/video/av89552821 51单片机-LED模块-来回流水灯 2. 文件 ...

  4. 51单片机 74HC154译码器制作流水灯+Proteus仿真

    51单片机 74HC154译码器制作流水灯+Proteus仿真 Proteus仿真 实例代码 #include <reg52.h> #define uint unsigned int #d ...

  5. 51单片机AT24C02写读流水灯实例+Proteus仿真

    51单片机AT24C02写读流水灯实例+Proteus仿真 Proteus仿真 这个流水灯的状态是通过读取AT24C02地址中的数值来改变的.(有点废AT24C02) 程序代码 #include &l ...

  6. 51单片机通过CD4051实现流水灯效果+Proteus仿真

    51单片机通过CD4051实现流水灯效果+Proteus仿真 Proteus仿真效果 CD4051 CD4051是一款八选一模拟开关电路,内置3个地址选择端(A0-A2),低有效的使能输入端( E), ...

  7. 设计分享|单片机左右来回的流水灯

    目录 具体实现功能 设计介绍 51单片机简介 设计思路 设计内容 仿真图(protues8.7) 程序(Keil5) 具体实现功能 51单片机控制8路流水灯左右来回移动! 设计介绍 51单片机简介 5 ...

  8. 51单片机学习笔记5 流水灯实现及蜂鸣器控制

    51单片机学习笔记5 流水灯实现及蜂鸣器控制 一.流水灯 1. 硬件电路 2. 代码实现 (1) 点亮一个LED的基本操作 (2) 使用算术左移实现流水灯 (3) 使用库文件左移函数 二.蜂鸣器 1. ...

  9. c51语言花样流水灯汇编程序,基于51单片机的各种花样的流水灯c51程序

    /*----------------------------------------------- 功能:流水灯对称移动闪烁(双闪烁) -------------------------------- ...

  10. 【造物笔记】基于51单片机的心形流水灯

    记录一下首个独立完成的小项目(虽然没有什么技术含量) 硬件方面:入门级的单片机点灯电路 软件方面:主要利用了c语言的位操作 整个项目的下载链接放在了文章最后 一.成品展示 正面 反面 二.元器件清单 ...

最新文章

  1. libusb开发指南
  2. gridview DataFormatString
  3. 手机调用系统的拍照和裁剪功能,假设界面有输入框EditText,在一些手机会出现点击EditText会弹出输入法,却不能输入的情况。...
  4. spring学习(48):自动装配中定义的bean的作用域
  5. java 找不到符号 con_我的java程序运行时,提示找不到符号,求解!
  6. Docker如何删除一个镜像
  7. Dropout与过拟合抑制
  8. python字符串常用函数-Python字符串常用函数详解
  9. ubuntu 启动进入initramfs错误解决办法
  10. ip地址与整数的相互转化
  11. J2ME Canvas切换闪屏问题解决
  12. 信息系统项目管理师(2022年) —— 第 11 章 项目风险管理
  13. 【Try to Hack】masscan
  14. Stacer ---- Linux系统优化和监测工具
  15. XJOI字符串的大小关系1级19段
  16. c语言程序 强制关机程序,怎么用C或者C++编写一个电脑强制关机程序
  17. linux查看系统版本
  18. 选择ip代理软件要看那几点?
  19. [转]解析CSS设置默认字体样式
  20. 知乎上的一道问题:出家人怎么解决性欲?

热门文章

  1. unity 导入 obj 模型 和 json 数据
  2. 【致远FAQ】致远OA启动不起来了(下集)
  3. Windows11系统中便签小工具在哪 便签使用方法简单图解
  4. Linux 中最好的 CHM 文件阅读器
  5. mui 与vue 混合开发的可行性分析
  6. 华擎J3455-ITX黑群晖6.2.3-25426搭建
  7. 看看大疆的C语言面试题
  8. k6前级效果器怎么用_K6效果器功能说明
  9. 计算机辅助动力学第五讲作业,计算机辅助动力学第五讲作业
  10. PC端微信扫码关注公众号并登录