生活中的应用:其实身边的设备上用到的很多,最基本的就是电脑的硬盘读取LED,大量读写数据的时候他就会狂闪,平时偶尔闪一下。
用途:1在没有显示的板子上能用LED指示当前工作状态;2
通信:摩斯码这个读起来就需要熟悉码表了;3……
原理:其实就是利用移位输出,比如数据0x11,就是二进制的0001 0001,循环移出一次,再加个合适的延时,连续起来,就实现了。
函数实现很简单:
void Blink(u8 LED_Mode)
{
u8 a = 8;
while(a--)
{
(LED_Mode & 0x80)?(LED_ON):(LED_OFF);
LED_Mode <<= 1;
Delay_ms(125);
}
LED_OFF;
}
有个小窍门可以跟大家分享下,可能有人觉得0x11之类的16进制数看起来不直观,没关系,那就用直接的二进制00010001表示!怎么实现呢?熟悉arduino的同学应该知道,arduino中是可以直接用B00010001表示二进制数据的,32上也可以!这个的实现全靠binary.h文件,我们可以直接考到目录下面用就可以了,亲测可以!
ps:arduino.h也可以部分使用,比如取绝对值的abs(),求最大max(a,b)等,非常方便
先说硬件:AT24C08+
STM32F103+LED,当然还有我们的
调试神器CMSIS-DAP,这个实验中可以实现调试、串口并用,非常方便
- #include "stm32f10x.h"
- #include "usart.h"
- //#include "Systick.h"
- #include "binary.h"
- #include "blink.h"
- #include "AT24CXX.h"
- #include "delay.h"
- extern u8 buffer[10];
- /*
- * 函数名:main
- * 描述 : 主函数
- * 输入 :无
- * 输出 : 无
- */
- int main(void)
- {
-
- USART_Config(9600);
- DelayInit(72);//初始化延时
- LED_Pin_Init();//初始化LED
-
- AT24CXX_Init();//初始化eeprom
-
- printf("Test ON
- ");
-
- AT24CXX_Read(0x00, buffer, 1);//读取eeprom数据
-
- while(1)
- {
- Blink(buffer[0]);//闪……
- Delay1ms(1000);
- }
- // add your code here ^_^。
- }
复制代码
还有性感的视频演示:上电先读取eeprom闪烁节奏,初始化之后可以通过串口发送0x0A(也就是二进制的00001010)过去,单片机接收到后回应收到的数据,并存到eeprom,然后按00001010节奏律动……
`