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

前言

就是今天看了一下书上的单片机实验,发现很多的器件在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-ELEC
NPN三极管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进制)。

常见的字符的码段

显示字符共阴极字型码共阳极字型码
03FHC0H
106HF9H
25BHA4H
34FHB0H
466H99H
56DH92H
67DH82H
707HF8H
87FH80H
96FH90H
A77H88H
b7CH83H
C39HC6H
d5EHA1H
E79H86H
F71H8EH
P73H8CH
U3EHC1H
T31HCEH
y6EH91H
H76H89H
L38HC7H
"灭"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<regx52.h>
//打印的位置
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<reg51.h>
#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<200;i++);
}

void main(){
	uchar i;
	while(1){
		for(i=0;i<6;i++){
			P0=dis_code[i];//P0口输出段码
			P2=wei_code[i];//P2口输入位控码
			delay(123);//延时
		}
	}
}

 总线可以通过右键来找到(左边也有,还有电源和接地的符号)

 流水灯

 拓展

显示学号后8位可以直接修改代码即可。

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
	
uchar code dis_code[]={0x99,0xC0,0xA4,0xC0,0xC0,0xF9,0xA4,0x82};//40200126
uchar code wei_code[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//对应输出的位置

void delay(uint t){
	uchar i;
	while(t--)
		for(i=0;i<200;i++);
}

void main(){
	uchar i;
	while(1){
		for(i=0;i<8;i++){
			P0=dis_code[i];//P0口输出段码
			P2=wei_code[i];//P2口输入位控码
			delay(123);//延时
		}
	}
}

 或者可以用移位函数来控制位控码

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
	
uchar code dis_code[]={0x99,0xC0,0xA4,0xC0,0xC0,0xF9,0xA4,0x82};//40200126(共阳极段码表)

void delay(uint t){
	uchar i;
	while(t--)
		for(i=0;i<200;i++);
}

void main(){
	uchar i,j=0x80;
	while(1){
		for(i=0;i<8;i++){
			j=_crol_(j,1);//循环移位函数,将j循环左移1位
			P0=dis_code[i];//P0口输出段码
			P2=j;//P2口输出位控码
			delay(123);//延时
		}
	}
}

 参考链接

KeilMDK5软件写不了汉字注释怎么解决?_keil怎么输入中文_第九荒岛的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_46600282/article/details/128550120proteus设计教程-数码管使用方法_proteus数码管_zd845101500的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zd845101500/article/details/126663186proteus常用元件图示和名称介绍 - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/518410309?utm_id=0单片机Proteus中的这个16个引脚的元器件是什么?_百度知道 (baidu.com)icon-default.png?t=N7T8https://zhidao.baidu.com/question/2121623824451309267.htmlProteus如何设置网络标号-百度经验 (baidu.com)icon-default.png?t=N7T8https://jingyan.baidu.com/article/adc8151342d5a7b623bf73f3.html怎样把HEX文件载入PROTEUS 7仿真软件单片机里_360问答 (so.com)icon-default.png?t=N7T8https://wenda.so.com/q/1676834827210755proteus电源在哪-百度经验 (baidu.com)icon-default.png?t=N7T8https://jingyan.baidu.com/article/4e5b3e192806d8d0911e2423.html

51单片机入门教程-2020版 程序全程纯手打 从零开始入门_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1Mb411e7re/?spm_id_from=333.1007.0.0&vd_source=7c3bfbf39d037fe80c97234396acc524

总结

还是需要一点耐心的,其实我也不确定能不能运行成功,但是最后结果和自己理想中的一样的时候还是有点小激动的,未来继续努力。

  • 16
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

封奚泽优

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值