51单片机-控制数码管

目录

1.硬件设计

1.1.LED数码管介绍

1.2.原理图设计

2.软件设计

2.1.静态数码管显示

2.2.动态数码管显示

2.3.模块化编程(头文件)

3.知识点

3.1.数组

3.2.子函数

3.3.switch函数

3.4.模块化编程介绍


1.硬件设计

1.1.LED数码管介绍

数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件;如下:

1.2.原理图设计

译码器:此处用的是38线译码器,其工作原理是3个输入端通过二进制转十进制的方式去控制8个输出管脚;如ABC管脚输入000,那对应的输出管脚即为Y0;如果输出010,即为Y2;

缓冲器U2:这是个双向数据缓冲器,其作用是提高其驱动能力,读写功能主要由LE是否接高电平决定(通过跳线帽J21决定LE是接VCC高电平,还是P10低电平),此处用的是缓冲器的写入功能

2.软件设计

2.1.静态数码管显示

功能需求:一个输出接口,只显示一个数字

程序设计:分析原理图,程序设计主要要做的事就是选择数码管位置【位选】,以及选择想要的数字【段选】

#include <REGX52.H>

unsigned char Nixietable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
void Nixie(unsigned char Location,Number)//子函数,位选Location,段选Number
{
/*switch也是一种分支语句,常用于多分支的情况*/
	switch(Location)
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;//LED1
		case 2:P2_4=1;P2_3=1;P2_2=0;break;//LED2
		case 3:P2_4=1;P2_3=0;P2_2=1;break;//LED3
		case 4:P2_4=1;P2_3=0;P2_2=0;break;//LED4
		case 5:P2_4=0;P2_3=1;P2_2=1;break;//LED5
		case 6:P2_4=0;P2_3=1;P2_2=0;break;//LED6
		case 7:P2_4=0;P2_3=0;P2_2=1;break;//LED7
		case 8:P2_4=0;P2_3=0;P2_2=0;break;//LED8
	}
	P0=Nixietable[Number];

}

void main()//主函数
{
	while(1)
	{
		Nixie(1,1);//数码管1,显示1
	}
}

2.2.动态数码管显示

功能需求:显示一串数字,怎么实现呢?一个输出接口,显示多个数字

  • 由于数码管在同一时间只能静态显示一个数字,那么如果我们让多个数字同时显示,该怎么办呢?
  • 我们可以让这些LED按顺序以极高的频率快速闪烁,在人眼看来就是同时显示

程序设计:

  • 首先,使用段码表,初始化一个数组NixieTable,后面可以直接调用,显示数字---段选
  • 其次,用分支语句(Switch-Case语句)写出所有数码光发光的情况/P2端口---位选
  • 最后,消影,如果是[位选-->段选-->位选-->段选],段选和位选之间,因单片机的运行速度很快,会有显示数据串位的问题,为解决此问题,需消音[位选-->段选-->清零-->位选-->段选]
#include <REGX52.H>

void Delay(unsigned char xms)//子函数,Delay函数
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

unsigned char Nixietable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};

void Nixie(unsigned char Location,Number)//子函数,位选Location,段选Number
{
/*switch也是一种分支语句,常用于多分支的情况*/
	switch(Location)
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;//LED1
		case 2:P2_4=1;P2_3=1;P2_2=0;break;//LED2
		case 3:P2_4=1;P2_3=0;P2_2=1;break;//LED3
		case 4:P2_4=1;P2_3=0;P2_2=0;break;//LED4
		case 5:P2_4=0;P2_3=1;P2_2=1;break;//LED5
		case 6:P2_4=0;P2_3=1;P2_2=0;break;//LED6
		case 7:P2_4=0;P2_3=0;P2_2=1;break;//LED7
		case 8:P2_4=0;P2_3=0;P2_2=0;break;//LED8
	}
	P0=Nixietable[Number];
	Delay(1);//延时1ms
	P0=0x00;//消音,P0口清零
}

void main()//主函数
{
	while(1)
	{
		Nixie(1,1);//数码管1,显示1
		Nixie(2,2);//数码管2,显示2
		Nixie(3,3);//数码管3,显示3
	}
}

2.3.模块化编程(头文件)

  • 传统编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路
  • 模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等
#include <REGX52.H>
#include"Delay.H"
/*延时函数模块化后,调用*/
#include"Nixie.H"
/*动态数码管函数模块化后,调用*/

void main()
{
	while(1)
	{
		Nixie(1,1);
		Nixie(2,2);
		Nixie(3,3);
	}
}

3.知识点

3.1.数组

数组:把相同类型的一系列数据统一编制到某一个组别中,可以通过数组名+索引号简单快捷的操作大量数据

int x[3];			//定义一组变量(3个)
int x[]={1,2,3};	//定义一组变量并初始化

x[0] 		//引用数组的第0个变量
x[1] 		//引用数组的第1个变量
x[2]			//引用数组的第2个变量
引用x[3]时,数组越界,读出的数值不确定,应避免这种操作

3.2.子函数

子函数:将完成某一种功能的程序代码单独抽取出来形成一个模块,在其它函数中可随时调用此模块,以达到代码的复用和优化程序结构的目的

/*------------------------------------------------
返回值 函数名(形参)
{
	函数体
}
------------------------------------------------*/
void Function(unsigned char x, y)
{
	
}

3.3.switch函数

/*------------------------------------------------
将变量与case后的各个常量对比
若有相等,则执行相应的语句体
若没有一个相等,则执行default后的语句体

(default可以不写)
------------------------------------------------*/
switch(变量)
{
    case 常量1:语句体1;break;
    case 常量2:语句体2;break;
    (...)
    default:语句体x;break;
}

3.4.模块化编程介绍

  • include的作用:在include的地方,把头文件里的内容原封不动的复制到引用该头文件的地方。
  • 头文件的引用:有两种形式,#include < stdio.h> 和 include "main.h “。

1.用< >引用的一般是编译器提供的头文件,编译时会在指定的目录中去查找头文件。具体是哪个目录,编译器知道,我们不用关心。

2.用” “引用的一般是自己写的头文件,编译时,编译器会在项目所在的文件夹中进行查找,如果还才存在子文件夹,则在Makefile中用-I(大写i)来指定头文件搜索目录。
3.总结:系统提供的头文件用< >引用, 自己写的用” "引用。

  • 头文件的内容:头文件里一般包括宏定义, 全局变量, 函数原型声明。
  • 头文件的组成:含.c和.h文件,如:Delay.h和Delay.c
/*.........Delay.h.........*/
#ifndef _DELAY_H_    //如果没有定义头文件Dealy.h,则执行下面的代码。这是防止重复定义
#define _DELAY_H_	//定义头文件

//下面的代码是头文件的内容
void Delay(unsigned char xms);//函数声明

#endif	//表示头文件结束
/*.........Delay.c.........*/
void Delay(unsigned char xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李十懿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值