目录

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;//LED1case 2:P2_4=1;P2_3=1;P2_2=0;break;//LED2case 3:P2_4=1;P2_3=0;P2_2=1;break;//LED3case 4:P2_4=1;P2_3=0;P2_2=0;break;//LED4case 5:P2_4=0;P2_3=1;P2_2=1;break;//LED5case 6:P2_4=0;P2_3=1;P2_2=0;break;//LED6case 7:P2_4=0;P2_3=0;P2_2=1;break;//LED7case 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;//LED1case 2:P2_4=1;P2_3=1;P2_2=0;break;//LED2case 3:P2_4=1;P2_3=0;P2_2=1;break;//LED3case 4:P2_4=1;P2_3=0;P2_2=0;break;//LED4case 5:P2_4=0;P2_3=1;P2_2=1;break;//LED5case 6:P2_4=0;P2_3=1;P2_2=0;break;//LED6case 7:P2_4=0;P2_3=0;P2_2=1;break;//LED7case 8:P2_4=0;P2_3=0;P2_2=0;break;//LED8}P0=Nixietable[Number];Delay(1);//延时1msP0=0x00;//消音,P0口清零
}void main()//主函数
{while(1){Nixie(1,1);//数码管1,显示1Nixie(2,2);//数码管2,显示2Nixie(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);}
}

51单片机-控制数码管相关推荐

  1. 51单片机控制数码管显示

    前言 今天学习51单片机的数码管模块 我的学习板上面的数码管是4为一体由12个引脚控制的模块. 今天就编程控制它显示我们想要的输出. 数码管本质上是由8个LED拼接而成的,他们分别叫做a,b,c,d, ...

  2. 二、51单片机控制数码管

    1.数码管 1.1.什么是数码管 (1)数码管的外观: 数码管可分为单个的,联排的(2位.4位.8位) (2)数码管的作用: 数码管是显示器件,是用来显示数字的. 1.2.数码管的工作原理 (1)数码 ...

  3. 单片机动态从00到99C语言,用51单片机控制 2位数码管动态显示 00 ~ 99

    ;用51单片机控制 2位数码管动态显示 00 ~ 99. ;从 00 开始显示,显示数字每隔一段时间加 1,一直到 99,然后回到 00. ;从 00 到 10 每隔 100ms 加 1: ;从 10 ...

  4. 单片机数码管从00到99C语言_用51单片机控制 2位数码管动态显示 00 ~ 99。

    ;用51单片机控制 2位数码管动态显示 00 ~ 99. ;从 00 开始显示,显示数字每隔一段时间加 1,一直到 99,然后回到 00. ;从 00 到 10 每隔 100ms 加 1: ;从 10 ...

  5. 51单片机七段数码管显示时钟无按键控制—①—74HC595版

    参考链接: 51单片机七段数码管显示时钟加按键控制-③-74HC595版 51单片机七段数码管显示时钟加按键控制-②-74HC595版 文章目录 一.实验内容: 二.实验分析: 三.仿真图: 四.源代 ...

  6. 51单片机控制的数字温度计 PROTEUS 和51单片机教程

    51单片机控制的数字温度计 总览部分 MCU部分 显示部分 开仿真以后实时显示温度 因为这个程序比较简单,我就直接上代码了,有不明白的请看我以前的文章,谢谢哦! 参考代码如下: #include &q ...

  7. 51单片机控制TB6600驱动器驱动42步进电机

    51单片机控制TB6600驱动器驱动42步进电机 第一次 功能实现目标 硬件简介 硬件连接 程序代码 第一次 以前总是看别人写的博客,通过别人的博客解决了我很多问题,从中也学到了各种知识,虽然不是很系 ...

  8. 51单片机学习 数码管 倒计时

    51单片机学习 数码管 倒计时 简介 1.硬件部分 普中单片机 开发板 (138译码器控制)数码管 2.软件部分 keil软件 硬件部分 138译码器 简介 74LS138 为3 线-8线译码器,共有 ...

  9. 单片机学习笔记————51单片机实现数码管中的倒计时程序

    一.使用proteus绘制简单的电路图,用于后续仿真 二.编写程序 /***************************************************************** ...

最新文章

  1. 大数据在犯罪预防中有独特价值
  2. CF1019E Raining season
  3. 13走了,14来了,新的一年,新的开始。
  4. 如何使用.NET配置文件(二)
  5. 北斗导航 | 坐标转换:ECEF转LLA:GPS坐标系:WGS84(matlab代码)
  6. mysql show processlist host_show processlist host 为 百分号(%)
  7. Java 进栈出栈的过程
  8. struts2 标签单选框_Struts 2 UI标签–表单,复选框,单选,选择,提交
  9. elf文件格式_Android so(ELF) 文件解析
  10. 鸿蒙系统微信红包,鸿蒙道红包版
  11. [算法]圆圈中最后剩下的数
  12. SpringBoot常见面试题总结二
  13. KB2999226安装提示 此更新不适用你的计算机
  14. 数据可视化API之弧线图实现
  15. sql分组排序mysql_SQL分组排序
  16. SpringBoot+MyBatisPlus+Vue+ElementUI实现前后端分离的物业管理系统
  17. python解最强大脑: 黑白迭代
  18. Python与MySQL交互——简易用户注册登录
  19. 用GATK进行二代测序数据 SNP Calling 流程:(二)bwa比对和HaplotypeCaller 变异检测
  20. kvm 监控内存,替换页表(linux版的win VT晶核)(这个整复杂了,不用小内核也可以实现,留着吧,主要记录了bootLoad的启动过程)

热门文章

  1. 用css3伪类画小三角
  2. 联想7400打印机如何与手机连到一起_联想打印机力度空前的眼红优惠来袭 这波福利可不能再错过了...
  3. 【演示文稿制作动画】Focusky教程 | 元素分组
  4. 向锦华北京个人演唱会倾情上演,用歌声唱出音乐梦想
  5. C语言get和put
  6. vpi_register_cb 注册自定义的回调函数
  7. UTC时间格式化(JAVA) 时间带T Z
  8. this指针的作用和用法
  9. iOS 内购StoreKit 框架介绍
  10. 2021年中国民爆行业企业经营情况及主要产品产销量分析:工业雷管、工业炸药产销量均有所下滑[图]