【STC89C52】数码管静态显示和动态显示

 今天我跟大家分享的是数码管静态显示和动态显示实验的学习笔记,希望对你有所帮助!!!如果有什么错误欢迎评论区留言指正!!!

 

目录

一、原理图分析

二、静态显示

​编辑

三、动态显示


一、原理图分析

1)数码管原理

d0cfd067ec434438b7c3acff4ba6343d.png

 一位数码管是由8个LED构成,可以显示数字、字符,把相对应的LED点亮即可。

数码管分成共阴极和共阳极,开发板上的数码管是共阴极的,导通段选高电平,位选低电平。段选确定亮的字形,位选确定是哪一个数码管亮。

如何判断实物数码管是共阴极还是共阳极的呢?可以用万用表红表笔接a,黑表笔接GND,如果亮则为共阴极,如果不亮反过来接(红表笔接VCC,黑表笔接a),亮了则为共阳极。

怎么赋值呢???

H dp g f e d c b a L

如果想显示2,a,b,d,e,g亮

01011011

0x5B

2)原理图 

d2656719c555419b959208155d6e5e04.png

8位共阴极数码管由两个锁存器控制,一个控制位选(确定哪一个数码管亮),一个控制段选(确定亮的字形)。OE需要接地,输出端Q才可以输出高低电平。LE高电平时,输出端Q随输入端D的数据而变化,LE低电平时,输出端Q不随输入端D的数据而变化。

真值表:
4787688777ad49158471663438256089.png

L为低电平,H为高电平,X为任意值,Z为高阻态

锁存器与P0口相连,中间连着上拉电阻,上拉电阻的作用是可以输出高低电平,当P0口作为输入/输出口时,上电复位后处于开漏模式,只能输出低电平,无法输出高电平。P0口内部无上拉电阻,所以作I/O口必须外接10K-4.7K的上拉电阻。(上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。下拉同理,也是将不确定的信号通过一个电阻钳位在低电平。)

正常模式:输入0,反相器变成1,栅极是1,源极是0,正偏,源极与漏极相连,输出0。

                  输入1,反相器变成0,栅极是0,源极是0,源极与漏极断开,上拉电阻输出1。

开漏模式:输入0,反相器变成1,栅极是1,源极是0,正偏,源极与漏极相连,输出0。

                  输入1,反相器变成0,栅极是0,源极是0,源极与漏极断开,高阻态。

如果想让数码管亮,我们可以先把位选打开,把想亮的数码管传给P0,P0传到锁存器,进行锁存,再打开段选,把想亮的字形传给P0,P0传到锁存器,进行锁存。

二、静态显示

#include <reg52.h>
sbit WE=P2^7;//位选
sbit DU=P2^6;//段选
void main(){
	//第1位数码管显示2
	WE=1;//打开位选
	P0=0xfe;//11111110
	WE=0;//进行锁存
	DU=1;//打开段选
	P0=0x5b;//01011011
	DU=0;//进行锁存
}

84a18729f1474542bc5fd46005d1342a.jpg

三、动态显示

1)0-9段选表

0x3F,  //"0"

0x06,  //"1"

0x5B,  //"2"

0x4F,  //"3"

0x66,  //"4"

0x6D,  //"5"

0x7D,  //"6"

0x07,  //"7"

0x7F,  //"8"

0x6F,  //"9"

2)动态显示是一次显示一个数码管的字形,但是变化极快,视觉效果同时显示好几个数码管的字形。静态显示一次只能显示一个字形,如果想要在多个数码管显示多个不同字形,需要多个IO口。

3)动态显示一定要while(1)循环,不然只显示最后一个数码管的字形,静态显示可以利用自身的循环,一直显示到下一次下载。

4)动态显示每一位数码管显示完要进行清除断码和延时,不然太快了,前面的段码还在,下一个数码管的位选已经打开了,就会出现乱码。

#include <reg52.h>
sbit WE=P2^7;//位选
sbit DU=P2^6;//段选
#define uint unsigned int
#define uchar unsigned char
	//延时函数
void delay(uint z){
	uint x=0;
	uint y=0;
	for(x=z;x>0;x--)
	for(y=114;y>0;y--);
}
//共阴极数码管0-9段选表
uchar board[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void display(uint z){
	uint bai=z/100;//百位
	uint shi=z%100/10;//十位
	uint ge=z%10;//个位
	//第1位数码管
	P0=0xff;//清除段码
	WE=1;//打开位选
	P0=0xfe;//11111110
	WE=0;//进行锁存
	DU=1;//打开段选
	P0=board[bai];
	DU=0;//进行锁存
	delay(5);
	//第2位数码管
	P0=0xff;//清除段码
	WE=1;//打开位选
	P0=0xfd;//11111101
	WE=0;//进行锁存
	DU=1;//打开段选
	P0=board[shi];
	DU=0;//进行锁存
	delay(5);
	//第3位数码管
	P0=0xff;//清除段码
	WE=1;//打开位选
	P0=0xfb;//11111011
	WE=0;//进行锁存
	DU=1;//打开段选
	P0=board[ge];
	DU=0;//进行锁存
	delay(5);
}
void main(){
	//显示123
	while(1){
	display(123);	
	}
}

c118c0fd687c485e800debb3a59c69ac.jpg

以上就是我今天的分享!如果有什么建议或补充欢迎评论区留言!!!如果觉得这篇博客还不错的话可以点个赞再走哟~

  • 10
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是基于STC89C52单片机数码管倒计时显示程序,使用Keil5进行编译和烧录。 ```c #include <reg52.h> #define uchar unsigned char #define uint unsigned int uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x6f}; void delay(uint z) // 延时函数 { uint x, y; for (x = z; x > 0; x--) for (y = 110; y > 0; y--); } void main() { uchar second = 30; // 设置倒计时时间,单位为秒 uchar minute = 0; uchar hour = 0; uchar i = 0; while (1) { P2 = 0xff; P0 = table[second % 10]; // 显示秒的个位数 P2 = 0xfe; // 第一个数码管 delay(2); // 延时一段时间,保证显示效果 P2 = 0xff; P0 = table[second / 10]; // 显示秒的十位数 P2 = 0xfd; // 第二个数码管 delay(2); P2 = 0xff; P0 = table[minute % 10]; // 显示分的个位数 P2 = 0xfb; // 第三个数码管 delay(2); P2 = 0xff; P0 = table[minute / 10]; // 显示分的十位数 P2 = 0xf7; // 第四个数码管 delay(2); P2 = 0xff; P0 = table[hour % 10]; // 显示时的个位数 P2 = 0xef; // 第五个数码管 delay(2); P2 = 0xff; P0 = table[hour / 10]; // 显示时的十位数 P2 = 0xdf; // 第六个数码管 delay(2); if (second == 0 && minute == 0 && hour == 0) // 倒计时结束 { for (i = 0; i < 50; i++) // 闪烁提示 { P2 = 0xff; P0 = 0x00; delay(50); P2 = 0xdf; P0 = 0x00; delay(50); } second = 30; // 复位 minute = 0; hour = 0; } second--; // 每次循环秒数减一 if (second == 255) // 秒数为0时,分钟数减一 { second = 59; minute--; if (minute == 255) // 分钟数为0时,小时数减一 { minute = 59; hour--; } } } } ``` 该程序使用了共阳数码管,通过P2口的高四位选择要显示数码管,通过P2口的低四位控制数码管显示内容。在`delay`函数中,通过嵌套循环来实现延时,具体的延时时间需要自己测试调整。 程序中先设置了倒计时时间为30秒,然后每次循环秒数减一。当秒数为0时,分钟数减一,当分钟数为0时,小时数减一。当倒计时结束时,会闪烁提示,然后复位倒计时时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值