我们前边学了点亮一个 LED 小灯,然后又学了 LED 小灯闪烁,现在我们要进一步学习如何让8个小灯依次一个接一个的点亮,流动起来,也就是常说的流水灯。先来看8个 LED 的核心电路图,如图4-12。
图4-12 LED 小灯电路图
通过前面的课程,我们可以了解到控制引脚 P0.0 经过 74HC245 控制了 DB0,P0.1 控制 DB1...... P0.7 控制 DB7。我们还学到一个字节是8位,我们如果写一个 P0,就代表了 P0.0 到 P0.7 的全部8个位。比如我们写 P0 = 0xFE;转换成二进制就是 0b11111110,所以点亮 LED 小灯的程序,实际上我们可以改成另外一种写法,如下所示。
#include
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main(){
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
P0 = 0xFE; //向 P0 写入数据来控制 LED 小灯
while (1); //程序停止在这里
}
通过上边这个程序我们可以看出来,可以通过 P0 来控制所有的8个 LED 小灯的亮和灭。我们下边要进行依次亮和灭,怎么办呢?从这里就可以得到方法了,如果想让单片机流水灯流动起来,依次要赋给 P0 的数值就是:0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F。
在我们的 C 语言当中,有一个移位操作,其中<<代表的是左移,>>代表的是右移。比如 a = 0x01<<1;就是 a 的结果等于 0x01 左移一位。大家注意,移位都是指二进制移位,那么移位完了,本来在第0位的1移动到了第一位上,移动完了低位是补0的。所以 a 的值最终是等于 0x02。
还要学习另外一个运算符~,这个符号是按位取反的意思,同理按位取反也是针对二进制而言。比如 a = ~(0x01); 0x01 的二进制是 0b00000001,按位取反后就是 0b11111110,那么 a 的值就是0xFE 了。
学会了这两个符号后,我们就可以把流水灯的程序写出来,先把程序贴上。
#include
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main(){
unsigned int i = 0; //定义循环变量 i,用于软件延时
unsigned char cnt = 0; //定义计数变量 cnt,用于移位控制
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
while (1){ //主循环,程序无限循环执行该循环体语句
P0 = ~(0x01 << cnt); //P0 等于1左移 cnt 位,控制8个 LED
for (i=0; i<20000; i++); //软件延时
cnt++; //移位计数变量自加1
if (cnt >= 8){ //移位计数超过7后,再重新从0开始
cnt = 0;
}
}
}
程序中 cnt 是 count 的缩写,计数的意思,是非常常用的一个变量名称。当 cnt 等于0的时候,1左移0位还是1,那么写成二进制后就是 0b00000001,对这个数字按位取反就是 0b11111110,亮的是最右边的小灯。当 cnt 等于7的时候,1左移7位就是 0b10000000,按位取反后是 0b01111111,亮的是最左边的小灯。中间过程大家可以自己分析一下了。
流水灯结束后,关于小灯的讲解,就暂时告一段落了,后边还有小灯的高级用法,我们到时候再详细讲解。
关键字:单片机 LED 流水灯程序
引用地址:
单片机 LED 流水灯程序
推荐阅读最新更新时间:2024-03-16 15:45
关于LED照明产品色彩质量中色彩清晰度的定性研究
人类的 照明 技术从第一个灯泡发明到现在已经经过了135年的发展,光源的种类也从白炽灯、荧光灯、气体放电灯发展到新一代的 LED照明 光源。照明技术的发展有三个重要的指标,第一个是光效,第二个是寿命,第三个是显色指数。对于前两个个指标来说,随着照明技术的发展不断提高的,但是第三个指标显色指数并没有随着照明计算的发展而不断提高,主要原因是受限与显色指数这个指标的理论定义。 国际照明委员会CIE对于显色性CR(colorrendering)的定义是 : 与标准的参考光源相比较,一个光源对物体颜色外貌所产生的有意识和无意识的效果 。照明行业目前只有一个普遍接受的评价显色性的方法--显色指数CRI(colorrenderin
[电源管理]
基于MCU与DSP的双机压电捷联惯导系统
摘要 以压电陀螺及压电加速计作为惯性器件的惯性导航/制导系统,具有成本低、质量轻、抗冲击、可靠性高等优点.是惯性导航一直研究的解决方案。文章介绍基于TI公司TMS320C5410实现的压电捷联惯导系统的平台.论述系统的硬件与系统组成和设计,详细说明DSP系统中。HPI接口、串口发送数据以及程序加载自举等的使用与实现方法。
关键词 压电捷联惯导系统 DSP 捷联姿态计算
引 言
近年来,广大科研工作者研究了各种减小压电捷联惯导系统的误差方法,使压电惯性器件的精度得到了极大的提高 .本文介绍了一种实用的基于DsP实现的压电捷联惯导系统方案。
1 系统的硬件设计
整个压电捷联惯导系统分为三个部分:压电惯性组合部分;由ADS12
[应用]
关于51单片机不能正常起振的原因
如何确定晶振正常起振? 1、判断方法很多,用示波器看波形是最直接的,用数字万用表的电压档测电压也行,因晶振波形的占空比为50%,所以测得的平均电压为1/2Vcc左右,对于51单片机,在使用外置程序存储器的时候还可以测PSEN引脚或P0口引脚的电压或波形,只有晶振电路正常工作,那些引脚才会有信号输出,但现在很少采用片外扩展存储器,所以测晶体两端的电压或波形即可,只是晶振电路设计不良时,测试设备的引入有可能导致停振。 2、晶体两端的电压差不是平均电压差,虽然事实上因外电路的影响,晶体两端的电压可能会有差别,但这不是判断晶振是否起振的依据,也不是晶振电路正常工作的条件。至于一高一低没有工作是指一端为Vcc或接近Vcc,另一端为0
[单片机]
红外自控LED节能灯具设计方案探索
自《LED 照明灯具与传感器技术》一文发表以来,不少读者询问如何使用红外传感器设计LED 节能灯具。今就此红外自控LED 节能灯具设计方案进行探索。红外自控LED 节能灯具系统方案红外传感器输出的信号很小,必须加以放大才能使用,因此红外自控 LED节能灯具系统方案设计思路如图1 所示,将红外传感器的微弱信号通过一个四运放(LP2902M)的仪表放大器放大和比较,经CD4538 多谐振荡器组成的计时器电路,再经一大功率三极管驱动继电器实现LED 电源的开闭,由LED 驱动电源去点亮灯具中的LED 光源或LED 光源阵列。电原理图如图2 所示。
[电源管理]
MCU SOURCE FILE_键盘
#include atmel/AT89X52.H #include intrins.h #define uchar unsigned char #define uint unsigned int #define cmd P0 //定义LCM的数据接口,请根据实际情况修改 #define lcmbusy P0_7 //定义LCM数据接口的第8位所在的端口,请根据实际情况修改 #define RS P3_4 //定义LCM的RS引脚所在的端口,请根据实际情况修改 #define RW P3_3 //定义LCM的RW引脚所在的端口,请根据实际情况修改 #define EN P3_2 //定义LCM的EN引脚所在的端
[单片机]
51单片机NEC红外遥控器解码
【前言】 红外遥控器常用的调制制式主要分为两种,这里主要讲解以NEC调制方式的遥控器解码过程。 废话不多说,直接上时序图!( 更多详细资料自行查询) 总时序图: 前导码: ' 0 ' 和 ' 1 ' 编码表示: 【解码思路】 -----1、 使用定时器计算高低电平的时间 -----2、 使用数组存放一组完整的电平时间编码 -----3、 计算电平的时长 -----4、 组合数据,获得编码值,存放于数组 -----5、 LCD1602管显示 【编写程序】 /*-------------------------------------------------------- 程序功
[单片机]
基于89C51时钟电路的设计与制作
随着电子技术的飞速发展,单片机的使用率越来越高。教学之余,为了激发学生对51单片机的学习兴趣,我利用89C51制作了一款电子时钟,经验证这款电子时钟简单实用,以至于班上的每个同学都制作一款。由于51系列单片机机展小巧、程序编写简、功能强大、价格便宜等优点,由51单片机制作的小型智能产品越来越多,也是电子技术相关专业学生毕业设计的首选芯片(见图1)。 1 电路设计流程框图(见图2) 2 基于89C51时钟电路的方案及原理 基于89C51时钟电路主要由主要由微处理器电路、LED数码管显示电路、键盘电路、显示驱动电路、时钟模块、电源电路等组成。89C51的管脚及技术细节可以查阅有关手册。电路模块的基本工作过程是: (1)显示
[单片机]
基于单片机的交通灯信号控制器设计(含源程序和电路图
设计一个基于单片机的交通灯信号控制器。已知东、西、南、北四个方向各有红黄绿色三个灯,在东西方向有两个数码管,在南北方向也有两个数码管。要求交通灯按照表1进行显示和定时切换,并要求在数码管上分别倒计时显示东西、南北方向各状态的剩余时间。 表1 交通灯的状态切换表 南北方向 东西方向 序号 状态 序号 状态 1 绿灯亮25秒,红、黄灯灭 1 红灯亮30秒,绿、黄灯灭 2 黄灯亮5秒,红、绿灯灭 3 红灯亮30秒,绿、黄灯灭 2
[工业控制]