51单片机(十)—— 8位数码管-数码管扫描
一、原理介绍
关于数码管的控制电路,在《51单片机(八)》中有详细的介绍,硬件电路如下图所示。
在这个实验中,我们对数码管进行扫描。在进行实验时,需要将单片机的P00~P07引脚与J44相连。接口的对应关系是(P00—D0),……,(P07—D7)。将单片机的P10和P11引脚与J45相连,P10与J45上的DM对应,P11与WM对应。
二、实例介绍
这个实验的代码如下所示
#include<reg52.h> //包含头文件,一般情况不需要改动#define DATA P0 //定义数据端口 程序中遇到DATA 则用P0口 替换
sbit DM = P1^0; //定义锁存使能端口 段锁存
sbit WM = P1^1; //定义锁存使能端口 位锁存unsigned char BJTY_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0123456789
unsigned char BJTY_WeiMa[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char m=0;/********************************************************************/
/* 延时函数 */
/* 延时时间的计算对应单片机12MHz的晶振 */
/* x为延时的ms数,例:x为10时,延时时间约为10ms */
/********************************************************************/
void delay1ms(unsigned int x)
{unsigned int i,j;for(j=0;j<x;j++)for(i=0;i<123;i++);
}/********************************************************************/
/* 主函数 */
/********************************************************************/
void main(void)
{for(;;) {DATA=0; //清空显示以防重影DM=1; //段锁存DM=0;DATA=BJTY_WeiMa[m]; //取位码 WM=1; //位锁存WM=0;DATA=BJTY_DuanMa[m]; //取段码DM=1; //段锁存DM=0; delay1ms(2); //延时2msm++;if(m==8) //检测8位扫描是否结束m=0; //如扫描完成则从第一个开始再次扫描8位}
}
将程序烧写到单片机中运行,效果如下所示。
1、需要多位数码管显示不同数据时就需要用动态扫描。扫描的方式是,先点亮数码管的第一位,之后点亮第二位,并以此点亮其它位,点亮第八位之后,在转回来点亮第一位,如此反复点亮。动态扫描速度很快,由于人眼的视觉暂留,看到的效果是八位数码管都是同时点亮的。所谓“视觉暂留”是指人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。
由程序中可以看出,向数码管赋值一位数据后,延时2ms,
delay1ms(2); //延时2ms
显示8位数据,总共耗时16ms,人眼的视觉暂留时间约为100ms,因此,虽然单一时刻只有一个数码管点亮,但是人看到的效果是8位数码管全部点亮,并且显示不同的数字。
2、if语句
在这个程序中使用了if语句。
if(m==8) //检测8位扫描是否结束
m=0; //如扫描完成则从第一个开始再次扫描8位
这个if语句的作用是判断m是否等于8,如果是则,点亮了第八位数码管,则令m=0,下一个周期点亮第一位数码管。
if语句可以构成分支结构。它根据给定的条件进行判断,以决定执行某个分支程序段。C语言的if语句有三种基本形式。
第一种形式为基本形式:
if(表达式)
语句
其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。其过程可表示为下图。
第二种形式为: if-else
if(表达式)
语句1;
else
语句2;
其语义是:如果表达式的值为真,则执行语句1,否则执行语句2。其过程可表示为下图。
第三种形式为if-else if-else形式
前二种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else if-else语句,其一般形式为:
if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
…
else if(表达式m-1)
语句m-1;
else
语句m;
其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句m。然后继续执行后续程序。if-else if-else语句的执行过程如下图所示。
关于锁存器的操作代码,可以参考《51单片机(九)》中的讲解。
51单片机(十)—— 8位数码管-数码管扫描相关推荐
- 单片机动态从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单片机的8位数码管显示的可调时电子时钟
基于51单片机的8位数码管显示的可调时电子时钟 本人大二本科生,第一次发东西,功能比较简单,代码有点复杂,希望能有大神指正. 基于51单片机的不可调时间的时钟显示,晶振为11.0592MHZ,60H ...
- 51单片机入门教程(3)——数码管显示
51单片机入门教程(3)--数码管显示 一.LED数码管简介 二.数码管静态显示 三.数码管动态显示 特别鸣谢:HFUTer-朱聪强 一.LED数码管简介 LED数码管(LED Segment Dis ...
- 如何使用keil进行编译并且用proteus进行51单片机仿真实现0~F的数码管字符显示
文章目录 一.目的: 二.在keil中进行程序编译 三.在proteus上画出电路图 四.将keil中编译的hex文件在proteus电路图中进行仿真运行 一.目的: 使用keil进行编译并且用pro ...
- 【Proteus仿真】51单片机+74HC164驱动两个四位数码管
[Proteus仿真]51单片机+74HC164驱动两个四位数码管 Proteus仿真 程序代码 #include <STC89C5xRC.H>sbit DAT=P1^1; sbit CL ...
- 51单片机实现三位十进制数加减乘除运算
51单片机实现三位十进制数加减乘除运算 一.题目 51单片机IO接口作业 请将附件给出的Proteus图用51单片机完成一个计算器功能. 1.显示采用动态分时8位共阳数码管输出. 2.采用4*4矩阵键 ...
- c语言编程TLC2543AD采集,51单片机驱动12位AD转换TLC2543电路图+程序
51单片机驱动12位AD转换TLC2543电路图+程序 2015-06-18 16:51:15 来源:51hei void resultvolt() { volt=volt*5000.0/4334 ...
- 基于51单片机实现4位数码管动态显示
单片机入门学习记录(一) 硬件配置: 主控:STC89C52单片机 显示器件:四位一体数码管 操作器件:点动式独立按键SB1.SB2.SB3.SB4 *选配器件:蜂鸣器 功能要求: 1)开机自检:四位 ...
- 51单片机入门教程(3)——数码管显示学号
目录 1.数码管简介 2.静态显示 3.动态显示 4.小结 相信经过了流水灯的实现,大家已经弄清楚了Keil和Proteus是如何联动使用的,并且对51单片机也有了一定的认识,在这一章里,我带大家利用 ...
最新文章
- 取消打开命令行进入默认anaconda的环境
- 理解T-SQL: 存储过程
- C# 模拟一个处理消息队列的线程类 Message Queue
- JAVA获取程序/jar包所在路径
- 超图Cesium二三维切换
- LINUX编译automake
- 基于Docker swarm 集群搭建SSR 学习
- 王一博、肖战、吴宣仪、杨紫,2019明星沸点榜,谁的颜值更高,Python告诉你
- 一条命令解决macmnsvc.exe占用8081端口的问题
- Flutter HotRealod详解
- AOJ-AHU-OJ-675 定位赛
- Pika 2.3.5 升级 3.0.16
- Intel(R) 6 Series/C200 Series Chipset Family USB Enhanced Host Controller - 1C26出现感叹号,USB无法使用
- norms matlab
- 虚幻引擎4艺术大师 - 中文版免费分享
- rviz点云渲染卡顿问题
- linux下输入ls显示时间格式,【Linux基础】linux下修改ls显示的时间格式
- 【vbs脚本】02.高级
- 群晖docker部署带web容器的端口配置
- iframe在html中怎么写,html中如何使用iframe标签链接网址呢?