目录
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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)