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;//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单片机-控制数码管相关推荐
- 51单片机控制数码管显示
前言 今天学习51单片机的数码管模块 我的学习板上面的数码管是4为一体由12个引脚控制的模块. 今天就编程控制它显示我们想要的输出. 数码管本质上是由8个LED拼接而成的,他们分别叫做a,b,c,d, ...
- 二、51单片机控制数码管
1.数码管 1.1.什么是数码管 (1)数码管的外观: 数码管可分为单个的,联排的(2位.4位.8位) (2)数码管的作用: 数码管是显示器件,是用来显示数字的. 1.2.数码管的工作原理 (1)数码 ...
- 单片机动态从00到99C语言,用51单片机控制 2位数码管动态显示 00 ~ 99
;用51单片机控制 2位数码管动态显示 00 ~ 99. ;从 00 开始显示,显示数字每隔一段时间加 1,一直到 99,然后回到 00. ;从 00 到 10 每隔 100ms 加 1: ;从 10 ...
- 单片机数码管从00到99C语言_用51单片机控制 2位数码管动态显示 00 ~ 99。
;用51单片机控制 2位数码管动态显示 00 ~ 99. ;从 00 开始显示,显示数字每隔一段时间加 1,一直到 99,然后回到 00. ;从 00 到 10 每隔 100ms 加 1: ;从 10 ...
- 51单片机七段数码管显示时钟无按键控制—①—74HC595版
参考链接: 51单片机七段数码管显示时钟加按键控制-③-74HC595版 51单片机七段数码管显示时钟加按键控制-②-74HC595版 文章目录 一.实验内容: 二.实验分析: 三.仿真图: 四.源代 ...
- 51单片机控制的数字温度计 PROTEUS 和51单片机教程
51单片机控制的数字温度计 总览部分 MCU部分 显示部分 开仿真以后实时显示温度 因为这个程序比较简单,我就直接上代码了,有不明白的请看我以前的文章,谢谢哦! 参考代码如下: #include &q ...
- 51单片机控制TB6600驱动器驱动42步进电机
51单片机控制TB6600驱动器驱动42步进电机 第一次 功能实现目标 硬件简介 硬件连接 程序代码 第一次 以前总是看别人写的博客,通过别人的博客解决了我很多问题,从中也学到了各种知识,虽然不是很系 ...
- 51单片机学习 数码管 倒计时
51单片机学习 数码管 倒计时 简介 1.硬件部分 普中单片机 开发板 (138译码器控制)数码管 2.软件部分 keil软件 硬件部分 138译码器 简介 74LS138 为3 线-8线译码器,共有 ...
- 单片机学习笔记————51单片机实现数码管中的倒计时程序
一.使用proteus绘制简单的电路图,用于后续仿真 二.编写程序 /***************************************************************** ...
最新文章
- 大数据在犯罪预防中有独特价值
- CF1019E Raining season
- 13走了,14来了,新的一年,新的开始。
- 如何使用.NET配置文件(二)
- 北斗导航 | 坐标转换:ECEF转LLA:GPS坐标系:WGS84(matlab代码)
- mysql show processlist host_show processlist host 为 百分号(%)
- Java 进栈出栈的过程
- struts2 标签单选框_Struts 2 UI标签–表单,复选框,单选,选择,提交
- elf文件格式_Android so(ELF) 文件解析
- 鸿蒙系统微信红包,鸿蒙道红包版
- [算法]圆圈中最后剩下的数
- SpringBoot常见面试题总结二
- KB2999226安装提示 此更新不适用你的计算机
- 数据可视化API之弧线图实现
- sql分组排序mysql_SQL分组排序
- SpringBoot+MyBatisPlus+Vue+ElementUI实现前后端分离的物业管理系统
- python解最强大脑: 黑白迭代
- Python与MySQL交互——简易用户注册登录
- 用GATK进行二代测序数据 SNP Calling 流程:(二)bwa比对和HaplotypeCaller 变异检测
- kvm 监控内存,替换页表(linux版的win VT晶核)(这个整复杂了,不用小内核也可以实现,留着吧,主要记录了bootLoad的启动过程)
热门文章
- 用css3伪类画小三角
- 联想7400打印机如何与手机连到一起_联想打印机力度空前的眼红优惠来袭 这波福利可不能再错过了...
- 【演示文稿制作动画】Focusky教程 | 元素分组
- 向锦华北京个人演唱会倾情上演,用歌声唱出音乐梦想
- C语言get和put
- vpi_register_cb 注册自定义的回调函数
- UTC时间格式化(JAVA) 时间带T Z
- this指针的作用和用法
- iOS 内购StoreKit 框架介绍
- 2021年中国民爆行业企业经营情况及主要产品产销量分析:工业雷管、工业炸药产销量均有所下滑[图]