数码管模块

  • 实验简介
    • 实验原理图
    • 实验原理
  • 实验程序
    • 静态显示
      • 奇数位数码管静态显示'1'
      • 奇数位数码管静态显示'-.'
      • 奇数位数码管静态显示'P'
      • 奇数位数码管静态显示'9.'
    • 动态显示
      • 数码管从左往右依次显示数字
      • 8个数码管同时显示不同的数字
      • 8位数码管显示输入的内容

实验简介

软件控制,实现数码的静态和动态显示效果

实验原理图

实验原理

  • 数码管介绍:LED数码管为单片机中的显示器之一,有共阳和共阴数码管,CT107D单片机中所用的为共阳数码管, 即7段数码管(a,b,c,d,e,f,g)和一个小数点(dp)的共8个管脚有一端共同接到VCC上。CT107D单片机上有两个多位数码管(4位一体),两个4位一体的多位数码管内部的公共端(com)是独立的,公共端又叫做“位选线”,而负责显示什么数字的段线(a,b,c,d,e,f,g)和小数点(dp)全部是连在一起的,独立的公共端控制哪一位数码管亮(选择哪一位亮的过程我们称之为“位选”),而显示亮什么内容(亮什么内容这个过程我们称之为“段选”)

  • 基本原理:数码管显示有两种显示方式,静态显示方式和动态显示方式。静态显示的主要特征为:每个数码管的段选必须接一个8位数据线来保持显示的字形码。送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。因此我们也就知道了静态显示的显示弊端所在,要么只显示一位数码管,否则多位数码管同时显示时,必须显示相同内容。而动态显示,则是一定程度上弥补了静态显示的显示弊端。

  • 实现须知:动态显示,利用减少段选线,分开位选线,利用位选线不同时选择通断,改变段选数据来实现的。利用人眼的视觉暂留现象,即光对视网膜所产生的视觉在光停止作用后,仍保留一段时间的现象,正常情况人眼只能分辨变化超过 24ms 间隔的运动。根据锁存器的芯片手册,锁存端LE得为高电平,即得控制Y7C,Y6C为高电平,下图知Y7C,受Y7控制,Y6C,受Y6控制,WR输入固定为低电平(0),了解数字电路中或非门知识,我们得使得Y6,Y7输出低电平,才能使的Y6C,Y7C输出高电平,而Y6,Y7为74HC138芯片(38译码器)的两个个管脚,查阅对应芯片手册可知,其真值表满足C = 1,B = 1,A = 0(Y6),C = 1,B = 1,A = 1(Y7)(对应管脚P27,P26,P25),使得Y6,Y7输出低电平,同时我们得保证管脚P2的其他的管脚(0~4)保持原来的状态。


实验程序

静态显示

奇数位数码管静态显示’1’

 //config.h--用于声明头文件,声明函数,声明一些经常使用的变量或难书写的语句#ifndef _CONFIG_H#define _CONFIG_H#include <STC15F2K60S2.H>//对应芯片函数头文件,定义了一些特殊功能寄存器//typedef unsigned char uchar;#define uchar unsigned char#endif
//main.c文件
#include "config.h"//共阳数码管0~9的段选码
uchar smgduan[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};void led_init()//LED初始化为全部不亮
{P2 = (P2 & 0x1f) | 0x80;//初始化锁存器的Y4CP0 = 0xff;
}void closeBeep()
{P2 = (P2 & 0x1f) | 0xa0;  //开启译码器的Y6端口,同时不改变其他管脚状态P0 &= 0xaf;//1010 1111//关闭蜂鸣器和继电器,P06和P04端口分贝输入,输出低电平P2 &= 0x1f;//关闭译码器
}void digDisplay()
{//Y6C输入高电平,选中位选,使得1,3,5,7个数码管亮,给对应管脚高电平即可P2 = (P2 & 0x1f) | 0xc0;P0 = 0x55; //0101 0101//Y7C输入高电平,选中段选,使得1,3,5,7数码管输出4 个 1,1的共阳数码管码值为0xf9P2 = (P2 & 0x1f) | 0xe0;P0 = 0xf9;//1111 1001
}void main()
{closeBeep();led_init();        digDisplay();   while(1);
}

奇数位数码管静态显示’-.’

  • 上图示,标记出来对于一个数码管中的8个LED灯的排列顺序,为了显示’-.‘,对于CT107D上的共阳极数码管我们需要将段选线g 和 小数点位dp置为低电平(0),对应的十六进制与二进制表示为0x3f = (0011 1111)

主要代码改动部分为下(仅在main.c中改变即可)

//共阳数码管0~9的段选码 + 加上显示 “-.’’ 和 P
uchar smgduan[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x3f, 0x8c};void digDisplay()
{//Y6C输入高电平,选中位选,使得1,3,5,7个数码管亮,给对应管脚高电平即可P2 = (P2 & 0x1f) | 0xc0;P0 = 0x55; //0101 0101//Y7C输入高电平,选中段选,使得1,3,5,7数码管输出4 个 -.,-.的共阳数码管码值为0x3fP2 = (P2 & 0x1f) | 0xe0;P0 = smgduan[10];//0x3f = 0011 1111
}

奇数位数码管静态显示’P’

  • 上图示,标记出来对于一个数码管中的8个LED灯的排列顺序,为了显示’P‘,对于CT107D上的共阳极数码管我们需要将段选线a,b,e,f,g置为低电平(0),对应的十六进制与二进制表示为0x8c= (1000 1100)

主要代码改动部分为下(仅在main.c中改变即可)


//共阳数码管0~9的段选码 + 加上显示 “-.’’ 和 P
uchar smgduan[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x3f, 0x8c};void digDisplay()
{//Y6C输入高电平,选中位选,使得1,3,5,7个数码管亮,给对应管脚高电平即可P2 = (P2 & 0x1f) | 0xc0;P0 = 0x55; //0101 0101//Y7C输入高电平,选中段选,使得1,3,5,7数码管输出4 个 P,P的共阳数码管码值为0x8cP2 = (P2 & 0x1f) | 0xe0;P0 = smgduan[11];//0x8c == 1000 1100
}

奇数位数码管静态显示’9.’

  • 为了不改变段码表过多次,我们可以使用位运算,来得到一个新的段码
    主要代码改动部分为下(仅在main.c中改变即可)
 //奇数位的位选P2 = (P2 & 0x1f) | 0xc0;P0 = 0x55;//在原来段选表的基础之上利用位运算构造出'9.'P2 = (P2 & 0x1f) | 0xe0;P0 = smgduan[9] & 0x7f;

动态显示

数码管从左往右依次显示数字

//config.h--用于声明头文件,声明函数,声明一些经常使用的变量或难书写的语句
#ifndef _CONFIG_H
#define _CONFIG_H
#include <STC15F2K60S2.H>//对应芯片函数头文件,定义了一些特殊功能寄存器
#include<intrins.h>//使用_nop_()函数所需的头文件
//typedef unsigned char uchar;
#define uchar unsigned charvoid Delay300ms();       //@12.000MHz#endif
//main.c文件--8个数码管从左往右依次显示,0~7八个数字
#include "config.h"//共阳数码管0~9的段选码
uchar smgduan[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//共阳数码管1 ~ 8的位选码
uchar smgwei[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};void led_init()//LED初始化为全部不亮
{P2 = (P2 & 0x1f) | 0x80;P0 = 0xff;
}void closeBeep()
{P2 = (P2 & 0x1f) | 0xa0;  //开启译码器的Y6端口,同时不改变其他管脚状态P0 &= 0xaf;//1010 1111//关闭蜂鸣器和继电器,P06和P04端口分贝输入,输出低电平P2 &= 0x1f;//关闭译码器
}void digDisplay()
{uchar i;for (i = 0; i < 8; i++){//位选,单次选中一个数码管P2 = (P2 & 0x1f) | 0xc0;P0 = smgwei[i];//段选P2 = (P2 & 0x1f) | 0xe0;P0 = smgduan[i];//消隐,给足显示的时间Delay300ms();//初始化P2 = P2 & 0x1f;P0 = 0x00;}
}void main()
{led_init();    closeBeep();while(1){digDisplay();  }
}void Delay300ms()      //@12.000MHz
{unsigned char i, j, k;_nop_();_nop_();i = 14;j = 174;k = 224;do{do{while (--k);} while (--j);} while (--i);
}

8个数码管同时显示不同的数字

//在上面的基础上,主要改动的代码部分,config.h文件里面对延时3000u函数进行声明一下即可
void digDisplay()
{uchar i;for (i = 0; i < 8; i++){//位选,单次选中一个数码管P2 = (P2 & 0x1f) | 0xc0;P0 = smgwei[i];//段选P2 = (P2 & 0x1f) | 0xe0;P0 = smgduan[i];//给足显示的时间Delay3000us();//端口初始化,不弄也可以,下次进入循环时也会自动改变P2 = P2 & 0x1f;P0 = 0x00;}
}void main()
{led_init();    closeBeep();while(1){digDisplay();  }
}void Delay3000us()     //@12.000MHz
{unsigned char i, j;i = 36;j = 1;do{while (--j);} while (--i);
}

8位数码管显示输入的内容

  • config.h文件不变
//main.c文件--8个数码管显示输入的内容
#include "config.h"//共阴数码管段选码
uchar smgduan[] ={                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1//共阳数码管1 ~ 8的位选码
uchar smgwei[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};uchar tab[8];//全局变量存储即将要显示的内容void led_init()//LED初始化为全部不亮
{P2 = (P2 & 0x1f) | 0x80;P0 = 0xff;
}void closeBeep()
{P2 = (P2 & 0x1f) | 0xa0;  //开启译码器的Y6端口,同时不改变其他管脚状态P0 &= 0xaf;//1010 1111//关闭蜂鸣器和继电器,P06和P04端口分别输入,输出低电平P2 &= 0x1f;//关闭译码器
}void digDisplay(uchar pos, letter)//数码管的哪一位,显示什么字母(letter)
{//Y6C输入高电平,选中一个位选,给对应管脚高电平即可P2 = (P2 & 0x1f) | 0xc0;P0 = smgwei[pos - 1];//Y7C输入高电平,选中段选,注意共阳数码管使用共阴数码管的码值需要加个取反符号P2 = (P2 & 0x1f) | 0xe0;P0 = ~smgduan[letter];//消隐Delay3000us();P2 &= 0x1f;//P27 ~ P25清零P0 = 0xff;
}void display()
{uchar i;for (i = 0; i < 8; i++){digDisplay(i + 1, tab[i]);}
}void display_ds(uchar p1, p2, p3, p4, p5, p6, p7, p8)
{tab[0] = p1;tab[1] = p2;tab[2] = p3;tab[3] = p4;tab[4] = p5;tab[5] = p6;tab[6] = p7;tab[7] = p8;
}void main()
{led_init();    closeBeep();while(1) {display();//显示进行初始化display_ds(2, 0, 2, 2, 0, 1, 2, 0);//显示:2022年01月20号}
}void Delay3000us()     //@12.000MHz
{unsigned char i, j;i = 36;j = 1;do{while (--j);} while (--i);
}

《蓝桥杯CT107D单片机竞赛板》:数码管模块相关推荐

  1. 《蓝桥杯CT107D单片机竞赛板》:蜂鸣器模块

    蜂鸣器模块 实验简介 实验原理图 实验原理 实验程序 关闭蜂鸣器与继电器 简易报警器原理 实验简介 采用软件方式,使得CT107D单片机竞赛板上的蜂鸣器和继电器分别不发声和不吸附. 实验原理图 实验原 ...

  2. 《蓝桥杯CT107D单片机竞赛板》:独立按键模块

    独立按键模块 实验简介 实验原理图 实验原理 实验程序 按下独立键盘上每一个键,对应LED状态取反 按键值在数码管上显示 S4长按显示4,短按显示0,其他显示原来的键值 实验简介 CT107D单片机开 ...

  3. 《蓝桥杯CT107D单片机竞赛板》:矩阵键盘模块

    矩阵键盘模块 实验简介 实验原理图 实验原理 实验程序 显示对应的按键值 2 * 2变式矩阵按键实现独立按键 2 * 2变式矩阵键盘控制蜂鸣器 2 * 2变式矩阵按键控制数码管做加减操作 另一种易理解 ...

  4. 《蓝桥杯CT107D单片机竞赛板》:中断模块

    中断模块 实验简介 实验原理图 实验原理 实验程序 外部中断控制L1与L2的状态反转 外部中断控制蜂鸣器和继电器 实验简介 外部中断控制LED亮灭,蜂鸣器是否发声,继电器是否吸附. 实验原理图 注:原 ...

  5. 蓝桥杯CT107D 单片机编程例题

    一.按键 #include "stc15f2k60s2.h" #define InitHC138(n) {P2 = P2 & 0x1f | (n << 5);} ...

  6. 蓝桥杯 — CT107D单片机综合训练平台原理图

    目录 1.独立与矩阵按键原理图 2.LED 灯原理图 3.数码管原理图 4

  7. 蓝桥杯51单片机(一)超声波模块

    使用超声波模块并通过数码管显示距离 #include<stc15f2k60s2.h> #include"intrins.h" #define somenop {_nop ...

  8. 2020蓝桥杯之单片机设计与开发(1)——CT107D开发板了解与准备

    在快放假期间开始准备蓝桥杯,也感谢我的好朋友带我一起去了解这个比赛. 首先从单片机开始,比赛的时候使用的开发板是官方指定的CT107D单片机竞赛板V20. 先看上面的官方指定开发版原理图,包含了开发板 ...

  9. 蓝桥杯(单片机开发)训练笔记

    各模块电路分析 电源+CH341模块 电路功能:主要给单片机提供电源和UART串口调试和下载程序.TENTEN 这里整块开发板采用了双路供电.一路采用DC电源接口直接输入5V直流电压:另一路采用USB ...

最新文章

  1. 如何通过简化标题来提升核心关键词排名?
  2. 自定义windows开机声音
  3. pcb入门之新建工程
  4. C++实现插入排序(附完整源码)
  5. 引用opencv异常
  6. 第一阶段意见汇总以及改进
  7. 三年的总结(技术篇)
  8. 指针变量本质(四十三)
  9. linux命令:常用shell命令及应用
  10. 婚姻是一堂需要认真学习的课程
  11. 结构体typedef struct和struct
  12. 还担心学习AI没有数学基础吗?读完它们,你就有了!!!
  13. 使用daemontools监控zookeeper,storm等进程
  14. 云服务器下行_阿里云ECS服务器下行带宽和上行带宽详解及选择
  15. Docer中使能GPU,GDB,perf
  16. 互联网公司发送短信为什么通过第三方短信平台,而不是通过运营商。
  17. linux 无线网络连接不上网,linux无法连接wifi,不显示wifi
  18. matlab做二元garch m,多元garch模型的matlab程序如何运行?能否举例说明下啊,希望高手指点...
  19. 删除指定位置的元素(数组)
  20. mongodb4.0学习总结二(read concern)

热门文章

  1. libcef-cefsimple简单解析-涉及对象及关键类分析-CefApp-CefClient-CefDisplayHandler(七)
  2. 7个 Python小项目,手把手教学——5分钟教会Python新手
  3. 【C语言】排序算法(冒泡排序,选择排序,插入排序,归并排序,快速排序)
  4. 智慧党建系统源码,便利党务工作安排保护数据安全
  5. Android 实现钉钉自动打卡
  6. MVP的使用 + 闪屏页广告
  7. 「2017 山东三轮集训 Day1」Flair
  8. 中国指甲产品市场深度研究分析报告
  9. 大连东软计算机网络,计算机网络 体系结构及协议 - 大连东软信息学院.pdf
  10. python爬虫之--爬取当当网商品信息