【STC15单片机】动态数码管

这篇具有很好参考价值的文章主要介绍了【STC15单片机】动态数码管。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

点亮一位数码管

动态数码管

100s倒计时

动态数码管封装代码



点亮一位数码管

段选:选中哪一位数码管

位选:选中的数码管要显示的内容

这是我对段选位选的理解,就是选中某个位置,赋值字形码,显示想要的图形

数码管动态显示代码,蓝桥杯单片机组~STC15,单片机,嵌入式硬件

如果只想让第一个数码管显示,就只需要让com1 = 1即可,其他comx都=0

如果想让8个数码管都亮,就让com1~com8都赋值1,此时对数码管赋值,8个数码管都会显示一致的内容

如果想让不同数码管显示不同的内容且互不干扰,就需要不断的段选、位选,段选、位选,段选、位选。

数码管动态显示代码,蓝桥杯单片机组~STC15,单片机,嵌入式硬件

先打开段选的锁存器(U8),用来选择哪个数码管亮,U8的Y6C = 1来控制

数码管动态显示代码,蓝桥杯单片机组~STC15,单片机,嵌入式硬件

往前推导就是Y6 = 0;WR = 0(跳线帽链接)

Y6又由138译码器控制

P27 = 1; P26 = 1; P25 = 0;        //段选

 选中第一个数码管 P00 = 1;

P27 = 1; P26 = 1; P25 = 1;        //位选

 第一个LED显示个0  P0 = 0xC0;

代码如下:

#include <STC15F2K60S2.H>
#include "smg.h"

void main()
{
	P2 = 0xA0;	P0 = 0x00;	//初始化,关闭蜂鸣器继电器
//	P2 = 0x80;	P0 = 0xFF;	//Y4=0;选中LED,使其灭
	
	//数码管段选
	P27 = 1; P26 = 1; P25 = 0;	//Y6=0;Y6C=1; 使能锁存器U8
	P00 = 1; 					//选中第一个数码管
	//数码管位选
	P27 = 1; P26 = 1; P25 = 1;	//Y7=0;Y7C=1; 使能锁存器U7
	P0 = 0xC0;					//显示0
	
	while(1)
	{	}
}

如果想让第5个数码管也显示相同的内容,就在段选的第二行代码,将P04也选中

#include <STC15F2K60S2.H>
#include "smg.h"

void main()
{
	P2 = 0xA0;	P0 = 0x00;	//初始化,关闭蜂鸣器继电器
//	P2 = 0x80;	P0 = 0xFF;	//Y4=0;选中LED,使其灭
	
	//数码管段选
	P27 = 1; P26 = 1; P25 = 0;	//Y6=0;Y6C=1; 使能锁存器U8
	P00 = 1; P04 = 1;			//选中第一个数码管
	//数码管位选
	P27 = 1; P26 = 1; P25 = 1;	//Y7=0;Y7C=1; 使能锁存器U7
	P0 = 0xC0;					//显示0
	
	while(1)
	{	}
}

动态数码管

动态数码管的工作原理及使用

动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一个数码管有效。这样一来,就没有必要每一位数码管分配一个锁存器,从而大大简化硬件电路。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码挂送出字形码和相应的位选,利用发光二极管的余晖和人眼视觉暂留作用,使人肉眼感觉各位数码管同时都在显示。动态显示的两幅比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的电阻。

明白了一位数码管是怎么显示的,就可以操作8个数码管了

下面是一次操作8个数码管动态显示的代码

第一个数码管显示1,第二个数码管显示2……第八个数码管显示8

#include "smg.h"
#include "intrins.h"


void Delay_ms(int xms)		//15单片机延时函数@11.0592MHz
{
	unsigned char i, j;		
	while(xms--)
	{
		_nop_();
		_nop_();
		_nop_();
		i = 11;
		j = 190;
		do
		{
			while (--j);
		} while (--i);
	}	
}

/*共阳极码表 ABCDEF都是大写*/
unsigned char wei[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x80, 0xC6, 0xC0, 0x86, 0x8E, 0xBF, 0xFF};
					   //0     1     2     3     4     5     6     7     8     9     A     B     C     D     E     F     -    灭

	
void SMG_Diaplay(void)
{
	//第1个数码管
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	P0 = 0x01;	//选中第1个数码管
	P2 = 0xFF;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0 = wei[1];
	Delay_ms(1);
	
	//第2个数码管
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	P0 = 0x02;	//选中第2个数码管
	P2 = 0xFF;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0 = wei[2];
	Delay_ms(1);
	
	//第3个数码管
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	P0 = 0x04;	//选中第3个数码管
	P2 = 0xFF;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0 = wei[3];
	Delay_ms(1);
	
	//第4个数码管
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	P0 = 0x08;	//选中第4个数码管
	P2 = 0xFF;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0 = wei[4];
	Delay_ms(1);
	
	//第5个数码管
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	P0 = 0x10;	//选中第5个数码管
	P2 = 0xFF;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0 = wei[5];
	Delay_ms(1);
	
	//第6个数码管
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	P0 = 0x20;	//选中第6个数码管
	P2 = 0xFF;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0 = wei[6];
	Delay_ms(1);
	
	//第7个数码管
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	P0 = 0x40;	//选中第7个数码管
	P2 = 0xFF;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0 = wei[7];
	Delay_ms(1);
	
	//第8个数码管
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	P0 = 0x80;	//选中第8个数码管
	P2 = 0xFF;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0 = wei[8];
	Delay_ms(1);
}

在while(1)里调用SMG_Diaplay即可

偷偷懒,用stc给的延时1ms代码,延时1ms的目的是消影,即将本次的段选位选上一次的段选位选分隔开,互不影响,否则数码管会重影看不清,莎普爱思也没用

数码管动态显示代码,蓝桥杯单片机组~STC15,单片机,嵌入式硬件

函数中有_nop_();    需要调用#include "intrins.h"头文件


100s倒计时

后三位数码管依次显示百十个位上的数字

我的思路是定义一个时间变量Time,初始化=100

在1s中断的程序里让Time--,这样就实现了100s倒计时

如何让这每一位都显示在数码管上呢?

我采用数位分离的方法,即将一个数的百位、十位、个位都分离出来,分别显示

三位数数位分离方法

bai = Time/100

shi = Time/10%10

ge = Time%10

 数码管动态显示代码,蓝桥杯单片机组~STC15,单片机,嵌入式硬件

 数码管部分代码

#include "smg.h"
#include "intrins.h"


void Delay_ms(int xms)		//15单片机延时函数@11.0592MHz
{
	unsigned char i, j;		
	while(xms--)
	{
		_nop_();
		_nop_();
		_nop_();
		i = 11;
		j = 190;
		do
		{
			while (--j);
		} while (--i);
	}	
}

/*共阳极码表 ABCDEF都是大写*/
unsigned char wei[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x80, 0xC6, 0xC0, 0x86, 0x8E, 0xBF, 0xFF};
					   //0     1     2     3     4     5     6     7     8     9     A     B     C     D     E     F     -    灭

		
void DJS_Show(unsigned char bai, unsigned char shi, unsigned char ge)
{
	//第6个数码管
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	P0 = 0x20;	//选中第6个数码管
	P2 = 0xFF;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0 = wei[bai];	//显示百位
	Delay_ms(1);
	
	//第7个数码管
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	P0 = 0x40;	//选中第7个数码管
	P2 = 0xFF;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0 = wei[shi];	//显示十位
	Delay_ms(1);
	
	//第8个数码管
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	P0 = 0x80;	//选中第8个数码管
	P2 = 0xFF;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0 = wei[ge];	//显示个位
	Delay_ms(1);
}	
#ifndef __SMG_H__
#define __SMG_H__

#include <STC15F2K60S2.H>

extern unsigned char wei[];

void SMG_Diaplay(void);
void DJS_Show(unsigned char bai, unsigned char shi, unsigned char ge);

#endif

主程序代码

#include <STC15F2K60S2.H>
#include "smg.h"
#include "Timer0.h"

unsigned char Time = 100;

void main()
{
	P2 = 0xA0;	P0 = 0x00;	//初始化,关闭蜂鸣器继电器
	P2 = 0x80;	P0 = 0xFF;	//Y4=0;选中LED,使其灭
	Timer0_Init();	
	
	while(1)
	{
		DJS_Show(Time/100, Time/10%10, Time%10);
	}
}

void Timer0_Rountine(void) interrupt 1
{	//5ms定时
	static unsigned int Count0;

	Count0++;
	if(Count0 >= 200)	//1s
	{
		Time--;
		Count0 = 0;	//软件复位
	}
}

这个100s是不精确的,因为控制数码管程序里时钟有1ms延时


动态数码管封装代码

改用一位一位单独控制的数码管,操作方便 

和51单片机数码管程序差不多文章来源地址https://www.toymoban.com/news/detail-547720.html

void Delay_ms(int xms)		//15单片机延时函数@11.0592MHz
{
	unsigned char i, j;		
	while(xms--)
	{
		_nop_();		_nop_();		_nop_();
		i = 11;		j = 190;
		do
		{
			while (--j);
		} while (--i);
	}	
}

/*共阳极码表 ABCDEF都是大写*/
unsigned char NixieTable[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x80, 0xC6, 0xC0, 0x86, 0x8E, 0xBF, 0xFF};
					   //0     1     2     3     4     5     6     7     8     9     A     B     C     D     E     F     -    灭

void Nixie(unsigned char location, unsigned char number)
{
	P2 = 0xC0;	//Y6=0;Y6C=1; 使能锁存器U8     P27 = 1; P26 = 1; P25 = 0;
	switch(location)//选中LED位置,位选
	{
		case 1:P0 = 0x01;break;
		case 2:P0 = 0x02;break;
		case 3:P0 = 0x04;break;
		case 4:P0 = 0x08;break;
		case 5:P0 = 0x10;break;
		case 6:P0 = 0x20;break;
		case 7:P0 = 0x40;break;
		case 8:P0 = 0x80;break;
	}
	P2 = 0xFF;	//Y7=0;Y7C=1; 使能锁存器U7     P27 = 1; P26 = 1; P25 = 1;
	P0=NixieTable[number];//数字
	Delay_ms(1);
	P0=0xFF;//消影清零,否则重影
}

到了这里,关于【STC15单片机】动态数码管的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【51单片机】动态数码管

    0、前言 参考: 普中51单片机开发攻略–A2.pdf 上一章我们主要是介绍一位数码管的内部结构及控制原理。下面我们再来介 绍下多位数码管及动态显示原理的相关知识。 本章所要实现的功能是:控制动态数码管从左至右显示数字 0-7。 为了正规点,工程弄个正规文件夹: http

    2024年01月21日
    浏览(67)
  • 单片机——数码管动态显示

    1.头文件和定义,代码还使用了 sbit 定义来声明了两个变量 duan 和 wei,它们实际上是 P2.6 和 P2.7 端口的别名,用于控制数码管的段选和位选信号。这种方法可以使代码更具可读性,并提高代码的可维护性。定义无符号整数便于后面应用。 2.使用一个 16 个元素的数组 table,该数

    2024年02月11日
    浏览(40)
  • 单片机实验六 动态数码管实验

    1.熟悉实验软件和硬件,进行正确的接线; 2.编程使得数码管排依次显示01234567 1.Keil uVision4 2.PZISP自动下载软件 3.HC6800S开发板 动态数码管实验整体图 通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电

    2024年02月09日
    浏览(42)
  • 51单片机控制数码管动态显示

    首先打开proteus,导入8位数码管和89c51。 然后如图连线,分清断码和位码, 断码就是一个数码管的7个LED灯。 位码:就是第几位显示,由于是共阴极,所以哪位接地就显示哪位。 下面通过改变位码的接线就可以看出不同的效果 下面就编写程序,从第1位到第8位显示从0到7的八

    2023年04月21日
    浏览(43)
  • 单片机-如何让数码管动态显示

    单片机IO口输出难稳定,需要数码管与单片机连接需要增加驱动电路, 使用 74HC245 abcdefgDP并联导出  74HC245 对数码管进行驱动,P0 是输出电流 来驱动各个段的 驱动芯片 增加电阻 是为了防止电流过大烧坏数码管 。P0输出段选的 共阴 就是所有阴极 连接 在一起,连接在公共端

    2024年02月09日
    浏览(47)
  • 51单片机动态数码管显示自己学号

    实验题目:使用51单片机实现动态数码管显示自己8位学号,例如20220018 在此原理图又分两种连接方式: 第一种是8位数码管接38译码器来减少端口使用。 第二种是,没有端口要求接好就可以那就是,把位选端接P3口,段选端接P0口,这样占用端口多,一般实验都是使用第一种接

    2024年02月13日
    浏览(56)
  • 基于串口通信技术——让数码管显示的数据发送给电脑,电脑控制单片机外设——15单片机

    目录 1.使用的单片机为IAPI15F2K61S2 2.使用的外设 3.各个外设的作用 1.数码管功能  2.LED灯 3.蜂鸣器与继电器 4.按键 5.串口通信 4.利用发送单个字符函数 发送字符型的数字值,为一个变量+\\\'0\\\',发送为字符型数字。 4.初始化 5.程序 1.main 2.iic.h 3.onewire.c 1.LED灯,继电器与蜂鸣器。 2.数

    2024年02月10日
    浏览(45)
  • 【51单片机】数码管的静态与动态显示(含消影)

    数码管在现实生活里是非常常见的设备,例如 这些数字的显示都是数码管的应用。 注意 :数码管有 共阴 和 共阳 的区分。 在自己设计电路时,应当选用一种数码管时需要选用相应的译码器(共阴配共阴,共阳同理) 数码管的使用: 数码管其实就是一段一段LED构成的,51单

    2024年01月19日
    浏览(39)
  • C51单片机-共阳极数码管循环显示数字0至9,共阴极数码管循环显示5201314(动态)

    keil uVision4界面: proteus仿真界面:

    2024年02月06日
    浏览(54)
  • 单片机C语言实例:3、数码管累加与累减动态显示

    程序实例1: 程序实例2: 程序实例3: 程序实例4: 程序实例5: 程序实例6: 程序实例7: 程序实例8: 程序实例9: 程序实例10: 程序实例11:

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包