计数器及数码显示综合设计..
- 格式:doc
- 大小:179.00 KB
- 文档页数:17
一、题目用定时0的方式1实现数码管两位59S循环计时(计时器)二、思路方案本实验利用单片机的定时器/计数器定时和计数的原理,通过proteus 仿真软件来实现模拟实现。
模拟利用A T89C51单片机、LED数码管实现秒表的计时。
其中一个两位数码管用来显示数据,一位用来显示个位秒,另一位用来显示十位秒。
当计数超过范围时所有数码管全部清零重新计数。
三、实验设计原理图四、程序流程图五、程序代码如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar num,count,ge,shi;void delay(uint);void display(uchar,uchar);uchar SEG[]={0xc0,0xf9,0xa4,0xb0,0x99, //显示数码管0-9数字0x92,0x83,0xf8,0x80,0x98};void main(){TMOD=0x01; //设置定时器工作方式T0的工作方式为1TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872TL0=(65536-45872)%256;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0while(1) //程序在这里不停的对数码管动态扫描同时等待中断发生{display(shi,ge);}}/*以下是设计中断服务程序的时间和显示*/void T0_time()interrupt 1{TH0=(65536-45872)/256; //重装初值TL0=(65536-45872)%256;if(++num= =20) //如果到了20次,说明1秒时间到{num=0; //然后把num清0重新再记20次if(++count==60) //这个数用来送数码管显示,到60后归0count=0;shi=count/10; //把一个2位数分离后分别送数码管显示,十位和个位ge=count%10;}}/*以下为延迟函数*/void delay(uint xms){uint i,j;for(i=xms;i>0;i--) //延迟时间为xms乘以50msfor(j=110;j>0;j--);}/*以下为显示数码管的子函数*/void display(uchar shi,uchar ge){P3=0xfe; //打开P3.0,及打开数码管1引脚P2=SEG[ge];delay(20);P3=0xfd; //打开P3.1,及打开数码管2引脚P2=SEG[shi];delay(20);}六实验过程遇到的问题总结1.由于重新接触单片机,软硬件较生疏,刚看题目没思路,只能网上查资料看,再理解,相当的费力。
一个8421码十进制计数器(异步置数)及七段数码管显示系统一个8421码十进制计数器(异步置数)及七段数码管显示系统LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY counter10 ISPORT( clk: IN STD_LOGIC;load: IN STD_LOGIC;din: IN STD_LOGIC_VECTOR(3 DOWNTO 0);qout: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);c: OUT STD_LOGIC);END counter10;ARCHITECTURE art2 OF counter10 ISSIGNAL temp: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(clk,load,din)BEGINIF(load='0') THENtemp<=din;ELSIF(clk'EVENT AND clk='1') THENIF(temp="1001") THENtemp<="0000";ELSEtemp<=temp+1;END IF;END IF;END PROCESS;qout<=temp;c<='1' WHEN temp="1001" ELSE'0';END art2;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY bcd ISPORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0); Y:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) );END bcd;ARCHITECTURE art1 OF bcd ISBEGINY<="1111110" WHEN A="0000" ELSE "0110000" WHEN A="0001" ELSE "1101101" WHEN A="0010" ELSE "1111001" WHEN A="0011" ELSE "0110011" WHEN A="0100" ELSE "1011011" WHEN A="0101" ELSE "0011111" WHEN A="0110" ELSE "1110000" WHEN A="0111" ELSE "1111111" WHEN A="1000" ELSE "1110011" WHEN A="1001" ELSE "0000000";END art1;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY counter10_bcd ISPORT(clkin,clrin: IN STD_LOGIC;yout: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);d: IN STD_LOGIC_VECTOR(3 DOWNTO 0));END counter10_bcd;ARCHITECTURE art3 OF counter10_bcd IS COMPONENT counter10PORT( clk: IN STD_LOGIC;load: IN STD_LOGIC;din: IN STD_LOGIC_VECTOR(3 DOWNTO 0);qout: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);c: OUT STD_LOGIC);END COMPONENT;COMPONENT bcdPORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);Y:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END COMPONENT;SIGNAL q: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL c1: STD_LOGIC;BEGINu1:counter10 PORTMAP(clk=>clkin,load=>clrin,din=>d,qout=>q,c=>c1);u2:bcd PORT MAP(A=>q,Y=>yout);END art3;。
计数译码显示电路实验报告实验目的:掌握编码与解码的基本原理和技术。
设计与实现一个计数译码显示电路。
提高电子电路设计与实验能力。
实验原理:计数译码显示电路是利用数字集成电路实现的一种数字计数显示方法。
它通过计数器将输入的时钟信号转化为二进制数码输出,然后通过译码器将二进制数码转为七段数码管的控制信号,从而使得七段数码管实现相应的数字显示。
实验器材:1.CD4017计数器芯片2.CD4511译码器芯片3.七段共阳数码管4.电阻、电容、电源、开关等实验步骤:1. 将CD4017计数器芯片的1脚连接到电源Vcc,16脚连接到地GND。
2.连接计数器的时钟输入脚13和复位输入脚15到电路中适当位置,并设置相应的电源和开关。
3. 将译码器CD4511的Vcc脚和GND脚连接到电源和地,将A、B、C、D四个输入脚连接到计数器的Q0-Q3输出脚。
4.将译码器的a、b、c、d、e、f、g七个输出脚连接到七段数码管的a、b、c、d、e、f、g控制脚。
5. 连接七段数码管的共阳脚到电源Vcc。
实验结果:通过调整计数器CD4017的时钟频率、复位电平和输入信号,我们可以观察到七段数码管显示出不同的数字,从0到9循环显示。
实验分析:计数译码显示电路利用计数器进行计数和译码器进行解码,通过将二进制数码转换为七段数码管的控制信号,实现了数字的显示。
实验中需要注意选择适当的电阻、电容等元器件,以确保电路的稳定工作。
另外,对于七段数码管的显示,还可以通过连接额外的译码器和复用技术进行更复杂的显示设计。
实验总结:通过本实验,我们掌握了计数译码显示电路的基本原理与设计方法,提高了对数字集成电路的理解和应用能力。
实验结果令人满意,并加深了对数字电路的认识。
在今后的学习和实践中,我们将继续加强对电子电路设计与实验的掌握,提高自己的技术水平。
计数器的设计
计数器是一种电子数字电路,用于记录某个事件或进程的次数。
设计计数器的步骤如下:
1.确定计数器的位数:计数器的位数决定了它能够计数的最大值。
例如,一个
8位二进制计数器可以计数0到255之间的所有整数。
根据实际需求,选择适当的位数。
2.设计计数器的时钟输入电路:计数器的时钟输入决定了它何时进行计数。
通
常使用晶体振荡器或者其他时钟源来提供计数器的时钟信号。
3.选择计数器的计数模式:计数器可以分为同步计数器和异步计数器。
同步计
数器的各个位同时进行计数,而异步计数器的各个位独立进行计数。
根据具体需求选择合适的计数模式。
4.选择计数器的计数方式:计数器可以被设计为向上计数或向下计数。
向上计
数表示计数器的值递增,而向下计数表示计数器的值递减。
根据具体需求选择合适的计数方式。
5.设计计数器的清零电路:计数器需要在一些特定的时刻进行清零操作,以便
重新开始计数。
为此,需要设计清零电路,使计数器的值归零。
6.设计计数器的输出电路:计数器的输出电路将其计数器的值转换成数字形式
或者其他需要的形式,例如LED显示屏、七段数码管等。
7.选取适当的计数器芯片:根据具体需求选择合适的计数器芯片,例如74LS161、
74LS163等,这些芯片可以快速地实现基于上述设计步骤的计数器电路。
需要注意的是,在设计计数器时,应当根据实际情况进行仿真测试,确保其正常工作并满足设计要求。
二位计数显示课程设计一、课程目标知识目标:1. 理解二进制计数的基本原理,掌握二位二进制数的组成和表示方法。
2. 学会二位计数显示的电子电路构成,理解LED数码管的工作原理。
3. 掌握二位计数显示的编程方法,能够运用所学知识设计和实现简单的计数器功能。
技能目标:1. 能够运用所学知识,动手搭建并测试简单的二位计数显示电路。
2. 培养学生逻辑思维和问题解决能力,通过编程实现对二位计数显示的控制。
3. 提高学生的团队协作和沟通能力,通过小组合作完成项目任务。
情感态度价值观目标:1. 培养学生对电子信息技术领域的兴趣,激发学生的创新意识和探索精神。
2. 培养学生严谨、认真的学习态度,养成科学、规范的操作习惯。
3. 引导学生关注科技发展,认识到计数显示技术在实际应用中的重要性,培养学生的社会责任感。
本课程针对中学生设计,充分考虑学生的认知水平和动手能力。
课程性质为实践性较强的信息技术课程,旨在通过理论与实践相结合的教学方式,让学生在实际操作中掌握二位计数显示的相关知识。
课程目标具体、可衡量,以便教师对学生的学习成果进行有效评估,并根据实际情况调整教学策略。
二、教学内容1. 二进制计数原理:讲解二进制的基本概念,计数原则及其与十进制的转换方法。
- 教材章节:第二章《数字逻辑基础》2. 二位计数显示电路:介绍LED数码管的构造、工作原理及驱动方式。
- 教材章节:第三章《数字电路及其应用》3. 二位计数显示编程:学习使用Arduino或Micro:bit等编程平台,编写控制二位计数显示的程序。
- 教材章节:第四章《简易数字电路设计与编程》4. 实践操作:分组进行二位计数显示电路搭建和编程,实现0-99的循环计数功能。
- 教材章节:第五章《数字电路实践》5. 知识拓展:探讨二位计数显示在现实生活中的应用实例,如电子时钟、计数器等。
教学内容安排和进度:第一课时:二进制计数原理及其与十进制的转换方法。
第二课时:LED数码管的构造、工作原理及驱动方式。
两位数码管显示设计摘要:本设计旨在设计一套能够在两位数码管上显示不同数字的电路。
通过使用逻辑门、计数器和驱动器等组合电路,以及基本的数字逻辑知识,通过编写Verilog代码实现数字的显示和计数。
关键词:两位数码管、逻辑门、计数器、驱动器、Verilog代码一、引言数码管(Digital Display)是一种用于显示数字和字母的设备,它将输入的信号转换为相应的数字或字符,并在屏幕上显示出来。
本设计中,我们使用两位数码管,通过设计适当的电路和使用相应的逻辑门、计数器和驱动器等组合电路,以及编写Verilog代码,实现数字的显示和计数。
二、设计思路1.利用计数器设计模块来实现数字的计数功能。
通过适当的控制信号,将从0计数到9,并在10时重新计数。
计数器的输出作为数码管的输入。
2.设计一个驱动器模块,将计数器模块的输出转换为适合于数码管显示的控制信号。
通过逻辑门的组合,将每个数码管的数码按照不同的段(段是数码管上的一个小灯,用于显示数字的每个部分)进行控制。
3. 编写Verilog代码,将计数器模块和驱动器模块进行组合。
通过适当的端口和输入/输出信号,将两个模块连接在一起,实现数字的显示和计数。
三、设计实现1.计数器模块设计module counterinput clk, // 时钟信号output reg[3:0] count // 计数器的输出beginif (count == 4'b1001) // 9时重新计数count <= 4'b0000;elsecount <= count + 1; // 计数器自增endendmodule2.驱动器模块设计module decoderinput reg[3:0] count, // 指示要显示的数字output reg a, b, c, d, e, f, g // 段待显示数字begincase(count)4'b0000 : begin a = 1; b = 1; c = 1; d = 1; e = 1; f = 1; g = 0; end // 数字04'b0001 : begin a = 0; b = 1; c = 1; d = 0; e = 0; f = 0; g = 0; end // 数字14'b0010 : begin a = 1; b = 1; c = 0; d = 1; e = 1; f = 0; g = 1; end // 数字24'b0011 : begin a = 1; b = 1; c = 1; d = 1; e = 0; f = 0; g = 1; end // 数字34'b0100 : begin a = 0; b = 1; c = 1; d = 0; e = 0; f = 1; g = 1; end // 数字44'b0101 : begin a = 1; b = 0; c = 1; d = 1; e = 0; f = 1; g = 1; end // 数字54'b0110 : begin a = 1; b = 0; c = 1; d = 1; e = 1; f = 1; g = 1; end // 数字64'b0111 : begin a = 1; b = 1; c = 1; d = 0; e = 0; f = 0; g = 0; end // 数字74'b1000 : begin a = 1; b = 1; c = 1; d = 1; e = 1; f = 1; g = 1; end // 数字84'b1001 : begin a = 1; b = 1; c = 1; d = 1; e = 0; f = 1; g = 1; end // 数字9default : begin a = 0; b = 0; c = 0; d = 0; e = 0; f = 0; g = 0; end // 默认显示为空白endcaseendendmodule3.组合计数器和驱动器模块module displayinput clk, // 时钟信号output reg[3:0] count, // 计数器模块的输出output reg a, b, c, d, e, f, g // 驱动器模块的输出counter counter_inst(.clk(clk), .count(count)); // 实例化计数器模块decoderdecoder_inst(.count(count), .a(a), .b(b), .c(c), .d(d), .e(e), . f(f), .g(g)); // 实例化驱动器模块endmodule四、实验结果与分析通过连接计数器和驱动器模块,使用相同的时钟信号,即可实现数字计数和显示的功能。
北华航天工业学院《EDA技术综合设计》课程设计报告报告题目:计数器及数码显示综合设计作者所在系部:电子工程系作者所在专业:自动化专业作者所在班级:B11222作者姓名:指导教师姓名:崔瑞雪完成时间:内容摘要在quatrusII 中利用VHDL语言编写数码管显示程序,然后进行功能仿真,然后进行锁定引脚,然后硬件进行下载,调试。
关键词: VHDL,数码管显示,quatrusII,时序仿真图。
目录内容摘要 (I)目录................................................................................................................................................................... I I 课程设计任务书. (III)一、实验目的 (1)二、硬件要求 (1)三、方案论证 (1)四、模块说明 (2)1.计数器(counter60) (2)2.计数器(counter16) (3)3.计数器(counter12) (4)4.计数器(counter10) (5)6.译码器(deled) (7)7.分频器(div) (8)8.顶层文件 (9)五、图7计数显示的整体连接图 (11)六、实验步骤 (11)七、实验结果 (12)八、总结 (12)九、参考文献 (12)课程设计任务书一、实验目的1.熟悉QUARATEⅡ工具软件2.熟悉VHDL语言设计3.学习EDA课程的综合设计4.学习计数器的VHDL语言设计5.了解器件编程和下载及硬件接口连接.二、硬件要求1.主芯片EPF10K10LC84-4。
2.7个八段扫描共阴极数码显示管。
3.三个按键开关(使能端,清零端,可逆端)。
三、方案论证本次设计中将任务分成几个部来完成分别是:分频部分、十进制计数器、十二进制计数器、十六进制可逆计数器、六十进制计数器、译码部分、时间扫描模块和顶层文件。
分频部分:在这个部分里,接受20mhz的频率,然后分出1hz的计数频率和100hz 的扫描频率。
十进制计数器、十二进制计数器、六十进制计数器:在这个部分中要实现带使能输入、同步清0的增1十进制、十二进制、六十进制的计数器计数功能。
使能端en 高电平有效计数器开始计数,高电平停止计数,清零端CLR高电平清零低电平正常计数。
十六进制可逆计数器:在这个部分中要实现带使能输入、同步清0的增1十六进制的可逆计数器计数功能。
计数部分分为计数的个位和十位,使能端en高电平有效计数器开始计数,低电平停止计数,清零端rst高电平清零低电平计数,可逆计数器的控制端plus_sub低电平实现加法计数器的功能,高电平实现减法计数器的功能。
分时扫描及译码部分:在这个部分需设计一个共阴7段数码管控制接口,在时钟信号的控制下,分时选择数码管显示相应计数器的计数脉冲,使7位数码管动态刷新显示4个计数器的计数结果,并将送来的计数器的计算值转换为相应的段码在数码管上显示计数脉冲的个数。
顶层文件:在这一部分确定上述几个部分中相应输入输出端口的连接关系。
四、模块说明计数器及数码显示的设计共化分为3个模块:计数器,扫描电路(seltime),译码电路(deled)。
下面具体分析各个模块的原理、内容和功能。
1.计数器(counter60)能够实现60进制循环计数,带有清零端clr ,受时钟上升沿信号控制,其文本语言(文件名:count60er.vhd)为底层文本,图1为计数器的仿真波形图。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity counter60 isport(en,clr,clk:in std_logic;ql,qh:buffer std_logic_vector(3 downto 0));end counter60;architecture behave of counter60 isbeginprocess(en,clr,clk)beginif(en='1')thenif(clk'event and clk='1')thenif(clr='1')thenql<=(others=>'0');qh<=(others=>'0');elsif(ql=9)thenif(qh=5)thenqh<="0000";ql<="0000";elseqh<=qh+1;ql<="0000";end if;elseql<=ql+1;end if;end if;end if;end process;end behave;图1. 六十进制秒计数器的仿真波形2.计数器(counter16)能够实现16进制可逆循环计数,带有清零端clr ,受时钟上升沿信号控制,其文本语言(文件名:count16er.vhd)为底层文本,图2为计数器的仿真波形图。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity counter16 isport(en,clr,clk:in std_logic;plus_sub:in std_logic;ql,qh:buffer std_logic_vector(3 downto 0));end counter16;architecture behave of counter16 isbeginprocess(en,clr,clk,plus_sub)beginif(en='1')thenif(clk'event and clk='1')thenif(clr='1')thenql<=(others=>'0');qh<=(others=>'0');elsif(plus_sub='1')thenif(qh=1 and ql=5)thenql<="0000";qh<="0000";elsif(ql=9)thenqh<="0001";ql<="0000";elseql<=ql+1;end if;elsif(plus_sub='0')thenif(qh=0 and ql=0)thenql<="0101";qh<="0001";elsif(ql=0)thenql<="1001";qh<="0000";elseql<=ql-1;end if;end if;end if;end if;end process;endbehave;图2. 十六进制分计数器的仿真波形3.计数器(counter12)能够实现12进制循环计数,带有清零端clr ,受时钟上升沿信号控制,其文本语言(文件名:count12er.vhd)为底层文本,图3为计数器的仿真波形图。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity counter12 isport(en,clr,clk:in std_logic;ql,qh:buffer std_logic_vector(3 downto 0));end counter12;architecture behave of counter12 isbeginprocess(en,clr,clk)beginif(en='1')thenif(clk'event and clk='1')thenif(clr='1')thenqh<=(others=>'0');elsif(qh=1 and ql=1)thenql<="0000";qh<="0000";elsif(ql=9)thenqh<="0001";ql<="0000";elseql<=ql+1;end if;end if;end if;end process;end behave;图3. 十二进制分计数器的仿真波形4.计数器(counter10)能够实现10进制循环计数,带有清零端clr ,受时钟上升沿信号控制,其文本语言(文件名:count10er.vhd)为底层文本,图4为计数器的仿真波形图。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity counter10 isport(en,clr,clk:in std_logic;q:buffer std_logic_vector(3 downto 0));end counter10;architecture behave of counter10 isbeginprocess(clr,clk,en)beginif(en='1') thenif(clk'event and clk='1')thenif(clr='1')thenelsif(q=9)thenq<="0000";elseq<=q+1;end if;end if;end if;end process;end behave;图4. 十进制分计数器的仿真波形5.扫面器(seltime)此模块能够实现分别对前边的数值进行扫描,有清零段,复位段,以及上升沿有效,其文本语言(文件名:seltime.vhd)为底层文本,图5为计数器的仿真波形图。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity seltime isport(clk1,ret:in std_logic;q10,q12l,q12h,q16l,q16h,q60l,q60h:in std_logic_vector(3 downto 0);q:out std_logic_vector(3 downto 0);sel:out std_logic_vector( 2 downto 0));end seltime;architecture behave of seltime issignal count:std_logic_vector(2 downto 0);beginsel<=count;process(clk1,ret)beginif(ret='1')thencount<="001";elsif(clk1'event and clk1='1')thenif(count=7)thencount<="001";elsecount<=count+1;end if;end if;case count iswhen"001"=>q<=q16h;when"010"=>q<=q16l;when"011"=>q<=q60h;when"100"=>q<=q60l;when"101"=>q<=q12h;when"110"=>q<=q12l;when"111"=>q<=q10;when others=>null;end case;end process;end behave;图5. 扫描器的仿真波形6.译码器(deled)此模块能够实现分别对前边的数值进行扫描,有清零段,复位段,以及上升沿有效,其文本语言(文件名:deled.vhd)为底层文本,图6为计数器的仿真波形图。