公司动态
1.从零开始的单片机生活-LED篇
目录1.前言2.51单片机介绍3.LED模块介绍4.点亮一个LED5.LED闪烁6.LED流水灯7.独立按键控制LED亮灭8.独立按键控制LED状态9.独立按键控制LED显示二进制10. 独立按键控制LED移位11.后记1.前言《关于没洗杯子在便利店门口穿越异世界学习51单片机这回事》 分享学习过程和感悟。2.51单片机介绍使用普中51-实验板Keil5写代码STC-ISP进行烧录。下面介绍开发板各部分。1.动态数码管模块2.接口3.接口4.8*8LED点阵模块5.LED模块本期主角6.矩阵按键模块7.红外接收模块8.DS18B20数字温度传感器将环境温度转化为数字信号9.NRF24L01无线通信模块实现2.4GHz频段的低功耗、短距离无线数据传输10.独立按键模块11.USB转TTL下载模块12.CH340C芯片实现USB下载和串口通信功能13.AMS1117低压差线性稳压器将USB提供的5V电源转换为单片机系统所需的3.3V电压14.电源开关15.ADC模块16.存储数据17.复位按键18.蜂鸣器模块19.DS1302时钟模块为单片机系统提供精准的实时时钟RTC功能20.五线四相步进电机21.STC89C52RC单片机芯片22.接口23.74HC595D芯片扩展I/O输入/输出口控制8x8 LED点阵模块24.74HC245KA芯片:驱动数码管段选驱动点阵屏/LED双向传输控制25.扩展芯片3.LED模块介绍1LED在生活中很常见它具有单向导通性只有施加正向电压时才会发光。2在单片机上是8个LED组成的LED模块。编号由D1到D8下面是两个限流电阻左上方的P20-P27就是LED所对应的端口引脚下面看看这一部分的原理图。3从电源正极出发经过LED再串联了限流电阻接到P2引脚。4那么我们怎样控制LED呢如图LED左端电源已经提供了高电平要使LED发光那么P2端口就要输出低电平。规定输出高电平为5V低电平为0V所以当P2输出0V,电路就会导通。5那么接下来的问题就是如何控制P2输出高低电平也就是单片机怎样控制外设。首先要了解寄存器寄存器是一种存储器以8个为一组单片机通过控制寄存器来控制外部设备。CPU向P2寄存器写入0/1连接驱动器后放大电流最后就再在输入/输出端口输出高低电平1对应5V高电平0对应0V低电平。所以只需要在P2端口的寄存器写入0/1就可以控制LED。4.点亮一个LED实现如图效果只点亮D1 LED,其余LED熄灭。代码如下#includeSTC89C5xRC.Hvoidmain(){while(1){P20xF0;}}首先引入头文件因为P2定义在这个头文件中不然keil5不知道P2是什么。#includeSTC89C5xRC.H接着是主函数P2的寄存器以8位为一组刚好对应D1-D8八个LED,所以用二进制的八位分别对应不过规定低位是D1高位是D8(如下图所示)。这样 P21111 1110 就可以点亮D1了。而while(1)的循环使程序一直运行。voidmain(){while(1){P211111110;}}用十六进制表示#includeSTC89C5xRC.Hvoidmain(){while(1){P20xFE;}}5.LED闪烁先看实现效果LED闪烁我们已经点亮了LED要实现LED闪烁那么LED的状态是亮—灭— 亮—灭……代码如下P21111 1111熄灭所有的LED,也就是D1的熄灭状态。P20xFE)#includeSTC89C5xRC.Hvoidmain(){while(1){P20xFE;P20xFF;}}看起来perfect但是实际在单片机上运行这个程序时会发现D1LED一直是亮的这是因为单片机的运行速度非常快熄灭的时间太短导致看起来“没有熄灭”所以我们要加一个“延时”来实现闪烁效果。这是一个500ms的延时函数:#includeINTRINS.HvoidDelay500ms(void)//11.0592MHz{unsignedchardata i,j,k;_nop_();i4;j129;k119;do{do{while(--k);}while(--j);}while(--i);}加上延时函数之后LED闪烁的过程变成了亮—延时—灭—延时……周期为一秒的闪烁完整代码如下#includeSTC89C5xRC.HvoidDelay500ms(void)//11.0592MHz{unsignedchardata i,j,k;_nop_();i4;j129;k119;do{do{while(--k);}while(--j);}while(--i);}voidmain(){while(1){P20xFE;Delay500ms();P20xFF;Delay500ms();}}6.LED流水灯先看实现效果LED流水灯我们已经点亮了一个LED那么依次点亮D1~D8同时使其余的LED熄灭再重复这个过程就得到了流水灯。得到了以下代码#includeSTC89C5xRC.Hvoidmain(){while(1){P20xFE;P20xFD;P20xFB;P20xF7;P20xEF;P20xDF;P20xBF;P20x7F;}}对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗对吗下面是结果因为单片机的运行速度非常快快速的执行循环代码 使所有的LED看起来一直保持点亮所以必须增加延时函数。代码如下#includeSTC89C5xRC.HvoidDelay500ms(void)//11.0592MHz{unsignedchardata i,j,k;i4;j129;k119;do{do{while(--k);}while(--j);}while(--i);}voidmain(){while(1){P20xFE;Delay500ms();P20xFD;Delay500ms();P20xFB;Delay500ms();P20xF7;Delay500ms();P20xEF;Delay500ms();P20xDF;Delay500ms();P20xBF;Delay500ms();P20x7F;Delay500ms();}}7.独立按键控制LED亮灭先看实现效果独立按键控制LED亮灭首先介绍独立按键这里用到的是独立按键模块10电路原理图如图四个按键共地另一端连接P3端口要实现按下按键时LED点亮松手时熄灭就要检测按键什么时候被按下。寄存器不仅能发出指令还能检测端口的电平再放到寄存器中所以只需要读取按键对应端口的电平高低就知道了按键什么时候被按下。由于单片机上电时是高电平1按键一端是地按键按下电路导通变为低电平0。1代表按键没有被按下0代表按键被按下。我们来分析整个过程端口电平为1——按键按下——端口电平为0——点亮LED——松开按键——熄灭LED。代码如下#includeSTC89C5xRC.Hvoidmain(){while(1){if(P310){P200;}else{P201;}}}其中P31对应k1按键P20对应第一个LED(D1)。既可以像P20xFE来控制P2端口的八个寄存器也可以用P200/1来单独控制单个寄存器。8.独立按键控制LED状态先看演示独立按键控制LED状态要实现按下按键来点亮/熄灭LED 本质上是检测到按下一次按键后来LED端口在0/1之间进行切换那么就要讲到按键抖动。也就是说按键没有被按下时是高电平1按下时是低电平0松开又回到高电平1但在按下和松开的瞬间按键抖动会造成电平在0/1之间不断切换5~10毫秒后才会稳定。按下一次按键对应1——0——1的变化但是按键抖动造成随机次数的变化也就是会判断为多次按下按键所以我们要添加延时来消除抖动分别加在检测到按下和松手的时候。代码如下#includeSTC89C5xRC.HvoidDelay(intx)//11.0592MHz{unsignedchardata i,j;while(x--){_nop_();i2;j199;do{while(--j);}while(--i);}}voidmain(){while(1){if(P310)//1.检测到按键按下{Delay(20);//2.延时消除按下时的抖动while(P310);//3。等待按键松开Delay(20);//4.延时消除松开时的抖动P20~P20;//5.取反实现LED亮灭转换}}}第三步为什么不用#includeSTC89C5xRC.HvoidDelay(intx)//11.0592MHz{unsignedchardata i,j;while(x--){_nop_();i2;j199;do{while(--j);}while(--i);}}voidmain(){while(1){if(P310){Delay(20);if(P311){Delay(20);P20~P20;}}}}当按住按键时会跳过**if(P31 1)并循环执行整个程序松手后P31变为高电平1被if(P31 0)的判断卡住不能进入内层判断出现按下按键被忽略的情况而while(P31 0);**会卡住不放行不管你按多久松手后才继续往下执行翻转。9.独立按键控制LED显示二进制先看演示独立按键控制LED显示二进制来举个例子我们用八个二进制代表LED八个寄存器模拟二进制计数8765432100000000//初始 //000000001//每按键一次加1 //100000010//200000011//300000100//400000101//500000110//600000111//700001000//8~~~~~~发现LED的点亮就是按键按下次数的二进制表示再取反即可所以只需要记录按键次数每按下一次次数加一再将次数赋给P2端口即可。代码如下#includeSTC89C5xRC.HvoidDelay(intx)//11.0592MHz{unsignedchardata i,j;while(x--){_nop_();i2;j199;do{while(--j);}while(--i);}}voidmain(){charlednum0;while(1){if(P310){Delay(20);while(P310);Delay(20);lednum;P2~lednum;}}}10. 独立按键控制LED移位先看演示:独立按键控制LED移位要实现用两个按键控制LED左右移动先来举个例子这里我们用1表现LED点亮87654321寄存器00000001//假设初始电平状态00000010//左移00000100//左移00001000//左移00000100//右移~发现左右移动是初始情况左移位/右移位按键按下次数而次数由两个按键的加减得到再取反就得到点亮LED的寄存器表示。实现变量记录按键按下次数右移加左移减实际LED移动判断LED移动到边界的情况。代码如下#includeSTC89C5xRC.HvoidDelay(intx)//11.0592MHz{unsignedchardata i,j;while(x--){_nop_();i2;j199;do{while(--j);}while(--i);}}voidmain(){charlednum0;P2~0x01;while(1){if(P300){Delay(20);while(P300);Delay(20);lednum;if(lednum8){lednum0;}P2~(0x01lednum);}if(P310){Delay(20);while(P310);Delay(20);if(lednum0){lednum7;}else{lednum--;}P2~(0x01lednum);}}}11.后记拖延症陆陆续续写了很久第一次写这种文章内容格式不好之处请见谅。文章中有些图片截自B站江协科技。以后也会继续更新学习内容谢谢大家。求三连