LED数码管的静态显示与动态显示(Keil+Proteus) 您所在的位置:网站首页 单片机共阳极数码管0到9 LED数码管的静态显示与动态显示(Keil+Proteus)

LED数码管的静态显示与动态显示(Keil+Proteus)

2023-12-17 09:43| 来源: 网络整理| 查看: 265

前言

就是今天看了一下书上的单片机实验,发现很多的器件在Proteus中都不知道怎么去查找,然后想做一下这个实验,尝试能不能实现,LED数码管的两个还可以实现,但是用LED点阵显示器的时候他那个网络标号不知道是什么情况,有两个东西,所以我也还没搞懂,先暂时就是把LED数码管的静态显示和动态显示来记录一下。由于之前的Keil版本太老了,然后我就下载了最新版的,不过应该也没有什么影响吧。实验完成的就是以下两个:

1.用静态的方法显示学号的最后两位。

2.用动态的方法流水显示学号的后面六位。

实验需要用到的元器件符号(在Proteus中)

元件名称Proteus关键字单片机AT89C51晶体振荡器CRYSTAL蓝色的数码管7SEG-COM-AN-BLUE绿色的数码管7SEG-COM-AN-GRN电阻RES七段数码管7SEG-MPX8-CA-BLUE复位按钮BUTTON电容CAP电解电容CAP-ELECNPN三极管NPN排阻RX8

LED数码管的显示原理是利用LED的发光特性,通过控制LED的亮灭来显示不同的数字或字符。它由多个LED灯组成,通常为七个LED灯,排列成数字“8”的形状。每个LED灯代表一个数字段,分别为a、b、c、d、e、f、g段,其中a、b、c、d、e、f、g段分别对应数字“0”到“9”中的不同段。

LED数码管的控制方式有两种,一种是共阳极控制,一种是共阴极控制。共阳极控制是指将所有LED灯的阳极连接在一起,通过控制各个阴极的接通情况来控制LED数码管的亮灭;共阴极控制则是将所有LED灯的阴极连接在一起,通过控制各个阳极的接通情况来控制LED数码管的亮灭。

比如我采用的是共阳极的数码管,想输出2,他共阳极就是都接着同一个电源了,要想他亮,对应的位置就是0(低电平),1(高电平)就不亮,然后在纸上画着对应位置,就可以写出对应的字型码了(采用16进制)。

常见的字符的码段

显示字符共阴极字型码共阳极字型码03FHC0H106HF9H25BHA4H34FHB0H466H99H56DH92H67DH82H707HF8H87FH80H96FH90HA77H88Hb7CH83HC39HC6Hd5EHA1HE79H86HF71H8EHP73H8CHU3EHC1HT31HCEHy6EH91HH76H89HL38HC7H"灭"00HFFH LED数码管的静态显示

首先就是要理解他的逻辑,通过Keil生成对应的.hex文件,再导入到Proteus中进行模拟。

Keil部分

新建项目

 自己选择路径,起文件名(建议是用英文,但是目前中文也没有报错)

 选择AT89C51

点击是 

 新建C语言文件

 然后就是输入代码

#include"reg51.h" //包含8051单片机寄存器定义的头文件 void main(void){ P0=0xa4;//将数字“2”的码段(共阳极)送P0口 P1=0x82;//将数字“6”的码段(共阳极)送P1口 while(1);//无限循环 }

没有错误就问题不大,但是此时我们还没有生成.hex文件,需要勾选一下。 

 

 再重新把程序构建一下就可以了。(文件在项目的Objects文件夹下面)

到这里Keil部分就可以了,接着就是Proteus部分:

Proteus部分

先要创建一个.DSN文件

添加电路图需要的元器件

 

 

然后就是添加后连线(直接连线就不用说了),这里说一下网络标号

输入标号(标号一致表示连接)

 电源在左边的工具栏和通过鼠标右键都可以找到

导入hex文件(双击AT89C51)

左下角选择开始停止

 运行结果

拓展 

本来以为买的是一样的,结果发现不太一样。这个选择的是AT89C52.需要借助,STC-ISP.

之后就是下载/编程,就烧录到单片机里面了。

 还是有区别的,这个程序。这个的有一个消影的布置,就是如果不这样就会导致输出的时候两个会重合,所以需要有清零重新打印的布置。

#include //打印的位置 unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x7F,0x6F}; //延时函数 void delay(unsigned int xms){ unsigned char i,j; while(xms--){ i=2; j=239; do{ while(--j); }while(--i); } } //打印的数字 void Nixie(unsigned char Location,Number){ switch(Location){ case 1:P2_4=1;P2_3=1;P2_2=1;break; case 2:P2_4=1;P2_3=1;P2_2=0;break; case 3:P2_4=1;P2_3=0;P2_2=1;break; case 4:P2_4=1;P2_3=0;P2_2=0;break; case 5:P2_4=0;P2_3=1;P2_2=1;break; case 6:P2_4=0;P2_3=1;P2_2=0;break; case 7:P2_4=0;P2_3=0;P2_2=1;break; case 8:P2_4=0;P2_3=0;P2_2=0;break; } //消影 P0=NixieTable[Number]; delay(1); #P0=0x00; } void main(){ while(1){ Nixie(1,2); Nixie(2,6); } }

LED数码管的动态显示

同理可得

#include #define uchar unsigned char #define uint unsigned int uchar code dis_code[]={0xA4,0xC0,0xC0,0xF9,0xA4,0x82};//200126 uchar code wei_code[]={0x01,0x02,0x04,0x08,0x10,0x20};//对应输出的位置 void delay(uint t){ uchar i; while(t--) for(i=0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有