8位数码管动态显示的频率计

第一篇:8位数码管动态显示的频率计

       一、课程设计要求

       设计一个8位数码管显示的频率计(频率分辨率为0.1Hz)。

       二、总体结构框图

       系统时钟分频及控制待测频率计数数据锁存动态扫描数码管段选数码管位选数码管显示

       图1 总体结构框图

       三、课程设计原理

       在电子技术中,频率是最基本的参数之一,并且与许多点参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得尤为重要。测量频率的方法有很多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。

       数字式频率计的测量原理有两类:一是直接测频法,即在一定的闸门时间内测量被测信号的脉冲个数;二是间接测频法即周期法,如周期测频法。直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数阀门的时间长短以达到不同的测量精度;间接测频法适用于低频信号的频率测量。

       本次课程设计中使用的是直接测频法,即用计数器在计算机10s内输入信号周期的个数,其测频范围为0Hz-9999999.9Hz。

       四、器件的选择

       1、装有QuartusII软件的计算机一台。

       2、芯片:使用altera公司生产的Cyclone系列芯片,本实验箱中为EP1C8Q208C8N芯片。

       3、EDA实验箱一个。

       4、下载接口是数字芯片的下载接口(JTAG)主要用于FPGA芯片的数据下载。

       5、时钟源。

       五、功能模块和信号仿真图以及源程序

       (1)系统时钟分频及控制的功能模块图及其源程序

       图2 功能模块图

       作用:将试验箱上的20MHz的晶振分频,输出CLOCK为数码管提供1kHz的动态扫描频率。TSTEN输出为0.05s的信号,对频率计中的32位十进制计数器CNT10的ENA使能端进行同步控制,当TSTEN高电平时允许计数,低电平时停止计数,并保持其所计的脉冲数。在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前一秒的计数值锁存进锁存器REG32B中,并由外部的十进制7段数码管显示计数值。设置锁存器的好处是数据显示稳定,不会由于周期性的清零信号而不断闪烁。锁存信号后,必须有一个清零信号CLR_CNT对计数器进行清零,为下一秒的计数操作做准备。该模块的信号仿真图如下:

       图3 仿真波形图

       源程序如下: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY FPKZ IS PORT(CLK:IN STD_LOGIC;

       TSTEN : OUT STD_LOGIC;

       CLR_CNT : OUT STD_LOGIC;

       LOAD : OUT STD_LOGIC;

       CLOCK:OUT STD_LOGIC);END FPKZ;ARCHITECTURE BEHAV OF FPKZ IS SIGNAL COUNT1:INTEGER RANGE 0 TO 20000;SIGNAL COUNT2:INTEGER RANGE 0 TO 20000;SIGNAL CLK_DATA1:STD_LOGIC;SIGNAL CLK_DATA2:STD_LOGIC;SIGNAL DIV2CLK : STD_LOGIC;BEGIN PROCESS(CLK)BEGIN

       IF CLK'EVENT AND CLK='1' THEN IF COUNT1=10000 THEN

       COUNT1<=0;

       CLK_DATA1<=NOT CLK_DATA1;ELSE COUNT1<=COUNT1 1;END IF;END IF;END PROCESS;PROCESS(CLK_DATA1)BEGIN IF CLK_DATA1'EVENT AND CLK_DATA1='1' THEN IF COUNT2=500 THEN

       COUNT2<=0;

       CLK_DATA2<=NOT CLK_DATA2;ELSE COUNT2<=COUNT2 1;END IF;END IF;END PROCESS;PROCESS(CLK_DATA2)BEGIN IF(CLK_DATA2'EVENT AND CLK_DATA2='1')THEN DIV2CLK<=NOT DIV2CLK;END IF;END PROCESS;PROCESS(CLK_DATA2,DIV2CLK)BEGIN IF(CLK_DATA2='0' AND DIV2CLK='0')THEN CLR_CNT<='1';ELSE CLR_CNT<='0';

       END IF;END PROCESS;CLOCK<=CLK_DATA2;LOAD<=NOT DIV2CLK;TSTEN<=DIV2CLK;END BEHAV;

       (2)十进制计数器的功能模块图及其源程序

       图4 功能模块图

       作用:当使能端为高电平,清零端为低电平时,实现十进制计数功能。

       第一个CNT10计数输出CQ=9时,下一秒时钟上升沿到来时,将产生一个CARRY_OUT信号作为下一个CNT10的时钟信号,同时CQ清零,依次递推到8个CNT10。

       当清零端为低电平,使能端为低电平时停止计数。当清零端为高电平时,计数器清零。该模块的信号仿真图如下:

       图5 仿真波形图

       源程序如下:

       LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY CNT10 IS PORT(CLK: IN STD_LOGIC;

       CLR: IN STD_LOGIC;

       ENA: IN STD_LOGIC;

       CQ : OUT INTEGER RANGE 0 TO 9;

       CARRY_OUT: OUT STD_LOGIC);END CNT10;ARCHITECTURE behav OF CNT10 IS SIGNAL CQI: INTEGER RANGE 0 TO 9;BEGIN PROCESS(CLR,CLK,ENA)BEGIN IF(CLR='1')THEN CQI<=0;ELSIF(CLK'EVENT AND CLK='1')THEN

       IF(ENA='1')THEN

       IF(CQI=9)THEN

       CQI<=0;

       CARRY_OUT<='1';

       ELSE

       CQI<=CQI 1;

       CARRY_OUT<='0';

       END IF;

       END IF;END IF;END PROCESS;CQ<=CQI;END behav;

       (3)32位锁存器的功能模块图及其源程序

       图6 功能模块图

       实现方式:LOAD信号上升沿到来时将对输入到内部的CNT10计数信号进行锁存。作用:锁存信号,并将结果输出给SELTIME。该模块的信号仿真图如下:

       图7 仿真波形图

       源程序如下:

       LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG32B IS

       PORT(LOAD: IN STD_LOGIC;DIN: IN STD_LOGIC_VECTOR(31 DOWNTO 0);DOUT: OUT STD_LOGIC_VECTOR(31 DOWNTO 0));END ENTITY REG32B;ARCHITECTURE behav OF REG32B IS BEGIN

       PROCESS(LOAD,DIN)IS BEGIN

       IF LOAD'EVENT AND LOAD='1' THEN DOUT<=DIN;

       END IF;END PROCESS;END ARCHITECTURE behav;

       (4)数码管扫描的功能模块图及其源程序

       图8 功能模块图

       作用:锁存信号输出DIN[31..0],然后由SELTIME进行扫描输出,当SEL为”000”时选通第一个CNT10,输出到LED7进行译码输出。依次类推。该模块的信号仿真图如下:

       图9 仿真波形图

       源程序如下:

       LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SELTIME IS PORT(CLK : IN STD_LOGIC;

       DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0);

       DAOUT: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

       SEL : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END SELTIME;ARCHITECTURE behav OF SELTIME IS SIGNAL SEC : STD_LOGIC_VECTOR(2 DOWNTO 0);BEGIN PROCESS(CLK)BEGIN

       IF(CLK'EVENT AND CLK='1')THEN

       IF(SEC=“111”)THEN

       SEC<=“000”;

       ELSE

       SEC<=SEC 1;

       END IF;

       END IF;END PROCESS;

       PROCESS(SEC,DIN(31 DOWNTO 0))BEGIN CASE SEC IS WHEN “000”=>DAOUT<=DIN(3 DOWNTO 0);WHEN “001”=>DAOUT<=DIN(7 DOWNTO 4);WHEN “010”=>DAOUT<=DIN(11 DOWNTO 8);WHEN “011”=>DAOUT<=DIN(15 DOWNTO 12);WHEN “100”=>DAOUT<=DIN(19 DOWNTO 16);WHEN “101”=>DAOUT<=DIN(23 DOWNTO 20);WHEN “110”=>DAOUT<=DIN(27 DOWNTO 24);WHEN “111”=>DAOUT<=DIN(31 DOWNTO 28);WHEN OTHERS=>NULL;

       END CASE;END PROCESS;SEL<=SEC;END behav;

       (5)七段数码管译码显示的功能模块图及其源程序

       图10 功能模块图

       作用:将实验结果使用数码管直观的显示出来。该模块的信号仿真图如下:

       图11 仿真波形图

       源程序如下:

       LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY LED7 IS PORT(DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);DOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END LED7;ARCHITECTURE behav OF LED7 IS--SIGNAL LED7:STD_LOGIC_VECTOR(6 DOWNTO 0);BEGIN PROCESS(DIN)BEGIN CASE DIN IS WHEN “0000”=>DOUT<=“0111111”;WHEN “0001”=>DOUT<=“0000110”;WHEN “0010”=>DOUT<=“1011011”;

       WHEN “0011”=>DOUT<=“1001111”;WHEN “0100”=>DOUT<=“1100110”;WHEN “0101”=>DOUT<=“1101101”;WHEN “0110”=>DOUT<=“1111101”;WHEN “0111”=>DOUT<=“0000111”;WHEN “1000”=>DOUT<=“1111111”;WHEN “1001”=>DOUT<=“1101111”;WHEN “1010”=>DOUT<=“1110111”;WHEN “1011”=>DOUT<=“1111100”;WHEN “1100”=>DOUT<=“0111001”;WHEN “1101”=>DOUT<=“1011110”;WHEN “1110”=>DOUT<=“1111001”;WHEN “1111”=>DOUT<=“1110001”;WHEN OTHERS=>NULL;END CASE;END PROCESS;END ARCHITECTURE behav;

       (6)3-8译码器的功能模块图及其源程序

       图12 功能模块图

       作用:利用3-8译码器将数码管的位选信号选通。该模块的信号仿真图如下:

       图13 仿真波形图

       源程序如下:

       LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY LS138 IS

       PORT(Q: IN STD_LOGIC_VECTOR(2 DOWNTO 0);

       D: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END LS138;ARCHITECTURE behav OF LS138 IS BEGIN

       WITH Q SELECT

       D<=“00000001” WHEN “000”, END behav;

       “00000010” WHEN “001”, “00000100” WHEN “010”, “00001000” WHEN “011”, “00010000” WHEN “100”, “00100000” WHEN “101”, “01000000” WHEN “110”, “10000000” wHEN “111”, “11111111” WHEN OTHERS;WITH Q SELECT

       dp<='1' WHEN “001”, '0' WHEN OTHERS;

       六、顶层模块图

       图14 总体设计顶层模块图

       其中8个十进制计数器模块JSQ的底层模块图如图15所示:

       图15 计数器模块原理图

       本次课程设计的时钟信号由试验箱上面的20MHz的晶振提供,经过系统时钟和控制模块后分别产生0.05Hz和1kHz的脉冲信号0.05Hz的脉冲信号十进制计数器的使能信号,使计数器统计出待测信号在10s脉宽之间的脉冲数目。再由计数模块将测得的信号传送给数码管显示部分,通过译码模块产生可以在数码管上显示的BCD码。而1kHz是作为数码管动态扫描的频率,由于人的视觉暂留现象,频率较高时,数码管看起来就是连续发光。本设计中使个位显示为数码管的小数点后面一位,由此实现了频率分辨率为0.1Hz的频率计设计。

       七、实际电路测试

       在quartus中将总体项目工程做好后,进行引脚分配和下载。下载成功后,改变输入信号进行测试,测试结果如下:

       (1)当输入信号为10.5Hz时,数码管显示10.5Hz

       图16 输入为10.5Hz

       (2)当输入信号为10.5Hz时,数码管显示10.5Hz

       图17 输入为100.4Hz(3)当输入信号为888.8Hz时,数码管显示888.8Hz

       图18 输入为888.8Hz

       结论

       EDA技术是电子设计的发展趋势,利用EDA工具可以代替设计者完成电子系统设计中的大部分工作。EDA工具从数字系统设计的单一领域,发展到今天,应用范围己涉及模拟、微波等多个领域,可以实现各个领域电子系统设计的测试、设计仿真和布局布线等,这些都是我在这次课设中深刻体会到的。经过这次课程设计,让我真正认识了EDA这门学科,了解到这种方式下的设计方案,硬件电路简洁,集成度高,体现了当今社会所需的先进技术,日后必定在有着广阔的发展空间。

       通过这次对EDA课程设计的进一步操作,能更好的在Quartus II上进行VHDL程序的编译及各个模块的仿真,虽然在实际操作过程中由于粗心造成了程序的缺失和错误,但都在老师和同学的帮助下一一解决了。很好地巩固了我们学过的专业知识,使我对数字系统结构也有了更进一步的了解和认识,同时对数据库软件EDA技术、VHDL等系列知识都有了一定的了解。使用EDA技术开发页面的能力也有了很大提高,也使我们把理论与实践从真正意义上相结合了起来;考验了我们借助互联网络搜集、查阅相关文献资料,和组织材料的综合能力。

       在这次课程设计中,虽然应用的都是在书本上学过的知识,但是只有应用到实际中才算真正的学懂了这些知识。本次数字频率计的涉及到了VHDL语言、Quartus II软件,EDA技术等。涉及了微机原理和EDA所学的大部分内容。通过这次课程设计实践巩固了学过的知识并能够较好的利用。课程设计实践不单是将所学的知识应用于实际,在设计的过程中,只拥有理论知识是不够的。逻辑思维、电路设计的步骤和方法、考虑问题的思路和角度等也是很重要,需要我们着重注意锻炼的能力。在这次设计中还发现理论与实际常常常存在很大差距,为了使电路正常工作,必须灵活运用原理找出解决方法。

       在课题设计中,通过使用Quartus II这个完全集成化、易学易用的可编程逻辑设计环境,利用VHDL语言设计完成八位十进制数字频率计,能够较好的测定所给频率,并且具有自动清零和自动测试的功能,基本符合此次课程设计给出的要求。

       致谢

       经过这几周的实际操作,使我提高了很多只有在实际操作中遇到的问题并解决问题的能力,虽然过程比较累,有时也心烦意乱,但是经过周围同学与老师的帮助指导与帮助,最终顺利的完成了此次课程设计。

       在此,我要向在百忙之中抽时间对本课程设计进行审阅的老师表示感谢,同时,也要感谢本次设计同组的同学,不仅使我完成了实验,还从中学到了许多宝贵的知识,增长了我计算机方面的技能。感谢他在我遇到困难时的热情帮助,在课程设计中,我们积极的交流与探讨也使我受益非浅,希望在以后的学习道路中我们能够共同进步。

       在此我谨向我的老师以及在课程设计过程中给予我很大帮助的同学们致以最诚挚的谢意。

第二篇:VHDL八位数码管频率计课程设计

       一、课程设计要求

       设计一个8位数码管显示的频率计(频率分辨率为1Hz)。

       二、总体结构框图

       系统时钟分频及控制待测频率计数数据锁存动态扫描数码管段选数码管位选数码管显示

       图1 总体结构框图

       三、课程设计原理

       在电子技术中,频率是最基本的参数之一,并且与许多点参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得尤为重要。测量频率的方法有很多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。

       数字式频率计的测量原理有两类:一是直接测频法,即在一定的闸门时间内测量被测信号的脉冲个数;二是间接测频法即周期法,如周期测频法。直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数阀门的时间长短以达到不同的测量精度;间接测频法适用于低频信号的频率测量。

       本次课程设计中使用的是直接测频法,即用计数器在计算机1s内输入信号周期的个数,其测频范围为0Hz-99999999Hz。

       四、器件的选择

       1、装有QuartusII软件的计算机一台。

       2、芯片:本实验板中为EP芯片。

       3、EDA实验箱一个。

       4、下载接口是数字芯片的下载接口(JTAG)主要用于FPGA芯片的数据下载。

       5、时钟源。

       五、功能模块和信号仿真图以及源程序

       (1)系统时钟分频及控制的功能模块图及其源程序

       图2 功能模块图

       作用:将试验箱上的50MHz的晶振分频,输出CLOCK为数码管提供1kHz的动态扫描频率。CNT_EN输出为0.05s的信号,对频率计中的32位十进制计数器CNT10的ENA使能端进行同步控制,当TSTEN高电平时允许计数,低电平时停止计数,并保持其所计的脉冲数。在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前一秒的计数值锁存进锁存器REG32B中,并由外部的十进制7段数码管显示计数值。设置锁存器的好处是数据显示稳定,不会由于周期性的清零信号而不断闪烁。锁存信号后,必须有一个清零信号RST_CNT对计数器进行清零,为下一秒的计数操作做准备。该模块的信号仿真图如下:

       图3 仿真波形图

       源程序如下:

       --分频

       library ieee;use ieee.std_logic_1164.all;entity fdivwangzheng is port(clk0:in std_logic;--输入系统时钟

       clk1:out std_logic;--输出1hz时钟信号

       clk2:out std_logic);--输出显示扫描时钟信号

       end fdivwangzheng;architecture a of fdivwangzheng is begin

       p1:process(clk0)variable cnt:integer range 0 to 49999999;--分频系数为24999999 variable ff:std_logic;begin if clk0'event and clk0='1' then if cnt<49999999 then cnt:=cnt 1;else cnt:=0;ff:=not ff;--反向 end if;end if;clk1<=ff;end process p1;p2:process(clk0)

       variable cnn:integer range 0 to 999;--分频系数为499 variable dd:std_logic;begin if clk0'event and clk0='1' then if cnn<999 then cnn:=cnn 1;else cnn:=0;dd:=not dd;--反向 end if;end if;clk2<=dd;end process p2;end a;

       --测频控制器(testctl.vhd)LIBRARY IEEE;

       USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY TESTCTLwanzheng IS

       PORT(CLKK : IN STD_LOGIC;--1Hz

       CNT_EN,RST_CNT,LOAD : OUT STD_LOGIC);

       END TESTCTLwanzheng;ARCHITECTURE behav OF TESTCTLwanzheng IS

       SIGNAL DIV2CLK : STD_LOGIC;BEGIN

       PROCESS(CLKK)

       BEGIN

       IF CLKK'EVENT AND CLKK = '1' THEN DIV2CLK <= NOT DIV2CLK;

       END IF;

       END PROCESS;

       PROCESS(CLKK, DIV2CLK)

       BEGIN

       IF CLKK='0' AND Div2CLK='0' THEN RST_CNT <= '1';

       ELSE RST_CNT <= '0';

       END IF;

       END PROCESS;

       LOAD <= NOT DIV2CLK;

       CNT_EN <= DIV2CLK;END behav;(2)十进制计数器的功能模块图及其源程序

       图4 功能模块图

       作用:当使能端为高电平,清零端为低电平时,实现十进制计数功能。

       第一个CNT10计数输出CQ=9时,下一秒时钟上升沿到来时,将产生一个CARRY_OUT信号作为下一个CNT10的时钟信号,同时CQ清零,依次递推到8个CNT10。

       当清零端为低电平,使能端为低电平时停止计数。当清零端为高电平时,计数器清零。该模块的信号仿真图如下:

       图5 仿真波形图

       源程序如下:

       LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY CNT10 IS PORT(CLK: IN STD_LOGIC;

       CLR: IN STD_LOGIC;

       ENA: IN STD_LOGIC;

       CQ : OUT INTEGER RANGE 0 TO 9;

       CARRY_OUT: OUT STD_LOGIC);END CNT10;ARCHITECTURE behav OF CNT10 IS SIGNAL CQI: INTEGER RANGE 0 TO 9;BEGIN PROCESS(CLR,CLK,ENA)BEGIN IF(CLR='1')THEN CQI<=0;ELSIF(CLK'EVENT AND CLK='1')THEN

       IF(ENA='1')THEN

       IF(CQI=9)THEN

       CQI<=0;

       CARRY_OUT<='1';

       ELSE

       CQI<=CQI 1;

       CARRY_OUT<='0';

       END IF;

       END IF;END IF;END PROCESS;CQ<=CQI;END behav;

       (3)32位锁存器的功能模块图及其源程序

       图6 功能模块图

       实现方式:LOAD信号上升沿到来时将对输入到内部的CNT10计数信号进行锁存。作用:锁存信号,并将结果输出给SELTIME。该模块的信号仿真图如下:

       图7 仿真波形图

       源程序如下:

       LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG32B IS

       PORT(LOAD: IN STD_LOGIC;DIN: IN STD_LOGIC_VECTOR(31 DOWNTO 0);DOUT: OUT STD_LOGIC_VECTOR(31 DOWNTO 0));END ENTITY REG32B;ARCHITECTURE behav OF REG32B IS BEGIN

       PROCESS(LOAD,DIN)IS BEGIN

       IF LOAD'EVENT AND LOAD='1' THEN DOUT<=DIN;

       END IF;END PROCESS;END ARCHITECTURE behav;

       (4)数码管扫描的功能模块图及其源程序

       图8 功能模块图

       作用:锁存信号输出DIN[31..0],然后由SELTIME进行扫描输出,当SEL为”000”时选通第一个CNT10,输出到LED7进行译码输出。依次类推。该模块的信号仿真图如下:

       图9 仿真波形图

       源程序如下:

       LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SELTIME IS PORT(CLK : IN STD_LOGIC;

       DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0);

       DAOUT: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

       SEL : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END SELTIME;ARCHITECTURE behav OF SELTIME IS SIGNAL SEC : STD_LOGIC_VECTOR(2 DOWNTO 0);BEGIN PROCESS(CLK)BEGIN

       IF(CLK'EVENT AND CLK='1')THEN

       IF(SEC=“111”)THEN

       SEC<=“000”;

       ELSE

       SEC<=SEC 1;

       END IF;

       END IF;END PROCESS;

       PROCESS(SEC,DIN(31 DOWNTO 0))BEGIN CASE SEC IS WHEN “000”=>DAOUT<=DIN(3 DOWNTO 0);WHEN “001”=>DAOUT<=DIN(7 DOWNTO 4);WHEN “010”=>DAOUT<=DIN(11 DOWNTO 8);WHEN “011”=>DAOUT<=DIN(15 DOWNTO 12);WHEN “100”=>DAOUT<=DIN(19 DOWNTO 16);WHEN “101”=>DAOUT<=DIN(23 DOWNTO 20);WHEN “110”=>DAOUT<=DIN(27 DOWNTO 24);WHEN “111”=>DAOUT<=DIN(31 DOWNTO 28);WHEN OTHERS=>NULL;END CASE;END PROCESS;SEL<=SEC;END behav;

       (5)七段数码管译码显示的功能模块图及其源程序

       图10 功能模块图

       作用:将实验结果使用数码管直观的显示出来。该模块的信号仿真图如下:

       图11 仿真波形图

       源程序如下:

       LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY LED7 IS PORT(DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);DOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END LED7;ARCHITECTURE behav OF LED7 IS--SIGNAL LED7:STD_LOGIC_VECTOR(6 DOWNTO 0);BEGIN PROCESS(DIN)BEGIN CASE DIN IS WHEN “0000”=>DOUT<=“0111111”;WHEN “0001”=>DOUT<=“0000110”;WHEN “0010”=>DOUT<=“1011011”;WHEN “0011”=>DOUT<=“1001111”;WHEN “0100”=>DOUT<=“1100110”;WHEN “0101”=>DOUT<=“1101101”;WHEN “0110”=>DOUT<=“1111101”;WHEN “0111”=>DOUT<=“0000111”;WHEN “1000”=>DOUT<=“1111111”;WHEN “1001”=>DOUT<=“1101111”;WHEN “1010”=>DOUT<=“1110111”;WHEN “1011”=>DOUT<=“1111100”;WHEN “1100”=>DOUT<=“0111001”;WHEN “1101”=>DOUT<=“1011110”;WHEN “1110”=>DOUT<=“1111001”;WHEN “1111”=>DOUT<=“1110001”;WHEN OTHERS=>NULL;END CASE;END PROCESS;END ARCHITECTURE behav;(6)3-8译码器的功能模块图及其源程序

       图12 功能模块图

       作用:利用3-8译码器将数码管的位选信号选通。该模块的信号仿真图如下:

       图13 仿真波形图

       源程序如下:

       LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY LS138 IS

       PORT(Q: IN STD_LOGIC_VECTOR(2 DOWNTO 0);

       D: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

       dp:OUT STD_LOGIC);END LS138;ARCHITECTURE behav OF LS138 IS BEGIN

       WITH Q SELECT

       D<=“11111110” WHEN “000”, “11111101” WHEN “001”, “11111011” WHEN “010”, “11110111” WHEN “011”, “11101111” WHEN “100”, “11011111” WHEN “101”, “10111111” WHEN “110”, “01111111” wHEN “111”, “11111111” WHEN OTHERS;WITH Q SELECT

       dp<='1' WHEN “001”, '0' WHEN OTHERS;END behav;

       六、顶层模块图

       图14 总体设计顶层模块图

       其中8个十进制计数器模块JSQ的底层模块图如图15所示:

       图15 计数器模块原理图

       本次课程设计的时钟信号由试验箱上面的5MHz的晶振提供,经过系统时钟和控制模块后分别产生0.05Hz和10kHz的脉冲信号0.05Hz的脉冲信号十进制计数器的使能信号,使计数器统计出待测信号在1s脉宽之间的脉冲数目。再由计数模块将测得的信号传送给数码管显示部分,通过译码模块产生可以在数码管上显示的BCD码。而1kHz是作为数码管动态扫描的频率,由于人的视觉暂留现象,频率较高时,数码管看起来就是连续发光。本设计中使个位显示为数码管的小数点后面一位,由此实现了频率分辨率为1Hz的频率计设计。

       结论

       EDA技术是电子设计的发展趋势,利用EDA工具可以代替设计者完成电子系统设计中的大部分工作。EDA工具从数字系统设计的单一领域,发展到今天,应用范围己涉及模拟、微波等多个领域,可以实现各个领域电子系统设计的测试、设计仿真和布局布线等,这些都是我在这次课设中深刻体会到的。经过这次课程设计,让我真正认识了EDA这门学科,了解到这种方式下的设计方案,硬件电路简洁,集成度高,体现了当今社会所需的先进技术,日后必定在有着广阔的发展空间。

       通过这次对EDA课程设计的进一步操作,能更好的在Quartus II上进行VHDL程序的编译及各个模块的仿真,虽然在实际操作过程中由于粗心造成了程序的缺失和错误,但都在老师和同学的帮助下一一解决了。很好地巩固了我们学过的专业知识,使我对数字系统结构也有了更进一步的了解和认识,同时对数据库软件EDA技术、VHDL等系列知识都有了一定的了解。使用EDA技术开发页面的能力也有了很大提高,也使我们把理论与实践从真正意义上相结合了起来;考验了我们借助互联网络搜集、查阅相关文献资料,和组织材料的综合能力。

       在这次课程设计中,虽然应用的都是在书本上学过的知识,但是只有应用到实际中才算真正的学懂了这些知识。本次数字频率计的涉及到了VHDL语言、Quartus II软件,EDA技术等。涉及了微机原理和EDA所学的大部分内容。通过这次课程设计实践巩固了学过的知识并能够较好的利用。课程设计实践不单是将所学的知识应用于实际,在设计的过程中,只拥有理论知识是不够的。逻辑思维、电路设计的步骤和方法、考虑问题的思路和角度等也是很重要,需要我们着重注意锻炼的能力。在这次设计中还发现理论与实际常常常存在很大差距,为了使电路正常工作,必须灵活运用原理找出解决方法。

       在课题设计中,通过使用Quartus II这个完全集成化、易学易用的可编程逻辑设计环境,利用VHDL语言设计完成八位十进制数字频率计,能够较好的测定所给频率,并且具有自动清零和自动测试的功能,基本符合此次课程设计给出的要求。

第三篇:单原理,数码管动态显示实验单原理实验报告

       宁德师范学院计算机系

       实验报告

       (2022—2022 学年 第 2 学期)

       课程名称 单片机原理 实验名称 数码管动态显示实验 专 业计算机科学与技术(非师范)

       年 级 2022 级 学号 B2022102147 姓名 王 秋 指导教师 杨烈君 实验日期 2022.4.17

       实验目的 :

       1.巩固 Proteus 软件和 Keil 软件的使用方法

       2.学习端口输入输出的高级应用

       3.掌握 7 段数码管的连接方式和动态显示法

       4.掌握查表程序和延时等子程序的设计

       实验 要求:

       1.在 Proteus 软件中画好 51 单片机最小核心电路,包括复位电路和晶振电路

       2.在电路中增加八位 7 段数码管(共阳/共阴自选),将 P2 口作数据输出口与 7 段数码管数据引

       脚相连,P3 引脚输出位选控制信号

       3.在 Keil 软件中编写程序,采用动态显示法,实现数码管分别显示数字 1-8

       4.实现指定数值的显示 (可使用 缓存数值)

       5.实现类似时钟的效果,如“ 13-23-25” 13 时 23 分 25 秒

       6.实现时钟的自动计时

       7.扩展要求: 结合 LED 显示,实现带数码显示的交通灯

       实验设备(环境):

       1(计算机

       2(Proteus ISIS 7 Professional 应用程序

       3(Keil 应用程序

       实验内容:

       数码管动态显示技术 要求实现:

       1(动态显示法,实现数码管分别显示数字 1-8;

       2(实现指定数值的显示(可使用 缓存数值)(33355223);

       3(实现类似时钟的效果,如“ 13-23-25” 13 时 23 分 25 秒;

       4(实现时钟的自动计时;

       扩展要求: 结合 LED 显示,实现带数码显示的交通灯;

       实验步骤、实验结果及分析:实验步骤:

       1、使用 Proteus ISIS 7 Professional 应用程序,建立一个.DSN 文件 2、在“库”下拉菜单中,选中“拾取元件”(快捷键 P),分别选择以下元件:AT89C51、CAP、CAP-ELEC、CRYSTAL、RESPACK-8。

       3、构建仿真电路:

       连接图

       显示 1-8

       显示 33355223

       显示时间 13.23.25

       时钟自动计时

       连接图

       红绿灯效果图 1

       红绿灯效果图 2

       4、创建一个 Keil 应用程序:新建一个工程项目文件;为工程选择目标器件(AT89C52);为工程项目创建源程序文件并输入程序代码;保存创建的源程序项目文件;把源程序文件添加到项目中。

       5、把用户程序经过编译后生成的 HEX 文件添加到仿真电路中的处理器中(编辑元件?文件路径)2 实验程序 <流程图>

       开始

       定义数组

       开始 Ledcode[]开始

       定义数组

       定义数组

       定义数组

       Dispbug[]Ledcode[]Ledcode[]存放指定数

       While 定义 Dispbug[]While(1)存放指定数(1)YYFor 定义子函数

       ForN(i=0;i<8(i=0;i<8PutTime())),...,调用延 YY 时函数

       P3=1<

       For 调用延时 N 调用延时(i=0;i

       开始

       P3=1<

       Ledcode[]i

       调用延时定义 Dispbug[]函数存放指定数

       If(ms>=60)定义子函数

       YPutTime()comsec=(com,...,sec 1)% 60;,ms=0

       While(1)If(comsec <20)

       YY

       Sec1=20-comsec;PutTime()Sec2=30-comsec;R1=1;y1=0;g1=0;r2=0;y2=0;g2=1;

       YForIf(comsec>=20(i=0;i<8)&& comsec<30)sec1=60-comsec;sec1=30-comsec;Sec2=60-comsec;Sec2=30-comsec;R1=0;y1=1;g1=0;R1=1;y1=0;g1=0;r2=1;y2=0;g2=0;r2=0;y2=1;g2=0;

       Y

       If(comsec>=30 If(Comsec>60)&& comsec<50)

       sec1=60-comsec;YSec2=50-comsec;R1=0;y1=0;g1=1;r2=1;y2=0;g2=0;

       程序源代码:

       1(动态显示法,实现数码管分别显示数字 1-8;

       #include

       #define uchar unsigned char #define uint unsigned int

       uchar code Ledcode[]={

       0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义一个数组里面放入 1-8

       void delay(uint x)

       {

       while(x--);

       }

       void main()

       {

       uchar i;

       while(1)

       {

       for(i=0;i<8;i )

       {

       P3=1<

       P2=~Ledcode[i];//P2 口用来显示所需要显示的数值

       delay(500);

       }

       }

       }

       2.实现指定数值的显示 (可使用 缓存数值)(33355223);

       #include

       unsigned char code LedCode[]={

       0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40

       };

       unsigned char DispBuf[8]={3,3,3,5,5,2,2,3};//指定要显示的数的位置

       void delay(unsigned int x){

       while(x--);

       }

       void main()

       {

       unsigned int i;

       for(i=0;i<8;i ){

       P3=1<

       P2=~LedCode[DispBuf[i]];//显示指定数的位置

       delay(500);

       }

       }

       3.实现类似时钟的效果,如“ 13-23-25” 13 时 23 分 25 秒;

       #include

       unsigned char code LedCode[]={

       0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

       unsigned char Hour=13,Min=23,Sec=25;unsigned char DispBuf[8];

       void delay(unsigned int x)

       {

       while(x--);

       }

       void PutTime()

       {

       DispBuf[7]=Sec;//取对应秒数的个位放在最右边显示

       DispBuf[6]=Sec/10;//取对应秒数的十位放在右起第二位显示

       DispBuf[5]=10;//此处表示秒跟分之间用横杆隔开

       DispBuf[4]=Min;

       DispBuf[3]=Min/10;

       DispBuf[2]=10;

       DispBuf[1]=Hour;

       DispBuf[0]=Hour/10;

       }

       void main()

       {

       long n=0;

       while(1)

       {

       unsigned char i;

       PutTime();

       for(i=0;i<8;i )

       {

       P3=1<

       P2=~LedCode[DispBuf[i]];

       delay(500);

       }

       }

       }

       4.实现时钟的自动计时; #include

       unsigned char code LedCode[]={

       0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

       unsigned char Hour=13,Min=23,Sec=25;

       unsigned char DispBuf[8];void delay(unsigned int x){

       while(x--);

       }

       void PutTime()

       {

       DispBuf[7]=Sec;

       DispBuf[6]=Sec/10;

       DispBuf[5]=10;

       DispBuf[4]=Min;

       DispBuf[3]=Min/10;

       DispBuf[2]=10;

       DispBuf[1]=Hour;

       DispBuf[0]=Hour/10;}

       void main()

       {

       long n=0;

       while(1)

       {

       unsigned char i,ms;//定义一个 ms 用于控制秒数加一的延时

       PutTime();

       for(i=0;i<8;i )

       {

       P3=1<

       P2=~LedCode[DispBuf[i]];

       delay(500);

       }

       ms ;//控制加一的时延

       if(ms>=20)

       {

       Sec ;ms=0;

       }

       if(Sec>=60)//表示进位,当秒满六十则向分钟进一,同时秒数清零

       {

       Min ;Sec=0;

       }

       if(Min>=60)

       {

       Hour ;Min=0;

       }

       if(Hour>=24)//当小时数满 24 小时时,则小时数清零,完成计时

       {

       Hour=0;

       }

       }

       }

       5.扩展要求: 结合 LED 显示,实现带数码显示的交通灯;

       #include “reg52.h”

       #define uint unsigned int

       #define uchar unsigned char #define Disp_Null 10

       uchar code LedCode[]={

       0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};uchar DispBuf[8];

       sbit r1=P2^0;sbit y1=P2^1;sbit g1=P2^2;

       sbit r2=P2^3;sbit y2=P2^4;sbit g2=P2^5;

       uchar sec1;sec2;comsec;

       void delay(uint x)

       {

       while(x--);

       }

       void PntTime()

       {

       DispBuf[3]=sec2 % 10;

       DispBuf[2]=sec2 / 10;

       DispBuf[1]=sec1 % 10;

       DispBuf[0]=sec1 / 10;}

       void display()

       {

       uchar i;

       for(i = 0;i < 8;i )

       {

       P3=0;

       P1=~LedCode[ DispBuf[i] ];

       P3=1<

       delay(100);

       }

       }

       void main()

       {

       while(1)

       {

       uchar ms;

       PntTime();

       display();

       ms ;

       if(ms >=60){

       ms=0;

       comsec=(comsec 1)% 60;//定义一个计数变量,使其一直保持在60 内

       }

       if(comsec <20){ //comsec 在 20 以内时 g2、r1 亮

       sec1=20-comsec;sec2=30-comsec;

       r1=1;y1=0;g1=0;

       r2=0;y2=0;g2=1;

       }

       if(comsec>=20 && comsec<30){ //comsec 在 20 与 30 之间时y2、r1 亮

       sec1=30-comsec;sec2=30-comsec;

       r1=1;y1=0;g1=0;

       r2=0;y2=1;g2=0;

       }

       if(comsec>=30 && comsec<50){ //g1、r2 在 comsec 增加 20内亮

       sec1=60-comsec;sec2=50-comsec;

       r1=0;y1=0;g1=1;

       r2=1;y2=0;g2=0;

       }

       if(comsec>=50){

       sec1=60-comsec;sec2=60-comsec;

       r1=0;y1=1;g1=0;

       r2=1;y2=0;g2=0;

       }

       }

       }

       过程总结:

       本实验是将单片机的 P2 口做为输出口,将四个数码管的七段引脚分别接到 P2.0 至P2.7.由于电路中采用共阳极的数码管,所以当 P2 端口相应的引脚为 0 时,对应的数码管段点亮。程序中预设了数字 0-9 的段码。由于是让八个数码管显示不同的数值,所以要用扫描的方式来实现。因此可定义扫描函数,接到单片机的 P3 口。

       在实验中,预设的数字段码表存放在数组 LedCode 中,由于段码表是固定的,因此存储类型可设为 code.在 Proteus 软件中按照要求画出电路,再利用 Keil 软件按需要实现的功能编写 c 程序,生成 Hex 文件,把 Hex 文件导到 Proteus 软件中进行仿真。

       心得体会:

       实验数码管显示程序的编程方法

       1)先准备好要显示的数据,放入相应的显示存储单元中。

       2)根据要使用的数码管的具体位置来确定扫描初值和扫描方向。

       3)根据使用数码管的个数来确定扫描的位数。

       4)查表将要显示的数据转换为能使数码管正确显示相对应的段码。

       5)分时送段码和位码,数码管开始循环显示。

       指导教师评语:

       1、完成所有规定的实验内容,实验步骤正确,结果正确;

       2、完成绝大部分规定的实验内容,实验步骤正确,结果正确;

       3、完成大部分规定的实验内容,实验步骤正确,结果正确;

       评定等级:A(优秀)B(良好)C(中等)D(及格)E(不及格)

       成绩评定

       教师签字

       年 月 日 备注:

       注:1、报告内的项目或设置,可根据实际情况加以补充和调整

       2、教师批改学生实验报告应在学生提交实验报告 10 日内

第四篇:实验五___七段数码管动态显示实验_xs

       实验五 七段数码管动态显示实验

       一、实验目的

       掌握数码管动态显示数字的原理

       二、实验内容

       动态显示:按图5-2连接好电路,七段数码管段码连接不变,位码驱动输入端S1,S0接8255 C口的PC1,PC0。编程在十位和个位两个数码管上显示“56”。

       三、编程提示

       实验台上的七段数码管为共阴型,段码采用同相驱动,输入端加高电平,选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。

       . 看清实验目的和要求 2. 注意实验步骤

       3. 连接实验线路时请注意开关的位置

       4. 根据原理框图编写程序,保存为学号名 SY2 例:1928101sy5 5. 记录下实验中遇到的问题,实验的实际意义

       6. 准备实验报告的数据

       如何解决的,搞懂

       实验六 竞赛抢答器

       一、实验目的

       1、了解微机化竞赛抢答器的基本原理。

       2、进一步学习使用并行接口。

       二、实验内容

       图7-1为竞赛抢答器(模拟)的原理图,逻辑开关K0~K7代表竞赛抢答按钮0~7号,当某个逻辑电平开关置“1”时,相当某组抢答按钮按下。在七段数码管上将其组号(0~7)显示出来,并使微机扬声器响一下。

       三、编程提示

       设置8255为C口输入、A口输出,读取C口数据,若为0表示无人抢答,若不为0则有人抢答。根据读取数据可判断其组号。从键盘上按空格键开始下一轮抢答,按其它键程序退出。

       附加试验: 可编程定时器/计数器(8253)

       一、实验目的: 掌握8253的基本工作原理和编程方法。

       二、实验内容

       按图3-2连接电路,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率1HZ)。用示波器观察OUT0,OUT1输出电平的变化和波形。同时用七段数码管段码显示出来

       三、编程提示 8253控制寄存器地址283H 计数器0地址280H 计数器1地址281H CLK0连接时钟 1MHZ

       请各位同学在上机实验前编好程序,要检查!

       实验时间

       周四

       计科83班:8:00-9:30 网工 82:9:40-11:10 网工 81:12:30-14:00 计科81班:14:00-15:30 计科82班:15:30-17:00 实验地点:教学楼B610 1.到5楼计算中心值班室请值班老师开门 2.这周日上午为自由实验时间,愿意去的同学请先向各班长或课代表报名

第五篇:虚拟实验在LED数码管多位动态显示教学中的应用

       虚拟实验在LED数码管多位动态显示教学中的应用

       简介简介:蒋宏伟(1967-),男,江苏省昆山第二中等专业学校高级教师,研究方向为计算机程序设计、单片机应用。1LED数码管多位动态显示教学难点

       LED数码管是单片机控制系统中最常见的显示设备之一,它具有亮度高、价格低、寿命长、对电流和电压要求低、与单片机连接方便等诸多优点。但是LED数码管又是占用单片机端口资源的“大户”。为了克服LED数码管这个致命的缺点,在实际应用时会想很多办法,数码管多位动态显示便是其中巧妙的方法之一。同时还可以运用各种I/O端口扩展的方法,让数码管多位动态显示以更加节省资源。但是正因为这个“动态”,给其原理的理解增加了许多难度,如果再和各种端口扩展结合在一起,就让学生更难以理解。多位数码管动态显示与各种端口扩展结合在一起,注定了硬件结构的千变万化。如果在教学中不注重让学生理解本质原理,而是针对某一固定的硬件背几段程序,这种教学极不利于学生今后的工作。因此,必须通过合理的教学设计,特别是运用信息技术手段突破教学难点,让学生真正地掌握基本原理,并适应工作中的各种变化。

       2虚拟实验对传统实验的突破

       2.1实验在单片机教学中的地位

       “单片机原理及应用”是一门理论性和实践性都很强的课程。戴尔的“经验之塔”理论指出,最底层的经验即做的经验是最直接最具体的经验,越往上升越抽象。教育应从具体经验入手,逐步过渡到抽象经验,有效的教学方法,应首先给学生丰富的具体经验。单片机课程实验可以让学生获得丰富的直接体验,是学习单片机课程的重要内容。

       2.2单片机课程传统实验教学方式的弊端

       实际教学中,传统的实验方法存在许多问题。首先,因实验设备数量有限,教学中只能分组进行实验,组内成员间相互依赖性较强,不利于培养全体学生的动手能力、创新能力和综合运用知识的能力;其次,实验只能在实验室中进行;往往是以教师为中心,学生在规定的时间内,用统一的模式,按照指导书上规定的步骤做相同的验证式实验,而在课前预习和课后作业阶段一般也只能“纸上谈兵”,这不利于激发学生的学习兴趣和主观能动性;最重要的是传统的实验箱硬件结构固定,使得教师很难根据教学要求由浅入深地灵活重组和设计实验,对于硬件上的新变化、新技术,更难以应对;另外,硬件的损耗、故障等,都会影响实验的效果,这不利于教学的组织,对学生理解原理和学习知识造成了干扰。

       2.3运用虚拟实验能够突破传统实验的束缚

       虚拟实验是现代信息技术发展的产物,虚拟实验室的开发与应用将对实验教学产生革命性影响。

       奥苏伯尔的“认知结构迁移”理论提出了影响迁移的认识结构的3个主要变量,即可利用性、可辨别性和稳定性。可利用性是指在面对新知识的学习时,学习者原有认知结构中是否具有用来同化新知识的适当观念;可辨别性是指面对新知识的学习时,学习者能否清晰分辨新旧知识间的异同;稳定性是指面对新知识的学习时,用来同化新知识的原有知识是否已被牢固掌握。学生在某一领域的认知结构越具有可利用性、可辨别性和稳定性,就越容易导致正迁移。虚拟现实技术及相关技术的发展水平已使其可以胜任对真实实验室的模拟。虚拟实验系统的虚拟性、实践性、灵活性,使其在建立概念、弄清原理、培养解决问题的方法和能力方面具备了实际实验所不具备的某些特殊优势。通过虚拟实验室反复实验所获得的体验,可以顺利地迁移到真实设备上。

       Proteus是世界上著名的EDA工具,它实现了从原理图、代码调试到单片机与外围电路协同仿真,是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台。运用Proteus 构建虚拟实验室,实现了拥有一台PC机就拥有一间实验室的梦想。它可以将复杂的教学问题进行分解,可以将不便观察的现象仿真演示,可以将实验从实验室扩展到学生课前预习和家庭作业中,充分发挥了信息化教学的作用。

       3虚拟实验在LED数码管多位动态显示教学中应用的难点LED数码管多位动态显示原理和相应的端口扩展方法,是学生较难掌握的知识难点。在教学过程中,如果能恰当地利用虚拟实验易于观察、变化灵活的特点,对教学知识点进行合理分解,每个知识点均配以相应的实验,在所有知识难点都得以突破后,再进行综合运用和真实实验,则会取得很好的教学效果。

       3.1运用虚拟实验认识“位选”概念

       数码管多位动态显示的硬件连接特点是将各个数码管字型码端口连接在一起,理论上从单片机中送出的字型码会被所有数码管接收。在这种情况下如何让每只数码管分别显示不同的字型,是学生难于理解的第一个问题,为此设计如图1所示的实验。通过程序送出字型码的同时,用开关手动控制每只数码管公共端的高低电平,让学生清楚地看到字型码有选择地送达不同数码管的过程,从而弄清很重要的“位选”概念。

       图1用虚拟实验中认识“位选”

       3.2运用虚拟实验感受“动态”的原理

       在了解了“位选”的概念后学生又会有另一个疑惑:为什么数码管明明是轮流显示的,可看上去却同时显示?这时再通过另一个虚拟实验(见图2),用程序去控制公共端电平的切换,并逐渐加快电平切换的速度,学生最终会看到一个奇迹,尽管数码管是轮流显示的,但最终看上去却同时稳定地显示了。在观察到上述现象后,再向学生揭示人眼的“视觉暂留”现象,从而帮助理解这个“动态”的概念,为进一步学习控制程序打下基础。

       图2用虚拟实验感受“动态”

       图3用虚拟实验体验端口扩展

       图4用虚拟实验培养综合运用能力

       3.3运用虚拟实验体验端口扩展方法

       通过前面的学习,学生已掌握了数码管多位动态显示的基本原理与编程方法。在上述硬件连接中,为了实现8位数码管的显示,共占用了两组完整的端口。