10_关于数码管动态扫描的问题
- 格式:doc
- 大小:111.00 KB
- 文档页数:3
实验三准时器和中止实验一、实验目的1、学习 51 单片机内部准时器的使用方法。
2、掌握中止办理程序的方法。
3、掌握数码管与单片机的连结方法和简单显示编程方法。
4、学习和理解数码管动向扫描的工作原理。
二、实验内容1、使用准时器T0,准时1秒,控制P1口发光管循环点亮。
2、使用准时器 T0,准时 1 秒,控制 1 个数码管循环显示数字 0~9,每秒钟数字加一。
3、使用软件准时 1 秒,控制 2 个数码管循环显示秒数 0~59,每秒钟数字加一。
4、使用准时器 T0,准时 1 秒,控制 2 个数码管循环显示秒数 0~59,每秒钟数字加一。
三、实验电路图四、实验说明1、数码管的基本观点(1)段码数码管中的每一段相当于一个发光二极管, 8 段数码管则拥有 8 个发光二极管。
本次实验使用的是共阴数码管,公共端是 1、6,公共端置 0,则某段选线置 1 相应的段就亮。
公共端1 控制左面的数码管;公共端6 控制右边的数码管。
正面看数码管的引脚、段选线和数据线的对应关系为:图1数码管封装图图2数据线与数码管管脚连结关系段码是指在数码管显示某一数字或字符时,在数码管各段所对应的引脚上所加的高低电平按次序摆列所构成的一个数字,它与数码管的种类(共阴、共阳)和与数据线的连结次序相关。
对应数据线D7D6D5D4D3D2D1D0对应显示段e f DP g c d b a显示数字段码00CFH11001111103H0000001125DH0101110135BH01011011493H1001001150DAH1101101060DEH11011110743H0100001180DFH1101111190DBH11011011( 2)位码位码也叫位选,用于选中某一位数码管。
在实验图中要使第一个数码管显示数据,应在公共端 1上加低电平,即便 P2.7 口为 0,而公共端 6上加高电平,即便口为 1。
位码与段码相同和硬件连结相关。
数码管动态扫描实验一、实验目的学习计数器的设计、分析合测试方法。
学习硬件扫描显示电路的设计方法。
二、实验仪器1、PC机2、SW-51PROC单片机综合实验平台三、实验内容编写一段程序,用单片机P0口和P2口的I/O输出去控制8位的数码管显示,实现如下功能:使数码管上显示1、2、3、4、5、6、7、8。
四、实验步骤:1、用Protues设计数码管动态扫描显示电路;2、在KeilC51中编写识别程序,通过后与Protues联合调试;3、启动仿真,观察数码管显示是否正确;4、用Protues设计脉冲计数电路,仿真调试、运行程序并查看效果。
五、电路设计及调试:1、实验电路:2、程序设计与调试:①实验程序:【12345678】#include<reg52.h>#define uintunsigned int#define ucharunsigned charuchar codeDisplsy[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80}; uchar codeTemble[]={0,1,2,3,4,5,6,7};void delay(uint z){uchar t;while(z--) for(t=120;t>0;t--);}void main(){uchar i;P0=0xff;P1=0;while(1){if(i==8)i=0;P1=Temble[i];P0=~Displsy[i+1];i++;delay(2);}}【脉冲计时】#include<reg52.h>#define uintunsigned int#define ucharunsigned charucharcodeDisplay[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar codeTemble[]={0,1,2,3,4,5,6,7};uchar Flag;uint Num;void delay(uint z){uchar t;while(z--) for(t=120;t>0;t--);}voidTest2(void){TR1 = 1;while(1){Num = TH1;Num = Num << 8;Num |= TL1;P1 = 7;P0 = ~Display[Num%10];delay(3);P1 = 6;P0 = ~Display[Num%100/10];delay(3);P1 = 5;P0 = ~Display[Num%1000/100];delay(3);P1 = 4;P0 = ~Display[Num%10000/1000];delay(3);P1 = 3;P0 = ~Display[Num%100000/10000];delay(3);P1 = 2;P0 = ~Display[Num%1000000/100000];delay(3);P1 = 1;P0 = ~Display[Num%10000000/1000000];delay(3);P1 = 0;P0 = ~Display[Num%100000000/1000000];delay(3);}}void main(){TMOD = 0x50;TH1 = 0x00;TL1 = 0x00;EA = 1;ET1 = 1;TR1 = 0;while(1){Test2();}}②调试:③实验结果:1、数字1~8分别显示在8个数码管上,显示无闪烁。
数码管动态扫描原理一、引言数码管是一种常见的数字显示设备,它由多个发光二极管组成,可以显示数字、字母、符号等信息。
数码管动态扫描技术是一种常用的驱动方法,它能够实现多个数码管在同一时刻显示不同的数字,从而节省了硬件资源和功耗。
本文将详细介绍数码管动态扫描原理。
二、数码管基础知识1. 数码管结构数码管由多个发光二极管组成,每个发光二极管代表一个数字或字符。
常用的数码管有共阳极和共阴极两种类型。
共阳极数码管是指所有发光二极管的阳极连接在一起,而共阴极数码管则是指所有发光二极管的阴极连接在一起。
2. 数字编码方式对于一个七段式数码管来说,每个数字都可以用七位二进制代码来表示。
常用的编码方式有BCD编码和ASCII编码等。
三、静态驱动与动态驱动1. 静态驱动静态驱动是指将每个数码管的控制信号直接连接到单片机的IO口上,并通过程序控制IO口输出高低电平来实现数码管的显示。
静态驱动的优点是驱动简单,控制精度高,但缺点是需要大量的IO口资源,不适用于多数码管显示。
2. 动态驱动动态驱动是指将多个数码管的控制信号通过共用的引脚来传输,并通过程序控制引脚输出高低电平来实现数码管的显示。
动态驱动的优点是可以减少硬件资源和功耗,适用于多数码管显示。
四、数码管动态扫描原理1. 原理概述数码管动态扫描原理是指在一定时间内,依次对多个数码管进行刷新并显示不同数字。
具体实现方式为:将每个数码管与一个引脚相连,并通过程序控制该引脚输出高低电平,在一定时间内循环切换各个引脚的状态,从而实现多个数码管之间的切换和显示。
2. 实现步骤(1)将所有数码管连接到单片机IO口;(2)定义一个循环计时器,在一定时间内循环切换各个IO口状态;(3)对于每一个计时器周期内需要显示的数字进行编码;(4)根据编码结果,在每个IO口上输出对应数字需要显示的控制信号;(5)循环刷新各个数码管,实现动态扫描。
五、动态扫描的优化1. 亮度控制由于数码管的发光强度与电流大小成正比,因此可以通过调节每个数码管的亮度来实现不同数字之间的明暗程度差异。
字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。
由于各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。
因此,在同一时刻如果各位数码管的位选线都处于选通状态的话,8位数码管将显示相同的字符。
若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式。
即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。
同时,段线上输出相应位要显示字符的字型码。
这样在同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。
虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但由于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼的视觉印象就会是连续稳定地显示。
数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。
数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。
若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。
所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮字型 dp g f e d c b a 段码0 1 1 0 0 0 0 0 0 0C0H1 1 1 1 1 1 0 0 1 0F9H2 1 0 1 0 0 1 0 0 0A4H3 1 0 1 1 0 0 0 0 0B0H4 1 0 0 1 1 0 0 1 99H5 1 0 0 1 0 0 1 0 92H6 1 0 0 0 0 0 1 0 82H7 1 1 1 1 1 0 0 0 0F8H8 1 0 0 0 0 0 0 0 80H9 1 0 0 1 0 0 0 0 90Ha 1 0 0 0 1 0 0 0 88Hb 1 0 0 0 0 0 1 1 83Hc 1 1 0 0 0 1 1 0 0C6Hd 1 0 1 0 0 0 0 1 0A1HE 1 0 0 0 0 1 1 0 86Hf 1 0 0 0 1 1 1 0 8EH举例:如果你想让图1最右边的数码管显示“0”的话,首先将段码“0C0H”送达P0口,然后将P2.7清为低电平。
数码管动态扫描频率
数码管的动态扫描频率是指数码管在单位时间内刷新显示的次数。
动态扫描频率通常以赫兹(Hz)为单位表示,其数值越高,显示就会越稳定,不易出现闪烁现象。
动态扫描频率受到驱动电路的影响,一般来说,数码管的动态扫描频率应该大于人眼的闪烁融合频率,以确保人眼无法感知到刷新的过程,从而实现稳定的显示效果。
一般来说,动态扫描频率应该大于50Hz,这样人眼就无法察觉到闪烁了。
在设计电子产品时,需要考虑动态扫描频率对功耗的影响。
较高的动态扫描频率会导致驱动电路消耗更多的能量,因此在功耗和显示效果之间需要进行权衡。
另外,动态扫描频率还与数码管的驱动方式有关,常见的有静态驱动和动态驱动两种方式。
静态驱动指所有的数码管同时点亮,而动态驱动则是通过快速切换不同数码管的显示,这也会影响到动态扫描频率的设计和实现。
总的来说,数码管的动态扫描频率是确保显示稳定性和功耗之
间的平衡,需要根据具体的应用场景和产品需求进行合理的设计和选择。
数码管的动态扫描与驱动数码管的基本原理 关于数码管,⼀个单个的数码管可以看做是多个led灯的集合,如下图所⽰其中的8和。
都是LED组成的,通过引脚上电即可点亮不同的LED然后组成不同的数字,这个过程在数码管的设计中叫做段选。
在多个数码管的情况下,需要选择哪个数码管点亮,这个在数码管设计中称作位选,多个数码管可以通过位选和段选完成电⼦时钟设计等功能。
下⾯通过项⽬对于多个数码管进⾏点亮,让其在开发板上显⽰不同的数据。
预计实验现象: 在quartus的in system source and probes editor ⼯具,输⼊需要显⽰在数码管上的数据,则数码管显⽰对应数据。
相关知识点: 数码管动态扫描的实现、in system source and probes editor调试⼯具的使⽤。
设计过程: 1、数码管动态扫描实现。
2、In system sources and probes edit (ISSP)调试⼯具的使⽤ 3、4输⼊查找表,6位输出。
4、分频模块,从系统时钟分频得到1KHz的扫描时钟 5、6选⼀多路选择器,选择为当前数码管的位置。
驱动模块逻辑电路图:下⾯就是照着逻辑电路图来编写程序了。
创建⼯程,添加⽂件module segment(disp_data,rst_n,clk,en ,sel,seg);input clk;//50Minput rst_n;input en;input [23:0]disp_data;output [5:0]sel;//位选(控制哪个数码管亮)output reg [6:0]seg;//段选(控制数码管显⽰什么数据)//分频器的代码,这⾥为了完整,不做多个⽂件来写模块了reg[14:0] diviter_cnt; //25000-1reg clk_1k;reg [5:0]sel_r;reg [3:0]data_temp;//待显⽰数据缓存//⽣成⼀个分频计数器计数always@(posedge clk or negedge rst_n)if (!rst_n)diviter_cnt<=15'd0;else if (!en)diviter_cnt<=15'd0;else if (diviter_cnt==24999)diviter_cnt<=15'd0;elsediviter_cnt<=diviter_cnt+1'b1;//1k扫描时钟⽣成always@(posedge clk or negedge rst_n)if (!rst_n)clk_1k<=1'b0;else if (diviter_cnt==24999)clk_1k<=~clk_1k; //⼤型设计中,这种产⽣分频器的⽅法是不可以的//位选移位寄存器always@(posedge clk_1k or negedge rst_n)if (!rst_n)sel_r<=6'b000_001;else if(sel_r==6'b100_000)sel_r<=6'b000_001;elsesel_r<=sel_r<<1;//设计⼀个6选⼀多路器always@(*)case(sel_r)6'b000_001:data_temp=disp_data[3:0];6'b000_010:data_temp = disp_data[7:4];6'b000_100:data_temp=disp_data[11:8];6'b001_000:data_temp=disp_data[15:12];6'b010_000:data_temp=disp_data[19:16];6'b100_000:data_temp=disp_data[23:20];defaultdata_temp<=4'b0000;endcase//译码器always@(*)case (data_temp)4'h0:seg=7'b1000000;//这⾥按数码管码表来4'h1:seg=7'b1111001;4'h2:seg=7'b0100100;4'h3:seg=7'b0110000;4'h4:seg=7'b0011001;4'h5:seg=7'b0010010;4'h6:seg=7'b0000010;4'h7:seg=7'b1111000;4'h8:seg=7'b0000000;4'h9:seg=7'b0010000;4'ha:seg=7'b0001000;4'hb:seg=7'b0000011;4'hc:seg=7'b1000110;4'hd:seg=7'b0100001;4'he:seg=7'b0000110;4'hf:seg=7'b0001110;endcase//⼆选⼀多路器assign sel=(en)?sel_r:6'b000_000;endmodule编写testbench⽂件来进⾏仿真`timescale 1ns/1ns`define clk_period 20module HXE_tb;reg Clk; //50Mreg Rst_n;reg En; //数码管显⽰使能,1使能,0关闭reg [31:0]disp_data;wire [7:0] sel;//数码管位选(选择当前要显⽰的数码管)wire [6:0] seg;//数码管段选(当前要显⽰的内容)HXE8 HXE8(.Clk(Clk),.Rst_n(Rst_n),.En(En),.disp_data(disp_data),.sel(sel),.seg(seg));initial Clk = 1;always#(`clk_period/2) Clk = ~Clk;initial beginRst_n = 1'b0;En = 1;disp_data = 32'h12345678;#(`clk_period*20);Rst_n = 1;#(`clk_period*20);#20000000;disp_data = 32'h87654321;#20000000;disp_data = 32'h89abcdef;#20000000;$stop;endendmodule点击仿真运⾏,可以看到sel和seg的输出与我们期望的是⼀样的,即位选进⾏移位操作,段选显⽰123456和abcdef。
【技术分享】数码管显示常见问题总结2015-03-30吴鉴鹰(原创)一、数码管显示原理我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的基本相同。
所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED 的亮灭来显示出不同的字形。
数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。
而共阳极就是将八个LED的阳极连在一起。
其原理图如下。
其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。
一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。
显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。
数码管的8段,对应一个字节的8位,a对应最低位,dp对应最高位。
所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111,即0x3f;共阳数码管的字符编码为11000000,即0xc0。
可以看出两个编码的各位正好相反。
如下图。
二、数码管出现暗红现象现象描述:单片机穿行口的范式0为同步移位寄存器方式,外接一个串入并出的移位寄存器,可以扩展为一个并行口。
但是发现数码管显示数据的时候,出现暗红现象。
电路连接图原因:数据在串行输出期间,输出允许控制端没有关闭,从而导致串口输出端不稳定产生暗红现象。
三、数码管闪烁1:动态扫描驱动的时候,时间调整的不对,时间太短,就会闪烁,时间太长,就会出玩不应该亮的位微亮,所以,这是调整延时时间的事2:有可能是程序要求这样闪烁吧,别说不可能,有时候在某些系统中,还故意设有这种功能。
3:即使用专用芯片,只要是扫描式的驱动,他也会闪烁,只是我们看起来不太明显。
4:如果从程序中讲的话,即使扫描时间合理,也有可能会因为程序的不合理性而出现闪动,这种情况一般为两种失误:a中断时间影响了扫描周期的时间,即中断时间长于扫描周期,就会出现闪烁 b闪烁的常用数据内存被快速更改后又改过来,属于寄存器的重复使用,这两种情况我都碰到过。
关于数码管动态扫描的问题
关于数码管的动态扫描,相信玩单片机的都不陌生。
而什么是动态扫描,怎样扫描,扫描时间为多少最佳,这是一个值得深究的问题。
大家知道驱动一个或者两三个数码管,如果单片机有足够的IO口,我们可以用静态显示,至于什么是静态显示(动态显示的基础),这里不做阐述。
但如果,或者假如我们要点亮8个数码管或者更多,而恰恰单片机IO口不够用的情况下(扩展IO口的不讲),这是就必须用到动态扫描的显示方式了。
什么是数码管动态扫描?所谓的数码管动态扫描,就是在静态显示的基础上,逐一点亮每个数码管,由于点亮的时间非常短暂,由于人眼暂留现象使得我们看到所有的数码管像被点亮一样。
其中还有一点就是数码管熄灭后的余晖现象的关系。
那么,这又牵扯到一个问题了,什么是人眼暂留现象,我也码了一下解释,如下:
(Visual staying phenomenon,duration of vision)
人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。
是光对视网膜所产生的视觉在光停止作用后,仍保留一段时间的现象,其具体应用是电影的拍摄和放映。
原因是由视神经的反应速度造成的.其时值是二十四分之一秒。
是动画、电影等视觉媒体形成和传播的根据。
视觉实际上是靠眼睛的晶状体成像,感光细胞感光,并且将光信号转换为神经电流,传回大脑引起人体视觉。
感光细胞的感光是靠一些感光色素,感光色素的形成是需要一定时间的,这就形成了视觉暂停的机理。
物体在快速运动时, 当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1-0.4秒左右的图像,这种现象被称为视觉暂留现象。
是人眼具有的一种性质。
人眼观看物体时,成像于视网膜上,并由视神经输入人脑,感觉到物体的像。
但当物体移去时,视神经对物体的印象不会立即消失,而要延续0.1 -0.4秒的时间,人眼的这种性质被称为“眼睛的视觉暂留”。
很简单,说白点,就是逐一显示数码管,根据图像在人眼的暂留时间0.1-0.4秒计算,如果要点亮10个数码管,那动态扫描的时间只要在0.1秒之内就可以看到全部点亮的数码管了。
(这里以位来扫描,就是所有ABCDEFGH段并联做段选,留下每个数码管COM端做位选)
操作流程如下:
1.送数码管段码
2.打开位选(点亮数码管)
3.延时点亮(具体情况具体分析)
4.关闭位选(熄灭数码管)
接着就进行下一个数码管的显示了
也就是在某个时刻,只有一个数码管被点亮。
当这个时间在人眼暂留现象的时间之内,人就能看到连续点亮的数码管了。
这个是我将扫描时间片加到0.2秒的效果(也就是0.2*17=3.4秒钟扫完17个数码管)。
而大家看到数码管全部亮,是因为将扫描时间片降低到0.0005秒(500微秒),由于人眼暂留现象,所以看到数码管全部亮了。
关于动态扫描的时间片问题,是的,这个问题非常关键。
时间片也就是点亮一个数码管的时间,由于时间比较短,所以称为时间片。
时间片对于点亮数码管的亮度有影响,也同时会影响整体动态扫描的时间,或许造成动态扫描闪烁也与此有关。
掌握适合的时间片,对于动态扫描的效果尤为重要。
时间片过短,数码管太暗了。
(至于为什么暗,这里可以想象一下PWM的方式,与PWM具有异曲同工之妙)。
时间片太长,数码管就可能会闪烁。
经验分享:由于我扫的是17个数码管,在没有加数码管驱动芯片的情况下,全部扫描的时候很暗,逐个点亮的时候又正常了。
所以如果超过8个(或者12个)数码管,建议使用专门的驱动芯片,或者采用段扫。