历史上的今天
今天是:2025年10月27日(星期一)
2022年10月27日 | 52单片机四种方法实现流水灯
2022-10-27 来源:csdn
流水灯电路分析
流水灯电路图

电源→限流电阻→发光二极管→74HC573输出端→单片机P1组IO口
因为单片机的IO口输出电流非常小,无法直接用IO口驱动发光二极管,所以我们需要用到74HC573这个芯片(可以理解为电流放大的芯片)。
74HC573
芯片图

从图中可以看出74HC573有20个引脚,Vcc和GND是电源的正负极,2 ~ 9的引脚是输入端,12 ~ 19的引脚是输出端
电极特性

①我们的电路板一般的工作电压是5V,根据表中数据可以得知,芯片高电平的输入电压为≥3.15V,低电平输入电压为0~1.35V。我们使用的单片机STC89C52输出的电压为5V或者0V,满足上面的条件。
②再看高低电平的转换时间,Vcc=4.5V对应的是500ns,单片机执行一条指令最少的时间为1.08微秒,大于500纳秒,不需要额外加入延时就能达到芯片的要求。
③工作温度在-45摄氏度和85摄氏度之间。
真值表

L表示低点平,H表示高电平,X表示任意
Q0表示保持上一次的状态,Z表示保持高阻状态
由图可得:
①当输入OE的电平为低电平,LE为高电平时,输出电平的高低与输入电平相同。
②当输入OE的电平为低电平,LE也为低电平时,输出电平保持原来的电平高低。
③当输入OE的电平为高电平时,输出电平为高阻状态。

由于我的OE始终时接地的,所以OE始终为低电平,不会出现上述第③种情况
我把跳线帽接在了1和2(如上图),则LE为高电平,符合上述第①种情况
二进制十进制和十六进制转换
进制图表

表示方法:
二进制:0B 十六进制:0X 十进制数直接表示
示例:
十进制:15➡二进制:0B1111➡十六进制:0X0F
二进制转十六进制
一位十六进制数由四位二进制数表达,通过8421码来计算。(重点)
计算示例:

二进制转十进制

十进制转二进制

十进制转十六进制

十六进制转十进制

IO口的总线程控制方式
单片机IO口控制方式
位控制:对单独的每个IO口进行控制 例:led0=0(我的上一篇文章点亮led用的这种方法)
总线控制:对八个IO口通知进行控制 例:P1=0XFE
下面是通过总线控制点亮单个led对应的十六进制数是什么

参考代码
1、简单粗暴法
上面我有提到单片机运行这一条代码的时间是微秒级别的,而我们人眼对于每11毫秒闪烁一次约83赫兹就已经基本感觉不到了。所以我们要在上面代码的基础上加上延时
int i = 40000;
while(i--);//延时
我们知道程序运行时需要时间,运行一次的时间很短,但我们可以用while循环让它多运行几次,从而达到延时的效果
#include #define led_time 40000 void main() { unsigned int i; while(1) { P1 = 0XFE;//点亮第1个led i = led_time; while(i--);//延时(下同) P1 = 0XFD;//点亮第2个led i = led_time; while(i--); P1 = 0XFB;//点亮第3个led i = led_time; while(i--); P1 = 0XF7;//点亮第4个led i = led_time; while(i--); P1 = 0XEF;//点亮第5个led i = led_time; while(i--); P1 = 0XDF;//点亮第6个led i = led_time; while(i--); P1 = 0XBF;//点亮第7个led i = led_time; while(i--); P1 = 0X7F;//点亮第8个led i = led_time; while(i--); } } 2、左移法简化程序 #include void main() { unsigned int X = 0; unsigned int i; while(1) { P1 = ~( 0X01 << X );//左移并取反 X++; if( X >= 8 ) { X = 0; //左移7次后清零 } i = 40000; while(i--); } } 3、调用库函数法 #include 这个库函数包含了循环左移或者右移的子程序和_nop_延时函数 _nop_();//空操作,延迟一个机器周期时间 机器周期时间长短取决于晶振频率 #include #include void main() { unsigned int i; P1 = 0XFE;//点亮第1个led while(1) { i = 40000; while(i--);//延时 P1 = _crol_(P1,1);//每次循环左移一格 } } 4、数组法 #include unsigned char code LED[8]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F}; //点亮led的数组(加code为只读,不可修改,节省内存) void main() { unsigned int i; unsigned char j=0;//自加变量 while(1) { P1 = LED[j++]; if(j>=8) j=0; i = 40000; while(i--);//延时 } } 总结 四种方法实现流水灯 第一种:简单粗暴法 特点:思路简单明了,程序过于繁杂。 第二种:左移法 特点:运用了左移的运算,简化了第一种的方法的程序。 第三种:调用库函数 特点:程序上最简便的方法,一条语句实现了流水灯的功能。 第四种:数组法 特点:控制流水灯最灵活的方法,可以实现任意花样流水灯的效果。
史海拾趣
|
谈起金属探测器,人们就会联想到探雷器,工兵用它来探测掩埋的地雷。金属探测器是一种专门用来探测金属的仪器,除了用于探测有金属外壳或金属部件的地雷之外,还可以用来探测隐蔽在墙壁内的电线、埋在地下的水管和电缆,甚至能够地下探宝,发现埋藏在地下 ...… 查看全部问答> |
|
刚用F28027,PCB做好以后,通上电发现电流就有60MA,很奇怪,烧入程序后发现电流有90MA,不知道为什么耗那么多电流,这个正常吗,根据芯片资料,我只给3.3V供电,那个VREGENZ我用电阻下拉到地了,在没烧程序前拿掉电阻,电流就没了,但是烧好程序后那个电阻有无 ...… 查看全部问答> |
|
1、智能设备平台WINCE5.0、PC编程VS2005 C# 2、我想在WINCE5.0上操作数据库。运行我我自己的应用软件时提示:报错:无法加载 DLL“SQLCEME30.DLL”: 3、我重新编译内核,现在运行wince5.0时,WINGDOWS目录下已经有了所需的7个*。DLL文件,注册表 ...… 查看全部问答> |
|
《AlientekSTM32例程手册》28个实验连载--触摸屏实验+USB鼠标 触摸屏实验 ALIENTEK MINISTM32 实验18 触摸屏实验.rar (1.81 MB) 下载次数: 560 2010-11-9 02:09 触摸屏实验.pdf (621.53 KB) 下载次数: 471 2010-11-9 02:09 USB鼠标 ALIENTEK MINISTM32 实验2 ...… 查看全部问答> |
|
在辛昕 的帖子里看到一个问题,就是for循环的效率问题,因此自己查找了一下答案。 一.关于for(;;);和while(1);的循环效率问题。 a) 在keil C51上面,这两个没有差异,是一样的。在IAR F ...… 查看全部问答> |
|
刚接到一个项目,功能类似可视对讲门铃,要求是在显示视频图像的同时还要按需显示文字信息,请问用mega128加上4寸TFT显示屏和一个cmos摄像头能做到吗?如何才能实现呢?小弟在这方面是空白,希望大家多多帮助···… 查看全部问答> |




