实验4数码管循环显示实验

合集下载

数码管的显示的实验报告

数码管的显示的实验报告

数码管的显示的实验报告数码管的显示的实验报告引言:数码管是一种常见的数字显示装置,广泛应用于各种电子设备中。

本实验旨在通过实际操作,了解数码管的原理和工作方式,并通过一系列实验验证其显示效果和功能。

实验一:数码管的基本原理数码管是由多个发光二极管(LED)组成的,每个发光二极管代表一个数字或符号。

通过对不同的发光二极管进行点亮或熄灭,可以显示出不同的数字或符号。

本实验使用的是共阳数码管,即共阳极连接在一起,而阴极分别连接到控制芯片的输出引脚。

实验二:数码管的驱动电路为了控制数码管的显示,需要使用驱动电路。

常见的驱动电路有共阴极驱动和共阳极驱动两种。

本实验使用的是共阳极驱动电路。

驱动电路由控制芯片、电阻和电容组成。

控制芯片通过控制输出引脚的高低电平来控制数码管的点亮和熄灭。

实验三:数码管的显示效果通过控制芯片的输出引脚,可以实现数码管的显示效果。

本实验使用的是四位数码管,可以显示0-9的数字。

通过改变控制芯片输出引脚的电平,可以控制数码管显示不同的数字。

实验中通过编写程序,使数码管显示从0到9的数字循环显示,并通过按键控制数字的增加和减少。

实验四:数码管的多位显示除了显示单个数字外,数码管还可以实现多位显示。

通过控制不同位数的数码管,可以显示更多的数字或符号。

本实验使用的是四位数码管,可以同时显示四个数字。

通过编写程序,可以实现四位数码管的多位显示,例如显示当前时间、温度等信息。

实验五:数码管的亮度调节数码管的亮度可以通过改变驱动电路中的电阻值来实现。

本实验通过改变电阻值,调节数码管的亮度。

实验中通过编写程序,通过按键控制数码管的亮度增加和减少,从而实现亮度的调节。

结论:通过本次实验,我们深入了解了数码管的原理和工作方式。

数码管可以通过驱动电路的控制,实现数字和符号的显示。

同时,数码管还可以实现多位显示和亮度调节。

数码管作为一种常见的数字显示装置,具有广泛的应用前景,可以应用于各种电子设备中。

通过进一步的研究和实践,我们可以更好地利用数码管的功能,满足不同应用场景的需求。

4位数码管循环

4位数码管循环

4位数码管循环4位数码管可以显示0-9的数字,因此可以通过循环实现数字的循环显示。

一种简单的方式是使用四个数码管分别显示个位、十位、百位和千位的数字。

通过循环不断更新这四个数码管的显示内容,就可以实现数字的循环显示。

以下是一个示例代码:```c#include <avr/io.h>#include <avr/delay.h>void displayDigit(uint8_t digit){// 根据数字设置对应的数码管段亮起switch (digit) {case 0:PORTA = 0b00111111;break;case 1:PORTA = 0b00000110;break;case 2:PORTA = 0b01011011;break;case 3:PORTA = 0b01001111;break;case 4:PORTA = 0b01100110;break;case 5:PORTA = 0b01101101;break;case 6:PORTA = 0b01111101;break;case 7:PORTA = 0b00000111;break;case 8:PORTA = 0b01111111;break;case 9:PORTA = 0b01101111;break;default:// 如果传入的数字不在0-9之间,将所有数码管熄灭 PORTA = 0b00000000;break;}}int main(void){// 设置端口A为输出端口DDRA = 0xFF;while (1) {for (int i = 0; i < 10000; i++) {int thousands = i / 1000;int hundreds = (i % 1000) / 100;int tens = (i % 100) / 10;int ones = i % 10;// 分别显示千位、百位、十位和个位的数字displayDigit(thousands);_delay_ms(10);displayDigit(hundreds);_delay_ms(10);displayDigit(tens);_delay_ms(10);displayDigit(ones);_delay_ms(10);}}return 0;}```此代码使用的是ATmega系列的单片机,使用了端口A的8个引脚来控制四个数码管的段的亮灭。

sy4

sy4

实验四、数码管动态扫描显示实验一、实验目的1.学习和理解数码管动态扫描的工作原理2.学习和掌握数码管动态扫描的电路接口设计及程序编写二、实验设备1.仿真器2.单片机最小系统教学实验模块3.动态数码管显示模块三、实验要求使8位数码管显示“0 1 2 3 4 5 6 7”字样。

四、实验原理4.1 8段数码管显示原理数码管中的每一段相当于一个发光二极管,8段数码管则具有8个发光二极管。

对于“共阳极”的数码管,内部每个发光二极管的阳极被接在一起,成为该各段的公共选通线;发光二极管的阴极则成为段选线。

对于“共阴极”数码管,则正好相反,内部发光二极管的阴极接在一起,阳极成为段选线。

这两种数码管的驱动方式是不同的。

当需要点亮“共阳极”数码管的一段时,公共段需接高电平(即写逻辑1)、该段的段选线接低电平(即写逻辑0),从而该段被点亮。

当需要点亮“共阴极”数码管的一段时,公共段需接低电平(即写逻辑0)、该段的段选线接高电平(即写逻辑1),该段被点亮。

数码管的段位顺序如右图所示:一般来说在一个字节中按照abcdefg dp的顺序放置字型码,比如在一个“共阴极”数码管上要显示“1”,则b、c段需被点亮,因此在段选线中写入60H。

例如使用P0口接段选线,则使用下面的语句即可点亮数码管: MOV P0,#06H对应规则:a----->D7b----->D6c----->D5d----->D4e----->D3f----->D2g----->D1dp---->D04.2 多位数码管的显示在多位8段数码管显示时,为了简化硬件电路,通常将所有位的段选线相应地并联在一起,由一个单片机的8位I/O口控制,形成段选线的多路复用。

而各位数码管的共阳极或共阴极分别由单片机独立的I/O口线控制,顺序循环地点亮每位数码管,这样的数码管驱动方式就称为“动态扫描”。

在这种方式中,虽然每一时刻只选通一位数码管,但由于人眼具有一定的“视觉残留”,只要延时时间设置恰当,便会感觉到多位数码管同时被点亮了。

嵌入式实验报告数码管显示实验

嵌入式实验报告数码管显示实验

实验报告课程名称嵌入式系统编程实践实验仪器清华同方辰源嵌入式系统实验箱实验名称实验四:数码管显示实验系别__计算机学院_专业 _班级/学号学生姓名实验日期 2013年10月11日成绩___________________指导教师实验四:数码管显示实验一、实验问题回答(1)如何设置功能3,4中的循环速度?答:利用系统SysTick Handler中断,控制循环速度void SysTick_Handler (void){Event = 1;}(2)若是想实现类似实验(三)通过键盘动态控制循环速度,考虑一下应该如何设计?答:SysTickPeriodSet(SysCtlClockGet() / X)//设置x的大小就可以控制循环的速度。

void Reset_Counter_Speed(int x){SysTickIntDisable();SysTickDisable();SysTickPeriodSet(SysCtlClockGet() / x);// 设置x,控制计数频率,值与频率成正比SysTickEnable();SysTickIntEnable();},达到预期的效果。

二、实验目的和效果(效果即是否达到实验目的,达到的程度如何)学习、了解和掌握数码管工作原理和使用方法实验结果及检查(1)默认在在OLED屏幕上分行显示自己的学号、姓名、项目序号、时间,如“2010011001”、“zhangsan”、“work4”、“2012-11-”(2)首先在屏幕上显示四个功能选单,通过键盘A-F键选择不同功能,选择后屏幕显示相关功能提示,接受键盘输入的数字键0-9并在数码管上显示。

如:开始显示:“please choose the function:”“A: …”“B: …”“C: …”“D: …”按下“A”键后,显示”now you choose function A”(3)按下键盘后,根据不同功能在数码管上显示按键字符。

4位七段数码管循环显示

4位七段数码管循环显示
3、撰写设计报告
4、答辩考核




1、采用MCS-51单片机作为微处理器。
2、数码管模块闪烁“0028”3次,再闪烁“3105”3次,如次循环不停。。
3、在目测条件下LED显示屏各点亮度均匀、充足、稳定、清晰无串扰。




第一周:设计程序
第二周:做实物图
第三周:做实验报告
主要
参考
文献
[1]张靖武,周灵彬.《单片机系统的PROTEUS设计与仿真》.北京:电子工业出版社.2011,2
本文设计行、列驱动电路,运用单片机的智能化,系统的将每个功能电路模块连接在一起,总体结构设计如下图1-1所示:
图1-1
1.4
1.布置课题、复印资料、提出要求
2.列元件C清单、备齐元件
3.学习PROTEUS软件,PROTEUS中硬件设计
4.程序设计调试、PROTEUS软硬件调试
5.硬件电路焊接
6.单片机芯片烧录、硬件调试
[2]张义和,王敏男.《例说51单片机》.人民邮电出版社.2011,1
[3]何立民.单片机高级教程.第1版.北京:北京航空航天大学出版社,2001
[4] AT89C51 DATA SHEEP Philips Semiconductors 1999.dec
地点
院12-14
图2-1晶振电路图
2.2复位电路
为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。一般微机电路正常工作需要供电电源为5V±5%,即4.75~5.25V。由于微机电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当VCC超过4.75V低于5.25V以及晶体振荡器稳定工作时,复位信号才被撤除,微机电路开始正常工作。如图2-2为复位电路图。

实验四 LED数码管显示实验报告

实验四 LED数码管显示实验报告

实验名称 LED数码管显示实验指导教师曹丹华专业班级光电1202班姓名陈敬人学号联系电话一、任务要求实验目的:理解LED七段数码管的显示控制原理,掌握数码管与MCU的接口技术,能够编写数码管显示驱动程序;熟悉接口程序调试方法。

实验内容:1.基础部分:利用C8051F310单片机控制数码管显示器。

利用末位数码管循环显示数字0-F,显示切换频率为1Hz。

2.提高部分:在数码管上显示0→199计数,计数间隔为0.5秒。

二、设计思路1.基础部分C8051F310单片机片上晶振为24.5MHz,采用8分频后为3.0625MHz ,输入时钟信号为48个机器周期,T1采用定时器工作方式1,单次定时最长可达1.027s,可以实现1s定时要求。

定时采用软件查询工作方式,利用JNB TF0, HERE实现。

置P0.6和P0.7端口为0,位选信号选定末位数码管。

通过MOVC A, @A+DPTR指令,利用顺序查表法取出显示段码数据。

寄存器R0自增1,并赋给A以取出下一个显示段码数据。

为减短代码长度,利用CJNE指令实现循环结构。

当寄存器R0增至0FH后,跳转至开头,重新开始下一轮显示。

2.提高部分定时方式及查表方式同基础部分,由于要实现三个数码管同时显示,因此采用动态扫描显示法。

三、资源分配1.基础部分P0.6: 位选信号端口P0.7:位选信号端口P1:输出段码数据R0:存放显示数据DPTR:指向段码数据表首 2.提高部分P0.6:位选信号端口P0.7:位选信号端口R0:存放个位显示数据 R5:存放十位显示数据 R6:存放百位显示数据 P1:输出段码数据DPTR: 指向段码数据表首四、流程图1.基础部分2.提高部分五、源代码(含文件头说明、语句行注释)1.基础部分;******************基础部分源代码***************************;Filename: test.asm;Decription: 末位数码管循环显示数字0-F,显示切换频率为1Hz。

数码管显示实验 实验报告

数码管显示实验 实验报告

数码管显示实验实验报告一、实验目的本次数码管显示实验的主要目的是深入了解数码管的工作原理和显示控制方式,通过实际操作掌握数码管与微控制器的接口技术,并能够编写相应的程序实现各种数字和字符的显示。

二、实验原理数码管是一种由多个发光二极管组成的显示器件,常见的有共阴数码管和共阳数码管两种类型。

共阴数码管是将所有发光二极管的阴极连接在一起,当阳极接高电平时,相应的二极管发光;共阳数码管则是将所有发光二极管的阳极连接在一起,当阴极接低电平时,相应的二极管发光。

在控制数码管显示时,通常采用动态扫描的方式,即依次快速地给每个数码管的段选端送入相应的字形码,同时使位选端选通对应的数码管,利用人眼的视觉暂留效应,使人看起来好像所有数码管同时在显示。

三、实验设备与材料1、实验开发板2、数码管模块3、杜邦线若干4、电脑5、编程软件四、实验步骤1、硬件连接将数码管模块与实验开发板进行连接,确定好段选和位选引脚的连接。

检查连接是否牢固,确保电路无短路或断路现象。

2、软件编程打开编程软件,选择相应的开发板型号和编程语言。

定义数码管的段选和位选引脚。

编写控制程序,实现数字 0 到 9 的循环显示。

3、编译与下载对编写好的程序进行编译,检查是否有语法错误。

将编译成功的程序下载到实验开发板上。

4、观察实验现象接通实验开发板的电源,观察数码管的显示情况。

检查显示的数字是否正确,显示的亮度和稳定性是否符合要求。

五、实验结果与分析1、实验结果数码管能够正常显示数字 0 到 9,并且能够按照设定的频率循环显示。

显示的数字清晰、稳定,没有出现闪烁或模糊的现象。

2、结果分析程序编写正确,能够准确地控制数码管的段选和位选信号,实现数字的显示。

动态扫描的频率设置合理,既保证了显示的稳定性,又不会出现明显的闪烁。

六、实验中遇到的问题及解决方法1、问题数码管显示出现闪烁现象。

解决方法调整动态扫描的频率,增加扫描的速度,减少每个数码管的点亮时间,从而减轻闪烁现象。

四位数码管动态显示

四位数码管动态显示

实验名称:实验名称四位数码管动态显示一、实验目的1.通过AT89C52单片机控制四位数码管动态显示数字“3210”。

2.用Protues设计、仿真以AT89C52为核心的四位数码管动态显示实验装置。

3.掌握四位数码管的控制方法。

二、实验任务P1端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,接通电源时,显示“”字样;三、实验设备微机1台、Proteus软件1套、GL10型51单片机学习开发板1台。

四、实验电路绘制五、汇编语言程序设计1.设计原理动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。

在进行数码显示的时候,要对显示单元开辟4个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。

对于显示的字形码数据我们采用查表方法来完成。

2.程序框图3.汇编程序ORG 0000H ;初始化START:MOV R0,#0FFH ;控制段选,给R0传递一个初值1111 1111MOV DPTR,#TABLE ;将表头的地址传递给数据指针NEXT:MOV A,R0 ;R0的值传给累加器AMOVC A,@A+DPTR ;查表指令,将TABLE的值按底标给AMOV P2,A ;A的值传给P2接口,显示数字0LCALL DELAY ;调用延时函数,延时INC R0 ;R0加一,MOV A,R0 ;R0的值再次传给A,控制位选移动MOV P1,A ;A的值传给P1口,CJNE R0,#04,NEXT ;判断R0是否等于4,若不等于,转NEXT继续执行,若等于,继续执行下一条程序SJMP START,相当于将值初始化,重新开始。

SJMP START ;跳转到START,R0,R1初始化,重新执行一轮。

DELAY:MOV R6,#4 ;延时程序DL2:MOV R7,#248DL1:DJNZ R7,$DJNZ R6,DL2RETTABLE:DB 3FH,06H,5BH,4FH ;以table为表头地址,依次存入二进制的0.1.2.3END六、Proteus软件模拟仿真七、GL10单片机仿真系统1.实验板连线2.实验操作步骤先把“单片机系统”区域中的P1.0/AD0-P1.7/AD7用8芯排线连接到“动态数码显示”区域中的a-h端口上;再把“单片机系统”区域中的P2.0/A8-P2.3/A15用4芯排线连接到“动态数码显示”区域中的0-N端口上。

实验四 数码管显示控制

实验四 数码管显示控制

实验四数码管显示控制一、实验目的1、熟悉Keil uVision2软件的使用;2、掌握LED数码管显示接口技术;3、理解单片机定时器、中断技术。

二、实验设备及仪器Keil μVision2软件;单片机开发板;PC机一台三、实验原理及内容1、开发板上使用的LED 数码管是四位八段共阴数码管(将公共端COM接地GND),其内部结构原理图,如图4.1所示。

图4.1共阴四位八段LED数码管的原理图图4.1表明共阴四位八段数码管的“位选端”低电平有效,“段选端”高电平有效,即当数码管的位为低电平,且数码管的段为高电平时,相应的段才会被点亮。

实验开发板中LED数码管模块的电路原理图,如图4.2所示。

SP1a~hP0.4~P0.7SP2P0.0~P0.3图4.2 LED数码管模块电路原理图图中,当P1.0“段控制”有效时,P0.0~P0.7分别对应到数码管的a~h段。

当P1.1“位控制”有效时,P0.0~P0.7分别对应到DIG1~DIG8。

训练内容一:轮流点亮数码管来检测数码管是否正常。

参考程序:ORG 00HAJMP MAINMAIN:SETB P1.2;LED流水灯模块锁存器的控制位MOV P0,#0FFH;关闭LED灯CLR P1.2SETB P1.3 ;点阵模块的行控制锁存器MOV P0,#0 ;关闭点阵行CLR P1.3MOV A,#11111110B;数码管“位选信号”初值,低电平有效LOOP:SETB P1.1;数码管位控制锁存器有效MOV P0,ACLR P1.1RL A ;形成新的“位选信号”,为选择下一位数码管做准备SETB P1.0;数码管段控制锁存器有效MOV P0,#0FFH ;数码管的所有段点亮,显示“8”CLR P1.0CALL DELAYSJMP LOOPDELAY:MOV R5,#0;延时子程序D1: MOV R6,#0D2:NOPDJNZ R6,D2DJNZ R5,D1RETEND训练内容二:静态显示,0~9计数。

数电实验实验报告(Quartus)数码管循环显示(优选.)

数电实验实验报告(Quartus)数码管循环显示(优选.)

最新文件---------------- 仅供参考--------------------已改成-----------word文本 --------------------- 方便更改赠人玫瑰,手留余香。

实验101、结果:同时显示012345代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY sweep ISPORT(clk,clr:IN STD_LOGIC; --clk输入时钟;clr状态清零a:OUT STD_LOGIC_VECTOR (6 DOWNTO 0); --输出数码管相同段sweep:OUT STD_LOGIC_VECTOR (5 DOWNTO 0) --输出cat(数码管选通控制信号)端);END sweep;ARCHITECTURE sweep_arch OF sweep ISSIGNAL sweep_arc:STD_LOGIC_VECTOR (5 DOWNTO 0); --声明内部信号(选通控制信号) SIGNAL b:STD_LOGIC_VECTOR (6 DOWNTO 0); --声明内部信号(相同段信号)BEGINPROCESS(sweep_arc)BEGINIF (clk'event and clk='1') THENIF clr='0' THEN --状态清零sweep_arc <="011111" ; b <="0000000";ELSEcase sweep_arc IS --选通控制信号 WHEN"011111" => sweep_arc <="111110"; WHEN"111110" => sweep_arc <="111101"; WHEN"111101" => sweep_arc <="111011"; WHEN"111011" => sweep_arc <="110111"; WHEN"110111" => sweep_arc <="101111"; WHEN"101111" => sweep_arc <="011111"; WHEN OTHERS => sweep_arc <="011111"; END CASE;CASE sweep_arc IS --相同段信号 WHEN"011111" => b <="1011011";WHEN"101111" => b <="0110011";WHEN"110111" => b <="1111001";WHEN"111011" => b <="1101101";WHEN"111101" => b <="0110000";WHEN"111110" => b <="1111110";WHEN OTHERS => b <="0000000";END CASE;END IF;END IF;sweep<=sweep_arc;a<=b;END PROCESS;END;仿真:管脚:2、(1)结果:循环显示:012345—123450—234501—345012—450123—501234—012345代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sweep2 ISPORT(clk:IN STD_LOGIC; --clk输入时钟sweep2:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); --输出数码管相同段a:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) --输出cat(数码管选通控制信号)端);END sweep2;ARCHITECTURE arc_sweep2 OF sweep2 ISSIGNAL number:INTEGER RANGE 0 TO 6; --状态声明(6种状态,7种状态值)SIGNAL n:INTEGER RANGE 0 TO 6; --声明数码管(6个管,7个值)SIGNAL flag:INTEGER RANGE 0 TO 50; --同一状态运行次数BEGINPROCESS(clk)BEGINIF (clk'event AND clk='1') THENIF n>5 THENn<=0;ELSE n<=n+1;flag<=flag+1;END IF;IF flag>20 THENflag<=0;number<=number+1;END IF;IF number>5 THENnumber<=0;END IF;CASE number ISWHEN 0=> --状态0,输出012345CASE n ISWHEN 0=>sweep2<="011111"; a<="1111110";WHEN 1=>sweep2<="101111"; a<="0110000";WHEN 2=>sweep2<="110111"; a<="1101101";WHEN 3=>sweep2<="111011"; a<="1111001";WHEN 4=>sweep2<="111101"; a<="0110011";WHEN 5=>sweep2<="111110"; a<="1011011";WHEN OTHERS=>sweep2<="111111";END CASE;WHEN 1=> ----状态1,输出123450CASE n ISWHEN 0=>sweep2<="011111"; a<="0110000";WHEN 1=>sweep2<="101111"; a<="1101101";WHEN 2=>sweep2<="110111"; a<="1101101";WHEN 3=>sweep2<="111011"; a<="1111001";WHEN 4=>sweep2<="111101"; a<="0110011";WHEN 5=>sweep2<="111110"; a<="1111110";WHEN OTHERS=>sweep2<="111111";END CASE;WHEN 2=> --状态2,输出234501CASE n ISWHEN 0=>sweep2<="011111"; a<="1101101";WHEN 1=>sweep2<="101111"; a<="1111001";WHEN 2=>sweep2<="110111"; a<="0110011";WHEN 3=>sweep2<="111011"; a<="1011011";WHEN 4=>sweep2<="111101"; a<="1111110";WHEN 5=>sweep2<="111110"; a<="0110000";WHEN OTHERS=>sweep2<="111111";END CASE;WHEN 3=> --状态3,输出345012CASE n ISWHEN 0=>sweep2<="011111"; a<="1111001";WHEN 1=>sweep2<="101111"; a<="0110011";WHEN 2=>sweep2<="110111"; a<="1011011";WHEN 3=>sweep2<="111011"; a<="1111110";WHEN 4=>sweep2<="111101"; a<="0110000";WHEN 5=>sweep2<="111110"; a<="1101101";WHEN OTHERS=>sweep2<="111111";END CASE;WHEN 4=> --状态4,输出450123CASE n ISWHEN 0=>sweep2<="011111"; a<="0110011";WHEN 1=>sweep2<="101111"; a<="1011011";WHEN 2=>sweep2<="110111"; a<="1111110";WHEN 3=>sweep2<="111011"; a<="0110000";WHEN 4=>sweep2<="111101"; a<="1101101";WHEN 5=>sweep2<="111110"; a<="1111001";WHEN OTHERS=>sweep2<="111111";END CASE;WHEN 5=> --状态5,输出501234CASE n ISWHEN 0=>sweep2<="011111"; a<="1011011";WHEN 1=>sweep2<="101111"; a<="1111110";WHEN 2=>sweep2<="110111"; a<="0110000";WHEN 3=>sweep2<="111011"; a<="1101101";WHEN 4=>sweep2<="111101"; a<="1111001";WHEN 5=>sweep2<="111110"; a<="0110011";WHEN OTHERS=>sweep2<="111111";END CASE;WHEN OTHERS=>sweep2<="111111";END CASE;END IF;END PROCESS;END arc_sweep2;仿真:仿真时将循环次数改为1方便观察波形,共6种状态管脚:2、(2)结果:循环显示:012345—12345X—2345XX—345XXX—45XXXX—5XXXXX—XXXXXX—XXXXX0—XXXX01—XXX012—XX0123—X01234—012345代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sweep3 ISPORT(clk:IN STD_LOGIC; --clk输入时钟sweep3:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); --输出数码管相同段a:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) --输出cat(数码管选通控制信号)端);END sweep3;ARCHITECTURE arc_sweep3 OF sweep3 ISSIGNAL number:INTEGER RANGE 0 TO 12; --状态声明(12种状态,13种状态值)SIGNAL n:INTEGER RANGE 0 TO 6; --声明数码管(6个管,7个值)SIGNAL flag:INTEGER RANGE 0 TO 50; --同一状态运行次数BEGINPROCESS(clk)BEGINIF clk'event AND clk='1' THENIF n>5 THENn<=0;ELSE n<=n+1;flag<=flag+1;END IF;IF flag>20 THENflag<=0;number<=number+1;END IF;IF number>11 THENnumber<=0;END IF;CASE number ISWHEN 0=> --状态0,输出012345CASE n ISWHEN 0=>sweep3<="011111"; a<="1111110";WHEN 1=>sweep3<="101111"; a<="0110000";WHEN 2=>sweep3<="110111"; a<="1101101";WHEN 3=>sweep3<="111011"; a<="1111001";WHEN 4=>sweep3<="111101"; a<="0110011";WHEN 5=>sweep3<="111110"; a<="1011011";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 1=> --状态1,输出12345XCASE n ISWHEN 0=>sweep3<="011111"; a<="0110000";WHEN 1=>sweep3<="101111"; a<="1101101";WHEN 2=>sweep3<="110111"; a<="1101101";WHEN 3=>sweep3<="111011"; a<="1111001";WHEN 4=>sweep3<="111101"; a<="0110011";WHEN 5=>sweep3<="111111"; a<="1111110";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 2=> --状态2,输出2345XXCASE n ISWHEN 0=>sweep3<="011111"; a<="1101101";WHEN 1=>sweep3<="101111"; a<="1111001";WHEN 2=>sweep3<="110111"; a<="0110011";WHEN 3=>sweep3<="111011"; a<="1011011";WHEN 4=>sweep3<="111111"; a<="1111110";WHEN 5=>sweep3<="111111"; a<="0110000";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 3=> --状态3,输出345XXXCASE n ISWHEN 0=>sweep3<="011111"; a<="1111001";WHEN 1=>sweep3<="101111"; a<="0110011";WHEN 2=>sweep3<="110111"; a<="1011011";WHEN 3=>sweep3<="111111"; a<="1111110";WHEN 4=>sweep3<="111111"; a<="0110000";WHEN 5=>sweep3<="111111"; a<="1101101";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 4=> --状态4,输出45XXXXCASE n ISWHEN 0=>sweep3<="011111"; a<="0110011";WHEN 1=>sweep3<="101111"; a<="1011011";WHEN 2=>sweep3<="111111"; a<="1111110";WHEN 3=>sweep3<="111111"; a<="0110000";WHEN 4=>sweep3<="111111"; a<="1101101";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 5=> --状态5,输出5XXXXXCASE n ISWHEN 0=>sweep3<="011111"; a<="1011011";WHEN 1=>sweep3<="111111"; a<="1111110";WHEN 2=>sweep3<="111111"; a<="0110000";WHEN 3=>sweep3<="111111"; a<="1101101";WHEN 4=>sweep3<="111111"; a<="1111001";WHEN 5=>sweep3<="111111"; a<="0110011";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 6=> --状态6,输出XXXXXXCASE n ISWHEN 0=>sweep3<="111111"; a<="1111110";WHEN 1=>sweep3<="111111"; a<="0110000";WHEN 2=>sweep3<="111111"; a<="1101101";WHEN 3=>sweep3<="111111"; a<="1111001";WHEN 4=>sweep3<="111111"; a<="0110011";WHEN 5=>sweep3<="111111"; a<="1011011";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 7=> --状态7,输出XXXXX0CASE n ISWHEN 0=>sweep3<="111111"; a<="0110000";WHEN 1=>sweep3<="111111"; a<="1101101";WHEN 3=>sweep3<="111111"; a<="1111001";WHEN 4=>sweep3<="111111"; a<="0110011";WHEN 5=>sweep3<="111110"; a<="1111110";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 8=> --状态8,输出XXXX01CASE n ISWHEN 0=>sweep3<="111111"; a<="1101101";WHEN 1=>sweep3<="111111"; a<="1111001";WHEN 2=>sweep3<="111111"; a<="0110011";WHEN 3=>sweep3<="111111"; a<="1011011";WHEN 4=>sweep3<="111101"; a<="1111110";WHEN 5=>sweep3<="111110"; a<="0110000";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 9=> --状态9,输出XXX012CASE n ISWHEN 0=>sweep3<="111111"; a<="1111001";WHEN 1=>sweep3<="111111"; a<="0110011";WHEN 2=>sweep3<="111111"; a<="1011011";WHEN 3=>sweep3<="111011"; a<="1111110";WHEN 4=>sweep3<="111101"; a<="0110000";WHEN 5=>sweep3<="111110"; a<="1101101";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 10=> --状态10,输出XX0123CASE n ISWHEN 0=>sweep3<="111111"; a<="0110011";WHEN 1=>sweep3<="111111"; a<="1011011";WHEN 2=>sweep3<="110111"; a<="1111110";WHEN 3=>sweep3<="111011"; a<="0110000";WHEN 4=>sweep3<="111101"; a<="1101101";WHEN 5=>sweep3<="111110"; a<="1111001";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN 11=> --状态11,输出X01234CASE n ISWHEN 0=>sweep3<="111111"; a<="1011011";WHEN 1=>sweep3<="101111"; a<="1111110";WHEN 2=>sweep3<="110111"; a<="0110000";WHEN 3=>sweep3<="111011"; a<="1101101";WHEN 4=>sweep3<="111101"; a<="1111001";WHEN 5=>sweep3<="111110"; a<="0110011";WHEN OTHERS=>sweep3<="111111";END CASE;WHEN OTHERS=>sweep3<="111111";END CASE;--END IF;END IF;END PROCESS;END arc_sweep3;仿真:仿真时将循环次数改为1方便观察波形,共12种状态管脚:最新文件---------------- 仅供参考--------------------已改成-----------word文本 --------------------- 方便更改赠人玫瑰,手留余香。

单片机数码管动态显示实验报告

单片机数码管动态显示实验报告

单片机数码管动态显示实验报告单片机数码管动态显示实验程序(汇编)单片机数码管动态显示实验程序org 00hajmp headorg 0030hhead:mov sp,#0070hnum equ p0 ;p0口连接数码管reset:mov dptr ,#tabmov r0,#4sh:acall show_tabcall dptr_adddjnz r0,shmov r0 ,#4sjmp resetdptr_add:inc dptrinc dptrinc dptrinc dptrrettab :db0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH;;;;;;;;;;;;;;;;;;;;; 函数的功能是用来动态显示dptr上的四个数据 ;;;;;;;;;;;;;;;;;;;;;; show_tab:clr amov r2,#0mov r3,#148mov p2,#238loop:movc a,@a+dptrmov num ,aacall delay_5msinc r2mov a,r2;调用片选函数前注意A的变化acall select_movcjne r2,#4,loopmov r2,#0clr adjnz R3,loopret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;select_mov:;p2的初值238push 0e0hmov a,p2rl amov p2,apop 0e0hretdelay_5ms:mov r6,#5signed_5ms:call delay_1msdjnz r6,signed_5msret篇二:单片机动态数码显示设计实验报告微机原理与接口技术实验报告实验题目:指导老师:班级:计算机科学与技术系姓名:动态数码显示设计2014年 12月3日实验十三动态数码显示设计一、实验目的1.掌握动态数码显示技术的设计方法。

实验四 键盘及显示实验

实验四    键盘及显示实验

实验四键盘及显示实验一、实验目的1、学习自制键盘与单片机的接口及程序处理方法;2、掌握数码管显示电路的构成及程序编制方法。

二、实验仪器设备THGZ—1型单片机·CPLD/FPGA开发综合实验装置1台。

三、实验内容与要求通过键盘输入数据和操作指令,并由LED显示器显示相关数据。

1、独立式键盘与动态LED显示起初显示器全黑,当按KEY1~KEY8任意键后,显示器显示与键号对应的字符(“1”~“8”),每次按键对应字符显示在最右边,前一次的左移一位。

图2-4.1 独立式键盘与动态LED显示实验电路2、矩阵式键盘与动态LED显示①单字符的循环显示起初显示器显示“In ”,按键盘上的“0”~“9”任意键后再按“开始”键,6位LED 显示器马上左循环显示(左移速度0.5s/字符)键入的字符,按“停止”键可以重复以上过程。

图2-4.2 单字符的循环显示实验电路②延时函数的时间测量用定时器/计数器0测量如下延时函数的延时时间。

delaytest(unsigned int time){ unsigned int i,j;for (i=0;i<time;i++)for (j=0;j<65535;j++);}开机显示“good”;按“测量”键后显示“InPArA”表明要通过键盘输入延时函数的实参值,输入实参值并显示该值;按“测量”键后以ms为单位显示测量结果;再按“测量”键将重复以上过程。

图2-4.3 延时函数的时间测量实验电路四、思考题1、比较独立式键盘与矩阵式键盘的异同。

2、键盘处理程序包括哪些过程?2、如何识别键盘上的各键?键值有何意义?3、何为消抖?有何意义?如何实现?实验四源程序清单TEST4-1.C#include <reg51.h>#define KeyISegCodeO P1 /*定义键盘输入口/动态LED显示器段码输出口*/#define BitCtrO P2 /*定义动态LED显示器位控码输出口*/unsigned char DispBuf[6]={10,10,10,10,10,10}; /*显示数组,初始化为不显示*/void delay(unsigned char time) /*延时函数*/{ unsigned char i,j;for (i=0;i<time;i++)for (j=0;j<255;j++);}unsigned char KeyBoardScan() /*键盘扫描函数*/{ unsigned char KeyV alue=0; /*键值,无键按下为0*/BitCtrO=0; /*关闭显示*/KeyISegCodeO=0xff; /*由输出转为输入*/if (KeyISegCodeO!=0xff){ delay(12); /*消抖延时约10ms(fosc=12MHz)*/if (KeyISegCodeO!=0xff){ switch (KeyISegCodeO){ case 0xfe: KeyV alue=1;break; /*KEY1按下,键值为1*/case 0xfd: KeyV alue=2;break; /*KEY2按下,键值为2*/case 0xfb: KeyV alue=3;break; /*KEY3按下,键值为3*/case 0xf7: KeyV alue=4;break; /*KEY4按下,键值为4*/case 0xef: KeyV alue=5;break; /*KEY5按下,键值为5*/case 0xdf: KeyV alue=6;break; /*KEY6按下,键值为6*/case 0xbf: KeyV alue=7;break; /*KEY7按下,键值为7*/case 0x7f: KeyV alue=8;break; /*KEY8按下,键值为8*/}while (KeyISegCodeO!=0xff); /*等待键释放*/}}return(KeyV alue); /*返回键值*/}void display(unsigned char NumLED) /*显示函数*/{ unsigned char code SegCode[16]={63,6,91,79,102,109,125,7,127,111,0}; /*0~9、显黑共阴极段码*/ unsigned char i;BitCtrO=1; /*指向显示器末位*/for (i=0;i<NumLED;i++){ KeyISegCodeO=SegCode[DispBuf[i]]; /*显示当前位*/delay(5); /*延时约4ms(fosc=12MHz)*/BitCtrO=BitCtrO<<1; /*指向前一位*/}}main(){ unsigned char KeyV alue,i;while(1){ KeyV alue=KeyBoardScan(); /*扫描键盘获得键值*/if (KeyV alue!=0){ /*显示缓冲区刷新*/for (i=5;i>0;i--)DispBuf[i]=DispBuf[i-1];DispBuf[0]=KeyV alue;}display(6); /*显示(6位)*/}}TEST4-2.1.C#include <reg51.h>#include <intrins.h>#define KeyROCISegCodeO P1 /*定义键盘行输出列输入/段码输出口*/#define BitCtrO P2 /*定义动态LED显示器位控码输出口*/#define NumRow 3 /*定义键盘行数为3*/#define NumColumn 4 /*定义键盘列数为4*/unsigned char DispBuf[6]={10,10,10,10,11,1}; /*显示数组,初始化为显示"In "*/unsigned char c_50ms=1; /*50毫秒计数*/void delay(unsigned char time) /*延时函数*/{ unsigned char i,j;for (i=0;i<time;i++)for (j=0;j<255;j++);}unsigned char KeyBoardScan() /*键盘扫描函数*/{ unsigned char row=NumRow,RowCode,column=NumColumn,ColumnState; /*行循环、行码、列循环、列状态*/BitCtrO=0; /*关闭显示*/KeyROCISegCodeO=0xf8; /*键盘行线均输出0*/if ((KeyROCISegCodeO|0x0f)!=0xff){ /*有键按下*/delay(12); /*消抖延时约10ms(fosc=12MHz)*/KeyROCISegCodeO=0xf8; /*键盘行线均输出0*/if ((KeyROCISegCodeO|0x0f)!=0xff){ /*确实有键按下,寻找是哪个键*/RowCode=0xfe; /*指向第1行*/for(row=0;row<NumRow;row++) /*扫描共NumRow行*/{ KeyROCISegCodeO=RowCode; /*当前行*/ColumnState=KeyROCISegCodeO|0x0f; /*获取列状态*/for(column=0;column<NumColumn;column++) /*查询共NumColumn列的状态*/if ((ColumnState|0x7f)==0x7f){ while ((KeyROCISegCodeO|0x0f)!=0xff); /*等待键释放*/return(row*NumColumn+column); /*返回键值*/}elseColumnState=_crol_(ColumnState,1); /*指向下一列*/RowCode=_crol_(RowCode,1); /*指向下一行*/}}}return(NumRow*NumColumn); /*返回无键值*/}void display(unsigned char NumLED) /*显示函数*/{ unsigned char code SegCode[12]={63,6,91,79,102,109,125,7,127,111,0,84}; /*0~9、黑、n共阴极段码*/ unsigned char i;BitCtrO=1; /*指向显示器末位*/for (i=0;i<NumLED;i++){ KeyROCISegCodeO=SegCode[DispBuf[i]]; /*显示当前位*/delay(6); /*延时约5ms(fosc=12MHz)*/BitCtrO=BitCtrO<<1; /*指向前一位*/}}main(){ unsigned char i,KeyV alue,lock=0; /*循环,键值,键联锁:0:"停止"键有效、1:数字键有效、2:"开始"键有效*/TMOD=1; /*定时计数器0定时、方式1*/TH0=(65536-50000)/256; /*定时计数器0定时50ms*/TL0=(65536-50000)%256;ET0=1; /*开定时计数器0中断*/EA=1; /*开总中断*/while(1){ KeyV alue=KeyBoardScan(); /*扫描键盘获得键值*/switch (KeyV alue) /*键处理*/{ case 12: break; /*无键按下不处理*/case 11: { if (lock==0){ /*"停止键"有效及处理*/TR0=0; /*关闭T0*/DispBuf[5]=1; /*左边第1个数码管显"I"*/DispBuf[4]=11; /*左边第2个数码管显"n"*/for (i=0;i<4;i++) DispBuf[i]=10; /*后面4个数码管显黑*/lock=1; /*数字键有效*/}} break;case 10: { if (lock==2){ /*"开始"键有效及处理*/TR0=1; /*启动T0*/lock=0; /*"停止"键有效*/}} break;default: { if (lock==1){ /*数字键有效及处理*/DispBuf[0]=KeyV alue; /*右边第1个数码管显键入的字符*/for (i=5;i>0;i--) DispBuf[i]=10; /*其余5个显黑*/lock=2; /*"开始"键有效*/}}}display(6); /*数码管(6个)显示*/}}/**********定时计数器0中断处理程序*********/TC0() interrupt 1 using 1{ unsigned char temp,i;TH0=(65536-50000)/256; /*定时计数器0重新定时50ms*/TL0=(65536-50000)%256;if (c_50ms++>10){ /*0.5s后使键入字符左环移1位*/c_50ms=1;temp=DispBuf[5];for (i=5;i>0;i--) DispBuf[i]=DispBuf[i-1];DispBuf[0]=temp;}}TEST4-2.2.C#include <reg51.h>#include <intrins.h>#define KeyROCISegCodeO P1 /*定义键盘行输出列输入/段码输出口*/#define BitCtrO P2 /*定义动态LED显示器位控码输出口*/#define NumRow 3 /*定义键盘行数为3*/#define NumColumn 4 /*定义键盘列数为4*/unsigned char DispBuf[6]={10,10,13,12,12,9}; /*显示数组,初始化为显示"good "*/unsigned long total; /*T0溢出计数*/void delay(unsigned char time) /*延时函数*/{ unsigned char i,j;for (i=0;i<time;i++)for (j=0;j<255;j++);}void delaytest(unsigned int time) /*延时函数*/{ unsigned int i,j;for (i=0;i<time;i++)for (j=0;j<65535;j++);}unsigned char KeyBoardScan() /*键盘扫描函数*/{ unsigned char row=NumRow,RowCode,column=NumColumn,ColumnState; /*行循环、行码、列循环、列状态*/BitCtrO=0; /*关闭显示*/KeyROCISegCodeO=0xf8; /*键盘行线均输出0*/if ((KeyROCISegCodeO|0x0f)!=0xff){ /*有键按下*/delay(12); /*消抖延时约10ms(fosc=12MHz)*/KeyROCISegCodeO=0xf8; /*键盘行线均输出0*/if ((KeyROCISegCodeO|0x0f)!=0xff){ /*确实有键按下,寻找是哪个键*/RowCode=0xfe; /*指向第1行*/for(row=0;row<NumRow;row++) /*扫描共NumRow行*/{ KeyROCISegCodeO=RowCode; /*当前行*/ColumnState=KeyROCISegCodeO|0x0f; /*获取列状态*/for(column=0;column<NumColumn;column++) /*查询共NumColumn列的状态*/if ((ColumnState|0x7f)==0x7f){ while ((KeyROCISegCodeO|0x0f)!=0xff); /*等待键释放*/return(row*NumColumn+column); /*返回键值*/ }elseColumnState=_crol_(ColumnState,1); /*指向下一列*/RowCode=_crol_(RowCode,1); /*指向下一行*/ }}}return(NumRow*NumColumn); /*返回无键值*/}void display(unsigned char NumLED) /*显示函数*/{ unsigned char code SegCode[18]={63,6,91,79,102,109,125,7,127,111,0,84,92,94,115,119,80,121}; /*0~9、黑、n、o、d、P、A、r、E共阴极段码*/unsigned char i;BitCtrO=1; /*指向显示器末位*/for (i=0;i<NumLED;i++){ KeyROCISegCodeO=SegCode[DispBuf[i]]; /*显示当前位*/delay(6); /*延时约5ms(fosc=12MHz)*/BitCtrO=BitCtrO<<1; /*指向前一位*/ }}void error(){ DispBuf[5]=17; /*显"E"*/DispBuf[4]=16; /*显"r"*/DispBuf[3]=16; /*显"r"*/DispBuf[2]=12; /*显"o"*/DispBuf[1]=16; /*显"r"*/DispBuf[0]=10; /*显黑*/}main(){ unsigned char temp,NumBit,i,KeyV alue; /*临时、数字位数,循环,键值*/ unsigned long result; /*实参值/测量结果*/bit lock=0 ; /*键联锁:0:"测量"键有效、1:数字键/"确认"键有效*/ TMOD=1; /*定时T0定时方式1*/TH0=0;TL0=0;ET0=1; /*开T0中断*/EA=1; /*开总中断*/while(1){ KeyV alue=KeyBoardScan(); /*扫描键盘获得键值*/switch (KeyV alue) /*键处理*/{ case 12: break; /*无键按下不处理*/case 11: { if (lock==0){ /*"测量键"有效及处理*/DispBuf[5]=1; /*显"I"*/DispBuf[4]=11; /*显"n"*/DispBuf[3]=14; /*显"P"*/DispBuf[2]=15; /*显"A"*/DispBuf[1]=16; /*显"r"*/DispBuf[0]=15; /*显"A"*/NumBit=0; /*无数字输入*/lock=1; /*数字/"确认"键有效*/}} break;case 10: { if (lock){ /*"确认"键有效及处理*/if (NumBit>0) /*限定必须输入至少1位实参值*/{ /*获得有效数字位*/for (i=4;i>0;i--)if (DispBuf[i]==10) DispBuf[i]=0;else break;result=10000*DispBuf[4]+1000*DispBuf[3]+100*DispBuf[2]+10*DispBuf[1]+DispBuf[0]; /*获得实参值*/if (result<65536&&result!=0){ total=0; /*T0溢出计数初值0*/TR0=1; /*启动T0*/delaytest((unsigned int)result);TR0=0; /*关闭T0*/result=(total*65536+TH0+TL0)/1000; /*获得ms为单位的测量结果*/if (result<1000000){ /*显示测量结果*/for (i=0;i<6;i++) /*获得测量结果数字位*/{ DispBuf[i]=result%10;result/=10;}for (i=5;i>0;i--) /*去掉测量结果数字位无效0*/if (DispBuf[i]==0)DispBuf[i]=10 ;else break;}elseerror(); /*结果超出显示范围,提示出错*/}elseerror(); /*实参为0或超出65535,提示出错*/}elseerror(); /*实参为0,提示出错*/lock=0; /*"测量"键有效*/}} break;default: { if (lock){ /*数字键有效及处理*/if (NumBit++<5) /*限定只能输入1~5位实参值*/{ if(NumBit!=1){ /*数字位左移*/temp=DispBuf[5];for (i=5;i>0;i--) DispBuf[i]=DispBuf[i-1];DispBuf[0]=temp;DispBuf[0]=KeyV alue;}else{ if (KeyV alue==0){ /*第1位数字为0,提示出错*/error();lock=0; /*"测量"键有效*/}else{ for (i=5;i>0;i--) DispBuf[i]=10;DispBuf[0]=KeyV alue;}}}else{ error();lock=0; /*"测量"键有效*/}}}}display(6); /*数码管(6个)显示*/}}/*******T0中断处理程序*******/TC0() interrupt 1 using 1{ total++;}。

4位数码管循环

4位数码管循环

4位数码管循环4位数码管是一种常见的显示设备,它由4个七段数码管组成,可以显示0-9的数字。

这种设备广泛应用于各种计数、计时、计量和显示等场合。

本文将从不同角度介绍4位数码管的循环特性及其应用。

一、4位数码管的循环原理4位数码管的循环原理是通过逐个切换数码管的工作状态来实现的。

每个数码管在一段时间内显示一个数字,然后迅速切换到下一个数码管,如此循环往复。

通过快速切换的方式,人眼会产生视觉暂留效应,从而形成连续显示的效果。

二、4位数码管的应用领域1. 计数器:4位数码管可以用于制作计数器,如电子钟、秒表等。

它可以精确显示时间,方便人们进行时间的观测和计量。

2. 温度计:通过传感器获取温度数据,并将其转化为数字信号后,可以用4位数码管显示当前的温度值。

3. 汽车仪表盘:4位数码管可以用于显示汽车的速度、转速、油量等信息。

它可以直观地告知驾驶员车辆的状态。

4. 电子秤:通过传感器检测物体的重量,并将其转化为数字信号后,可以用4位数码管显示物体的净重。

5. 电子游戏:4位数码管可以用于制作各种电子游戏设备,如数独、俄罗斯方块等。

它可以实时显示游戏的得分、时间等信息,提升游戏体验。

6. 电子商标:4位数码管可以用于制作电子商标,如超市货架上的价格显示器,方便顾客了解商品的价格信息。

三、4位数码管的优势1. 显示效果好:4位数码管采用七段显示技术,可以显示数字、字母和符号等信息,显示效果清晰、鲜明。

2. 可读性强:4位数码管的显示字符大、亮度高,可以在远距离或强光环境下清晰可见。

3. 稳定可靠:4位数码管具有较高的抗干扰能力和稳定性,能够在各种环境下正常工作。

4. 使用方便:4位数码管可以通过数字输入接口或串行通信接口进行控制,操作简单、灵活。

四、4位数码管的发展趋势随着科技的不断进步,4位数码管在显示技术和应用领域上也在不断发展。

未来的4位数码管可能具备更高的分辨率、更丰富的显示效果和更强的互动性。

同时,4位数码管也将更广泛地应用于智能家居、智能交通、工业自动化等领域,为人们的生活和工作带来更多的便利和效益。

实验四 数码管的动态显示实验

实验四 数码管的动态显示实验

实验四数码管的动态显示实验班级通信1102 姓名谢剑辉学号20110803223 指导老师袁文澹一、实验目的熟悉掌握数码管动态显示的基本方法;根据已知电路和设计要求在实验板上实现数码管动态显示。

根据已知电路和设计要求在PROTEUS平台仿真实现控制系统。

二、实验内容1、在STC89C52实验平台的4位数码管上实现动态显示0123→1234→2345→3456→4567→5678→6789→7890→8901→9012→0123→不断反复,每隔2s切换显示内容。

2、思考:如何实现当4位数码管显示的内容中有“1”时,蜂鸣器蜂鸣。

三、实验原理实验要求“4位数码管上实现动态显示0123→1234→2345→3456→4567→5678→6789→7890→8901→9012→0123→不断反复,每隔2s切换显示内容”。

动态扫描可以实现要求。

简单地说,动态扫描就是选通一位,送一位数据。

原理图中的P10~P13是位选信号,即选择哪个数码管显示数字;P00~P07是段码,即要显示的数字。

可以通过依次选通一位7段数码管并通过P0端口送出显示数据。

由于人眼的视觉残留原理,如果这种依次唯一选通每一位7段数码管的动作在0.1s内完成,就会造成多位数码管同时点亮显示各自数字的假象。

本实验使用中断,实现每2s更新一次数字。

四、实验方法与步骤设计思路和方法:1、根据电路图,分析数码管动态显示的设计思路,使用中断实现每2秒更新一次数字的设计思路,以及实现当4位数码管显示的内容中有“1”时,蜂鸣器蜂鸣的设计思路。

(1)数码管动态显示的原理如“实验原理”里所述,不赘述;(2)使用中断实现每2s更新一次数字的设计思路:本次实验使用Timer0中断,由于其定时时间最大为65536us,不能实现2s的长延时,那么可以使用多次中断来实现,并且在中断到来时,不断地死循环显示数字,即根据动态显示原理“选通一位,来一位数据”。

由于最大的数字为9,则(x%10),(x+1)%10,(x+2)%10,(x+3)%10分别是千位,百位,十位,个位上的数字。

数码管动态显示实验报告

数码管动态显示实验报告

数码管动态显示实验报告数码管动态显示实验报告一、引言数码管是一种常见的电子显示器件,广泛应用于各种仪器仪表、计时器、计算器等电子设备中。

数码管动态显示实验是电子技术实验中的一项基础实验,通过控制数码管的亮灭状态,可以实现数字的显示。

本实验旨在通过实际操作,加深对数码管工作原理的理解,并掌握数码管的动态显示方法。

二、实验原理数码管是由多个发光二极管(LED)组成的,每个发光二极管代表一个数字或字符。

通过对发光二极管的亮灭状态进行控制,可以显示不同的数字或字符。

数码管一般采用共阳极或共阴极的方式接线,共阳极的数码管的阳极连接在一起,而共阴极的数码管的阴极连接在一起。

在动态显示实验中,采用的是共阳极数码管。

数码管的亮灭状态是通过控制数码管的阳极与地之间的电压差来实现的。

当某个数码管需要亮时,将其对应的阳极与地连接,电流通过发光二极管,使其发光。

当某个数码管需要灭时,将其对应的阳极与电源正极连接,断开与地的连接,发光二极管不通电,不发光。

三、实验步骤1. 准备实验所需材料:共阳极数码管、面包板、电阻、导线等。

2. 将数码管与面包板连接,确保连接正确,数码管的阳极连接到面包板的相应引脚。

3. 连接电路:将电源正极与数码管的共阳极连接,电源负极与面包板的地引脚连接。

4. 编写程序:根据控制数码管显示数字的逻辑,编写相应的程序。

5. 将程序下载到单片机中,通过单片机控制数码管的亮灭状态。

四、实验结果经过实验,我们成功实现了数码管的动态显示。

在程序的控制下,数码管可以显示不同的数字或字符,实现了数字的动态变化。

通过调整程序中的参数,可以实现不同的显示效果,如闪烁、滚动、循环等。

五、实验总结本次实验通过实际操作,加深了对数码管工作原理的理解。

通过编写程序,我们掌握了控制数码管动态显示的方法。

在实验过程中,我们遇到了一些问题,如数码管显示不正常、程序错误等,但通过仔细检查和调试,最终解决了这些问题。

通过这次实验,我们不仅学到了知识,还培养了动手实践和问题解决的能力。

4位数码管循环

4位数码管循环

4位数码管循环4位数字管循环是一种电子显示器件,通常用于显示数字。

它由一系列的发光二极管(LED)组成,可以通过控制LED的亮灭来显示不同的数字。

每个数字由7个LED组成,分别代表该数字的不同部分,例如上、上左、上右、中、下左、下右和下。

通过控制每个LED是否亮灭,可以显示任意数字。

4位数字管循环具有很多应用,可以用于时钟、计时器、温度显示器、计数器等。

它非常常见,几乎可以在生活的各个领域见到它的身影。

接下来,我们将从原理、显示方式和应用三个方面详细介绍4位数字管循环。

首先,我们来了解一下4位数字管循环的原理。

它由一个计数器和一个编码器组成。

计数器用来递增数字,从0到9,然后循环到0。

编码器用来将计数器的输出转换为对应的LED亮灭状态,以显示相应的数字。

计数器和编码器之间通过电子部件连接,控制信号流动,从而实现数字的循环显示。

接下来,我们来了解一下4位数字管循环的显示方式。

在每一个时刻,4位数字管循环只显示一个数字。

显示的四位数字依次排列,从左到右。

通过计数器和编码器的控制,依次显示0、1、2、3……9,然后再循环回0。

这种循环显示的方式使得数字能够连续地在4位数字管上显示,给人一种流动的感觉。

最后,我们来了解一下4位数字管循环的应用。

它广泛应用于各种计时和计数设备中。

例如,我们可以将它用于显示时钟。

通过将4位数字管循环与时钟芯片连接,可以实现精准的时间显示。

此外,它还可以用于计时器,例如比赛计时器、烹饪计时器等。

通过控制4位数字管循环的显示,可以实现秒表功能。

另外,它还可以用于温度显示器,通过将4位数字管循环与温度传感器连接,可以实时显示当前温度。

这样,人们可以方便地了解当前环境的温度变化。

除了以上应用外,4位数字管循环还可以用于计数器。

例如,我们可以将它用于自动售货机中,通过计数器对销售商品的数量进行统计和显示。

此外,它还可以用于电子秤,通过显示当前物品的重量。

这样,人们可以方便地了解物品的重量信息。

课题四 数码管显示

课题四  数码管显示

图4-1 数码管显示实物图
任务一
LED数码管的静态显示
本任务就是将单片机与数码管接成图 4-2所示静态显示方式,编程实现数码管 每隔0.5s的0-9数字显示。
图4-2
数码管显示电路图
一、任务分析
所谓静态显示,就是当单片机某一端口输出 一组显示数据之后,该端口一直保持该数据输出, 维持数码管的显示数字,直到端口数据改变,又 保持显示下一数据的显示方式。 在具体电路连接上,将单片机一个端口的八 个端子接在一只数码管的八个引脚上(h端为小数 点),控制数码管的七段LED的亮或熄,显示器 出数字,这种显示控制方式就是静态显示。静态 显示电路连接特点是单片机端口的每一位与数码 管的一个端相连接,相当于单片机的一个引脚外 接一只发光二极管。
unsigned char dispcount; void delay02s(void) { unsigned char i,j,k; for(i=10;i>0;i--) for(j=200;j>0;j--) for(k=248;k>0;k--);} void main(void) { while(1) {for(dispcount=0;dispcount<8;dispcount++) { P0=tablewe[dispcount]; P1=tabledu[dispcount]; delay02s(); } } }
数码管段码表
表4-1 共阴数码管显示数字的段码表
段名称 dp g f e d c b a 对应段码
对应引脚
数字0 数字1 数字2 数字3 数字4 数字5 数字6 数字7 数字8
P1.7
0 0 0 0 0 0 0 0 0
P1.6
0 0 1 1 1 1 1 0 1

工作报告之数码管显示实验报告

工作报告之数码管显示实验报告

数码管显示实验报告【篇一:嵌入式实验报告数码管显示实验】实验报告课程名称实验仪器实验名称系别专业班级/学号学生姓名实验日期成绩指导教师嵌入式系统编程实践清华同方辰源嵌入式系统实验箱实验四:数码管显示实验 __计算机学院_ _ 2013年10月11日___________________实验四:数码管显示实验一、实验问题回答(1)如何设置功能3,4中的循环速度?答:利用系统systick handler中断,控制循环速度void systick_handler (void){event = 1;}(2)若是想实现类似实验(三)通过键盘动态控制循环速度,考虑一下应该如何设计?答: systickperiodset(sysctlclockget() / x)//设置x的大小就可以控制循环的速度。

void reset_counter_speed(int x){systickintdisable();systickdisable();systickperiodset(sysctlclockget() / x);// 设置x,控制计数频率,值与频率成正比systickenable();systickintenable();},达到预期的效果。

二、实验目的和效果(效果即是否达到实验目的,达到的程度如何)学习、了解和掌握数码管工作原理和使用方法实验结果及检查(1)默认在在oled屏幕上分行显示自己的学号、姓名、项目序号、时间,如“2010011001”、“zhangsan”、“work4”、“2012-11-”(2)首先在屏幕上显示四个功能选单,通过键盘a-f键选择不同功能,选择后屏幕显示相关功能提示,接受键盘输入的数字键0-9并在数码管上显示。

如:开始显示:“please choose the function:” “a: ?” “b: ?” “c: ?” “d: ?”按下“a”键后,显示”now you choose function a”(3)按下键盘后,根据不同功能在数码管上显示按键字符。

数码管显示实验

数码管显示实验

数码管显示实验一、实验目的通过实验掌握LED的显示控制方法。

通过实验加深对ICC总线工作原理的掌握。

二、实验内容编写程序使实验板上八段数码管循环显示0到9字符。

三、实验设备硬件:Embest EduKit-Щ实验平台,ULINK USB-JTAG 仿真器套件,PC机。

软件:uVision IDE for ARM集成开发环境,Windows 98/2000/NT/XP。

四、实验说明1、实验参考程序:/****************************************************************************** **************** File: 8led.c* Author: Embest* Desc:8-segment digit LED control functions* History:* Y.J.Guo, Programming modify, April 2, 2005******************************************************************************* **************//*------------------------------------------------------------------------------------------*//* include files*//*------------------------------------------------------------------------------------------*/#include "2410lib.h"#include "8led_test.h"#include "iic_8led.h"/*------------------------------------------------------------------------------------------*//* global variables*//*------------------------------------------------------------------------------------------*/unsigned char f_szDigital[10] ={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; // 0 ~ 9/****************************************************************************** **************** name: led8_test()* func: test 8led* para: none* ret: none* modify:* comment: write data to display buffer of ZLG7290,then we can see figure scrolling on LED.******************************************************************************* **************/void led8_test(void){int i, j, k;uart_printf("\n 8-segment Digit LED Test Example (Please look at LED)\n");iic_init_8led(); //// for(;;)// {// for(j=0; j<10; j++)// {// for(i=0; i<8; i++)// {// k = 9-(i+j)%10;iic_write_8led(0x70 0x10+i, f_szDigital[k]); //write to DpRam0~DpRam7 of ZLG7290// }// delay(10000);// }// }}2、将以上程序中的“iic_write_8led(0x70 0x10+i, f_szDigital[k]); ”换成“iic_write_8led(0x70 0x10, f_szDigital[8]);”运行后看第几个灯显示“8”,其对应引脚为10。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

班级学号姓名实验组别
实验日期室温报告日期成绩
报告内容:(目的和要求、原理、步骤、数据、计算、小结等)
实验名称:实验4数码管循环显示实验
一、实验目的
了解数码管动态显示原理,学会LPC2103通用I/O口的使用。

二、实验及说明
本实验中共接入了8个共阳八段数码管(数码管阳极连在一起),演示数码管中的某一段点亮只需在对应的位置写入“0”即可。

在这里74HC595实现了数据串并转换的功能,试验中用到的两片74HC595分别用于控制八个数码管的位选和其中每个数码管的段选。

本实验循环显示了十六进制数码“0—F”。

三、实验说明
四、实验步骤
1.实验连线
段选控制芯片(U7:74HC595)时钟控制端接LPC2103总线接口模块的P0.4,数据输入端接总线接口模块的P0.6,选通端接跳线JP9。

数据输出端分别接数码管段选端。

位选控制芯片(U8:74HC595)时钟控制端接LPC2103总线接口模块的P0.4,数据端接总线接口模块的P0.7,选通端接跳线JP10。

数据输出端分别接数码管位选端。

JP9:左跳数码管段选芯片(U7)片选有效,右跳液晶显示EN有效。

JP10:左跳数码管位选芯片(U8)片选有效,右跳液晶显示CS2有效。

JP14:左跳数码管段选、位选电源端(+3.3V)有效。

JP15:左跳数码管段选、位选芯片接地端(GND)有效。

2.仿真器的设置:一般选用JTAG调试,若使用RelInFlash生成目标时,编译连接生成的目标代码会将芯片加密。

此时调试无法继续,须将硬件调成ISP模式进行全片擦除。

3.运行程序:show.hex
4.接通电源,观察实验板上数码管的变化。

四、原理图
五、实验程序
#include "config.h"
#define LS_SH (1<<4) //clk
#define LS_DS_D (1<<6) //duan data
#define LS_DS_W (1<<7) //wei data
#define ST_CP1 (1<<8) //duan store
#define ST_CP2 (1<<11) //wei store
#define LS_DS (1<<10) //LED data
#define ST_CP3 (1<<12) //LED store
uint8 SEG_TAB[17] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
//数码显示段码表0 1 2 3 4 5 6 7 8 9 a b c d e f -
uint8 SEG_TABDOT[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//带小数点的段码表0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
uint8 BIT_TAB[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//数码显示位码表第1位 (8)
#define uint unsigned int
#define uchar unsigned char
void delay(uint32 i)
{
uint32 j;
for(;i>0;i--)
for(j=50000;j>0;j--);
}
void SENT_NUM(uint8 date,uint8 wei)
{
uint i;
IO0CLR=ST_CP1; //sent data
for(i=8;i>0;i--)
{
IO0CLR=LS_SH;
if((date&0x80)!=0)
{ IO0SET=LS_DS_D; }
else
{ IO0CLR=LS_DS_D; }
date=date<<1;
IO0SET=LS_SH;
}
IO0SET=ST_CP1; //sent data end
IO0CLR=ST_CP2; //sent wei
for(i=8;i>0;i--)
{
IO0CLR=LS_SH;
if((wei&0x80)!=0)
{ IO0SET=LS_DS_W; }
else
{ IO0CLR=LS_DS_W; }
wei=wei<<1;
IO0SET=LS_SH;
}
IO0SET=ST_CP2; //sent wei end }
void SENT_LED(uint8 date)
{
uint i;
for(i=8;i>0;i--)
{
IO0CLR=LS_SH;
if((date&0x80)!=0)
{ IO0SET=LS_DS; }
else
{ IO0CLR=LS_DS; }
date=date<<1;
IO0SET=LS_SH;
}
IO0SET=ST_CP3;
}
int main (void)
{// add user source code
uint z;
PINSEL0=0x00000000; //P0.4 0.10 0.12 GPIO
SCS=0x00; //low power
IO0DIR=0xffffffff; //P0.4 0.10 0.12 OUTPUT
while(1)
{
for(z=0;z<16;z++)
{
if(z<8)
{
SENT_NUM(SEG_TAB[z],BIT_TAB[z]);
SENT_LED(flowlamp_TAB[7-z]);
}
else
{
SENT_NUM(SEG_TAB[z],BIT_TAB[15-z]);
SENT_LED(flowlamp_TAB[15-z]);
}
delay(30);
}
}
return 0;
}
六、流程图
Y
显示子程序流程图
驱动子程序流程图。

相关文档
最新文档