这一次给大家带来的项目是课堂作业级别的51单片机数码管显示,本次的项目着重于讲解原理,让大家明白单片机的io对于外界设备的控制是如何进行的。
共阳极和共阴极数码管的差异
(1)驱动方法的差异。一个数码管内部的8颗LED是独立驱动的。如果8颗LED的正极接在一起接到VCC上(负极分别接到单片机的不同引脚),这种接法就叫共阳极。反之如果8颗LED负极接在一起然后接到GND(正极就分别接到单片机的不同引脚)就叫共阴极。两种接法都可以驱动数码管显示,但是用来显示的单片机程序不同(共阳极时单片机0是亮,共阴极时单片机的1是亮)。
(2)驱动电流需求差异。数码管(其实就是LED)如果按照共阳极接法则单片机可以直接驱动显示,如果按照共阴极接法则单片机不能直接驱动,因为单片机的IO口提供的电流大小不够驱动数码管内部的LED显示,需要外部电路来提供一个大电流驱动的芯片来解决(一般会采用74HC245等数据缓冲器)。
数码管显示原理
静态数码管:
静态数码管显示原理为:数码管内部的led灯珠和外部引脚一一对应,利用总线式编码即可实现对八个led的统一编码,并且led顺序为顺时针旋转,可以通过0-F数字的笔画确定led状态,进而得到编码。
动态数码管:
动态数码管的显示分为两个部分,段选和位选,段选就是和静态数码管的显示一样,通过控制led的亮灭来表达字符。位选则是通过选通数码管的公共端来实现数码管的亮灭。由于八位并行I/O口仅能一次性输出一个数字,所以我们需要通过高速位选,利用视觉残留来实现八位数码管一起点亮,故称之为动态数码管。
按照上述的知识点,我们可以搭建下面的原理图:
部分代码示例
代码相对于其他项目来说较为简洁,但是由于字符编码问题,导致粘贴时出现乱码,这个大家不用担心,项目工程里面都是由注释的。
void DigDisplay()
{
u8 i;
for(i=0;i