琴行网站建设方案,wordpress缩略图圆角阴影,网站建设都用什么软件,wordpress错误集锦内容
静态数码管#xff1a;最左端显示0 动态数码管#xff1a;从左到右#xff0c;显示0-9
数码管简介
数码管是一种半导体发光器件#xff0c;其基本单元是发光二极管#xff1b;
类别#xff1a;
数码管按段数可分为七段数码管和八段数码管#xff0c;八段数码管…内容
静态数码管最左端显示0 动态数码管从左到右显示0-9
数码管简介
数码管是一种半导体发光器件其基本单元是发光二极管
类别
数码管按段数可分为七段数码管和八段数码管八段数码管比七段数码管多一个发光二极管单元也就是多一个小数点DP这个小数点可以更精确的表示数码管想要 显示的内容按能显示多少个8可分为1位、2位、3位、4位、5位、6位、7位等数码管按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管
共阳数码管和共阴数码管
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管共阳数码管在应用时应将公共极COM接到5V当某一字段发光二极管的阴极为低电平时相应字段就点亮当某一字段的阴极为高电平时相应字段就不亮共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管共阴数码管在应用时应将公共极COM接到地线GND上当某一字段发光二极管的阳极为高电平时相应字段就点亮当某一字段的阳极为低电平时相应字段就不亮
显示原理
我们开发板上使用的数码管是2个四位一体的共阴极数码管即8个LED的阳极全部并联一起引出阴极分别引出如A、B、……、DP
如果要让共阴数码管显示数字0即对应的段ABCDEF要点亮即给它高电平其他的段熄灭即给它低电平其他的数字显示方式一样
共阴和共阳数码管的0-F段码数据表
共阴数码管码表
0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f0x770x7c0x390x5e0x790x710x000123456789ABCDEF无显示
共阳数码管码表
0xC00xF90xA40xB00x990x920x820xF80x800x900x880x830xC60xA10x860x8E0xFF0123456789ABCDEF无显示
从上述共阳和共阴码表中不难发现它们的数据正好是相互取反的值
共阴数码管数字0段码0x3f其二进制是0011 1111该段码数据由来是将dp段做为最高位a段作为最低位共8位正好和51单片机的一组端口数一样因此可以直接使用某一组端口控制数码管的段选数据口比如P0口
静态数码管显示原理
每个数码管的段选接一个8位数据线来保持显示的字形码当送入一次字形码后显示字形可一直保持直到送入新字形码为止
优点是占用CPU时间少显示便于监测和控制
缺点是硬件电路比较复杂成本较高比如使用4个静态数码管那么就得32个IO来控制这对51单片机来说是无法承受的
动态数码管显示原理
将所有数码管的段选线并联在一起由位选线控制是哪一位数码管有效
选亮数码管采用轮流显示的方式利用发光管的余辉和人眼视觉暂留作用使人的感觉好像各位数码管同时都在显示
动态显示的亮度比静态显示要差一些所以在选择限流电阻时应略小于静态显示电路的电阻
原理图
线路图
由原理图可以看出P00-07管脚控制数码管显示的图形P22-24控制哪个数码管被点亮
因为单片机IO口外部都增加了外部上拉电阻因此P22、P23、P24引脚默认就是高电平根据74HC138译码器输出特点此时Y7脚输出有效即LED8点亮为低电平
而数码管的段选a-dp连接在74HC245驱动芯片输出口由P0端口控制所以只要控制P0口输出高电平SMG1最左边那个数码管默认就可以显示
静态数码管
思路
让P0口设置为0的的段码数据即可在最左端显示数字0
编码
main.c
/** Description: 静态数码管-最左端显示0*/
#include reg52.htypedef unsigned int u16; // 对系统默认数据类型进行重定义
typedef unsigned char u8;#define SMG_A_DP_PORT P0 // 使用宏定义数码管段码口// 共阴极数码管显示0~F的段码数据
u8 gsmg_code[17] {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};void main()
{SMG_A_DP_PORT gsmg_code[0]; // 将数组第1个数据赋值给数码管段选口while (1){}
}编译和结果
按F7编译无错误生成.hex文件使用pz-isp将hex文件下载到单片机
结果数码管最左端显示0
动态数码管
思路
人的肉眼正常情况下只能分辨变化超过24ms间隔的运动
所以我们可以循环点亮各个数码管并且这个循环间隔不超过24ms这样看起来就是每个数码管都被点亮了
编码
main.c
/** Description: 动态数码管-从左到右显示0-9*/
#include reg52.htypedef unsigned int u16; // 对系统默认数据类型进行重定义
typedef unsigned char u8;#define SMG_A_DP_PORT P0 // 使用宏定义数码管段码口// 定义数码管位选信号控制脚
sbit LSA P2 ^ 2;
sbit LSB P2 ^ 3;
sbit LSC P2 ^ 4;// 共阴极数码管显示0~F的段码数据
u8 gsmg_code[17] {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};/*** description: 延时函数循环一次大约10us* param {u16} ten_us* return {*}*/
void delay_10us(u16 ten_us)
{while (ten_us--);
}/*** description: 循环点亮各个数码管* return {*}*/
void smg_display(void)
{u8 i 0;for (i 0; i 8; i){switch (i) // 位选{case 0:LSC 1;LSB 1;LSA 1;break;case 1:LSC 1;LSB 1;LSA 0;break;case 2:LSC 1;LSB 0;LSA 1;break;case 3:LSC 1;LSB 0;LSA 0;break;case 4:LSC 0;LSB 1;LSA 1;break;case 5:LSC 0;LSB 1;LSA 0;break;case 6:LSC 0;LSB 0;LSA 1;break;case 7:LSC 0;LSB 0;LSA 0;break;}SMG_A_DP_PORT gsmg_code[i]; // 传送段选数据delay_10us(100); // 延时一段时间等待显示稳定SMG_A_DP_PORT 0x00; // 消影}
}void main()
{while (1){smg_display();}
}编译和结果
按F7编译无错误生成.hex文件使用pz-isp将hex文件下载到单片机
结果