设计数码管电子表
- 格式:doc
- 大小:278.86 KB
- 文档页数:34
电子科技大学UNIVERSITY OF ELECTRONIC SCIENCE AND TECHNOLOGY OF CHINA数字逻辑设计实验报告实验题目:电子秒表学生姓名:指导老师:一、实验内容利用FPGA设计一个电子秒表,计时范围00.00 ~ 99.00秒,最多连续记录3个成绩,由两键控制。
二、实验要求1、实现计时功能:域值范围为00.00 ~ 99.00秒,分辨率0.01秒,在数码管上显示。
2、两键控制与三次记录:1键实现“开始”、“记录”等功能,2键实现“显示”、“重置”等功能。
系统上电复位后,按下1键“开始”后,开始计时,记录的时间一直显示在数码管上;按下1键“记录第一次”,次按1键“记录第二次”,再按1键“记录第三次”,分别记录三次时间。
其后按下2键“显示第一次”,次按2键“显示第二次”,再按2键“显示第三次”,数码管上分别显示此前三次记录的时间;显示完成后,按2键“重置”,所有数据清零,此时再按1键“开始”重复上述计时功能。
三、设计思路1、整体设计思路先对按键进行去抖操作,以正确的得到按键信息。
同时将按键信息对应到状态机中,状态机中的状态有:理想状态、开始状态、3次记录、3次显示、以及其之间的7次等待状态。
因为需要用数码管显示,故显示的过程中需要对数码管进行片选和段选,因此要用到4输入的多路选择器。
在去抖、计时、显示的过程中,都需要用到分频,从而得到理想频率的时钟信号。
2、分频设计该实验中有3个地方需要用到分频操作,即去抖分频(需得到200HZ时钟)、计时分频(需得到100HZ时钟)和显示分频(需得到25kHZ时钟)。
分频的具体实现很简单,需首先算出系统时钟(50MHZ)和所需始终的频率比T,并定义一个计数变量count,当系统时钟的上升沿每来到一次,count就加1,当count=T时就将其置回1。
这样只要令count=1~T/2时clk=‘0’,count=T/2+1~T时clk=‘1’即可。
1 设计目的1、培养理论联系实际的正确设计思想,训练综合运用已经学过的理论和生产实际知识去分析和解决工程实际问题的能力。
2、学习较复杂的电子系统设计的一般方法,提高基于模拟、数字电路等知识解决电子信息方面常见实际问题的能力,由学生自行设计、自行制作和自行调试。
3、进行基本技能训练,如基本仪器仪表的使用,常用元器件的识别、测量、熟练运用的能力,掌握设计资料、手册、标准和规范以及使用仿真软件、实验设备进行调试和数据处理等。
4、培养学生的创新能力。
2 设计要求1.秒表由2位七段LED显示器显示,其中1位显示“s”,二位显示“0.1s”,显示分辩率为0.1 s;2.计时最大值为9.9s;3.计时误差不得超过1s;具有清零、启动计时、暂停计时及继续计时等控制功能;4.主要单元电路和元器件参数计算、选择;5.画出总体电路图;6.安装自己设计的电路,按照自己设计的电路,在通用板上焊接。
焊接完毕后,应对照电路图仔细检查,看是否有错接、漏接、虚焊的现象。
7.调试电路8.电路性能指标测试9.提交格式上符合要求,内容完整的设计报告3总体设计3.1 工作流程图图 1 工作流程图图1中1单元为用集成与非门74LS00构成的基本RS 触发器。
属低电平直接触发的触发器,有直接置位,复位的功能。
图1中2单元为集成与非门74LS00构成的单稳态触发器,它的职能是为计数器提供清零信号。
图1中555定时器构成了多谐振荡器,是一种性能较好的时钟源。
图1中4单元74LS160构成的计数器/分频器图1中5单元译码显示单元3.2 原理图:图1为电子秒表的原理图,按功能可分为5个单元电路进行分析。
其中单元1为基本RS 触发器; 单元2为单稳态触发器; 单元3为时钟发生器; 单元4为计数器和分频器; 单元5为译码显示单元。
基本RS 触发器单稳态触发器译码显示器555定时器计数/分频器图2 原理电路图本电路中使用两个基本RS触发器提供置位、复位、和清零信号,555定时器提供时钟脉冲信号,三块74LS160作为译码/分频单元,有效、简洁地完成了秒表所具备的所有功能(清零、启动计时、暂停计时及继续计时)。
74ls147引脚图管脚图和功能真值表优先编码器是当多个输入端同时有信号时,电路只对其中优先级别最高的输入信号进行编码。
常用的集成优先编码器IC有10线-4线、8线-3线两种。
10线-4线优先编码器常见的型号为54/74147、54/74LS147,8线-3线优先编码器常见的型号为54/74148、54/74LS148。
下面我们以TTL中规模集成电路74LS147为例介绍8421→BCD码优先编码器的功能。
10线-4线8421 BCD码优先编码器74LS147的真值表见表3.5。
74LS147的引脚图如图3.5所示,其中第9脚NC为空。
74LS147优先编码器有9个输入端和4个输出端。
某个输入端为0,代表输入某一个十进制数。
当9个输入端全为1时,代表输入的是十进制数0。
4个输出端反映输入十进制数的BCD 码编码输出。
74LS147优先编码器的输入端和输出端都是低电平有效,即当某一个输入端低电平0时,4个输出端就以低电平0的输出其对应的8421 BCD编码。
当9个输入全为1时,4个输入出也全为1,代表输入十进制数0的8421 BCD编码输出。
表3.5 74LS147的真值表数字电路CD4511的原理(引脚及功能)CD4511是一个用于驱动共阴极 LED (数码管)显示器的 BCD 码—七段码译码器,特点:具有BCD转换、消隐和锁存控制、七段译码及驱动功能的CMOS电路能提供较大的拉电流。
可直接驱动LED显示器。
CD4511 是一片 CMOS BCD—锁存/7 段译码/驱动器,引脚排列如图 2 所示。
其中a b c d 为 BCD 码输入,a为最低位。
LT为灯测试端,加高电平时,显示器正常显示,加低电平时,显示器一直显示数码“8”,各笔段都被点亮,以检查显示器是否有故障。
BI为消隐功能端,低电平时使所有笔段均消隐,正常显示时, B1端应加高电平。
另外 CD4511有拒绝伪码的特点,当输入数据越过十进制数9(1001)时,显示字形也自行消隐。
电子秒表概述此电子秒表,是在TND-MD教学系统上实现的,其计时精确度为0.01s。
所使用的芯片主要有8253定时计数器、8255A并行接口电路芯片、8259A中断控制器等。
通过系统中的开关键KK1和KK2可实现开始计时,暂停计时,继续计时,清零功能,用系统中的四片七段数码管将计得的时间以XXXX(秒百分秒,其中秒占两位,百分秒两位)的形式显示给用户。
计时准确度与现实时间相符。
一、设计要求按一下kk1开关启动,再按暂停,按kk2清零,周而复始。
最小计时单位0.01S,即可显示XXXX(秒百分之一秒)。
设计要求如下:(1)由键盘和8255作为输入部分(2)用七段数码管或液晶显示屏来显示时间(3)由8253和8259构成计时信号,通过中断完成启动计时、停止计时和动态刷新显示。
二、设计思想1、为了试验秒表的准确计时功能,此秒表精确到了0.01s,为了得到0.01s的时间脉冲,使用8253芯片来产生,又由于可以系统自动产生1.1932MHZ的时钟频率,因此可以通过设定计数初值为2E9c,并设定8253工作在方式3来获得所需的周期为10ms的时间脉冲软件操作:首先向8253的控制端口43H输入控制字B6H来设置计数器2计时,工作在方式3,循环计数,产生10ms的时间脉冲,然后再像计数器2端口42H输入计数初值2e9cH,先写入低八位数据,再写入高八位数据硬件操作:唐都仪器8253芯片的CLK接bus总线上的OPCLK系统时钟信号,频率为1.1932MHZ,GATE门信号接+5v电源,out引脚接8259芯片的IRQ72、为了驱动数码管,需使用8255芯片,通过设定控制字,用其PB端口来驱动段,PA 端口来驱动位,软件操作:向8255的控制端口63H输入控制字81H,使其三个端口都工作在方式0,PA(60H)端口的低四位用来驱动数码的位,PB端口(61H)用来驱动数码管的段,然后用E命令重新开辟一块内存区域,用来存放数码管0-9的字模3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH硬件操作:唐都仪器上的8255芯片的PA0~PA3引脚接数码管的X4~X1引脚,PB0~PB7引脚接数码管的0~DP引脚3、为了能够实现系统的中断调用,需使用8259芯片的IRQ2,IRQ6,IRQ7引脚,其中断向量分别为:0AH,0EH,0FH把三个中断服务程序的的入口地址分别填入这三个中断向量所指向的内存地址,IRQ2接KK1控制秒表的启动和暂停,IRQ6接KK2控制秒表的复位软件操作:IRQ2的中断向量乘以四得:0028H,然后向这个地址填入IRQ2服务程序的入口地址(mov [0028],IRQ2),然后向002a地址填入中断向量表的段地址:0000H,IRQ6的中断的首地址为:0038H,填入中断服务程序入口地址mov [0038],IRQ6,填入段地址mov [003a],0000H,IRQ7中断的首地址:003cH,填入中断服务程序入口地址:mov [003c],IRQ7,t 填入段地址:mov [003e],0000H..三、设计所用芯片及工作原理1、8255芯片工作原理接口电路在CPU和I/O设备之间起着信号的变换和传输的作用。
1 引言随着电子技术的发展,电子行业经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。
何况在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。
数字电压表(Digital Voltmeter )简称DVM ,它是采用数字化测量技术,把连续的模拟量(直流或交流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。
由于数字式仪器具有读数准确方便、精度高、误差小、灵敏度高和分辨率高、测量速度快等特点而倍受青睐。
本次我们所做的课程设计就是基于数字电子技术和模拟电子技术的一个电子产品。
我们对自己的设计作品从各个角度分析了由A/D 转换器组成的数字电压表的设计过程及各部分电路的组成及其原理,并且分析了数模转换进而使系统运行起来的原理及方法。
通过自身实践提高了动手能力,也只有亲历亲为才能收获掌握到已经学过的知识。
其实也为建立节约成本的意识有些帮助,我们并没有采用单片机模块,而是直接采用A/D 转换,在MC1433系列找块带显示译码并带A/D 转换的片子并不难,相对于单片机有成本上的优势,但这里同时也牵涉几个问题:精度、位数、速度、还有功耗等不足之处,这些都要慎重考虑。
这些也是在这次实践中收获的吧!2 设计任务分析2.1设计说明 本题要求设计一个213位的数字电压表,213位是指个位、十位、百位的范围为0~9,而千位只有0和1两个状态,称为半位。
所以213数字电压表测量范围为0001~1999。
数字电压表主要部分是A/D 转换器,显示方法通常采用动态扫描(工作时四个数码管轮流点亮,利用人眼的视觉残留特性能够得到整体效果,当扫描频率过低时显示的数码会有闪烁感)方式,采用这种方式较为省电,但需要字形译码驱动电路和字位驱动电路。
任务要求:(1)直流电压测量范围(0~200V)(2)测量速度每秒为2~5次,任选(3)分辨率0.1mv(4)测量误差小于0.1%2.2方案分析1.根据题目利用所学过的知识通过上网或到图书馆查阅资料,设计出3个实现数字万用表的方案。
一款简单的数字电感电容表设计制作本文介绍一款由555时基构成多谐振荡器构成的参数变换电路,反相器、晶振构成标准脉冲发生器,以及三个独立LED数码管组成的数显电路构成的简易数字电感电容表,经过测试电路数显直观、方便有效,精确度高,较好的解决了设计时因制作均衡电容、音箱分频电感产生误差导致音质受损的问题,值得电子发烧友们亲自动手操作一试。
一、数字电感电容表的工作原理数字电感电容表原理图1、参数变换电路:参数变换电路由555时基构成多谐振荡器,可把被测元件Lx/Cx转换成与元件参数成正比的脉宽。
然后把这具有特定脉宽的矩形作为门控信号,在脉宽时间内对一个已知周期的标准脉冲计数通过显示器就可以把脉宽(实际上是元件参数)显示出来。
测量电容时(这时波段开关在5、6、7位)是以Cx为定时元件的多谐振荡器,产生的矩形波经3脚输出,送到计数器的门控端,脉宽tw=CRcln2。
测量电感时(波段开关在1、2、3位),是以Lx为定时元件的多谐振荡器,刚接通电源时,V2(6)=Vcc,555的3脚输出低电平,7脚通地,电源经RL的Lx充电,随着充电的进行,V2(6),当达到V2(6)=1/3Vcc时,电路翻转,3脚输出高电平,7脚与地断开,因Lx电流不能突变,必将产生一个感生电动势使D1导通,Lx经D1、RL放电,V2(6),当达到V2(6)=2/3Vcc时,电路又翻转,5脚输出低电平,7脚又与地接通,Lx又开始充电,这样5脚输出占空比为1:1的方波,送到计数器的门控端。
这时脉宽为tw=Lx/RLln2。
2、标准脉冲发生器:该电路由反相器3、4和晶体构成,晶振频率为1MHz,标准脉冲周期为T=1s,以它作为计数器的计数脉冲。
3、计数、显示电路:显示器由三位LED数码管构成,计数器由MC14553三位动态扫描计数器为核心构成。
T=1s。
目录1 多功能电子表设计目的及意义2多功能电子表设计内容(1)总体设计方案简介(2)单元电路设计(3)总电路图(4)软件设计,编程思路,给出流程图,程序清单(附注释)(5)仿真结果3 结果分析4 设计总结5设计心得参考文献附录1.多功能电子表设计目的及意义1.1多功能电子表设计目的:目的:学生通过自己动手设计制作,将电子技术相关理论知识与制作实践相结合,提高学生的动手能力,加深对电子技术原理的理解,增加学习电子技术的兴趣,为今后投入电子技术的开发应用打好基础。
1.2多功能电子表设计意义:意义:2.多功能电子表的设计内容2.1总体设计方案简介1.功能简介及摘要多功能电子表是一种用数字显示秒﹑分﹑时的记时装置,与传统的机械钟相比,他具有走时准确﹑显示直观﹑无机械传动装置等优点,因而得到了广泛的应用:小到人们的日常生活中的电子手表,大到车站﹑码头﹑机场等公共场所的大型数显电子钟。
本课程设计要用通过简单的逻辑芯片实现数字电子钟。
要点在于用555芯片连接输出为一秒的多谐振荡器用于时钟的秒脉冲,用74LS160(10进制计数器)74LS00(与非门芯片)等连接成60和24进制的计数器,再通过七段数码管显示,构成了简单数字电子钟。
2.设计流程多功能电子表一般由振荡器、分频器、译码器、显示器等部分组成。
这些都是数字电路中应用最广泛的基本电路。
多功能电子表的基本计流程框图如下所示;图1 结构框图3.各部分功能说明1、振荡器振荡器是多功能电子表的核心,它的作用是产生一个频率标准,即时间标准信号,然后再由分频器分成秒脉冲,即“秒”时间脉冲。
因此正当其频率的精度与稳定度基本决定了多功能电子表的质量。
为了产生稳定的时间标准信号,一般采用石英晶体振荡器。
从多功能电子表的精度考虑,晶体振荡频率越高,秒针的时间精度越高。
但这会使振荡器的耗电量增大,分频器的级数也要增多,所以在确定频率时,应当天考虑这两方面因素,然后再选用石英晶体振荡器型。
DDSY606单相电子式预付费电能表(数码管)使用说明书2020E738-33符合标准:GB/T 17215.321-2021安装、使用产品前,请仔细阅读使用说明书并妥善保管、备用1概述DDSY606型单相电子式预付费电能表(数码管),采用专用大规模集成电路以及SMT技术,停电数据不丢失,应用计算机管理,通过IC卡购电,先购电后用电,一表一卡,专卡专用,是国内最新的民用电能计量产品之一。
本产品可用来计量额定电压220V、额定频率50Hz的交流单相有功电能,其性能符合GB/T 18460.3-2001《IC卡预付费售电系统第3部分:预付费电度表》和GB/T17215.321-2021《电测量设备(交流)特殊要求第21部分:静止式有功电能表(A级、B级、C级、D级和E级)》。
2主要功能2.1双向计量功能:能够精确计量正、反两个方向的有功功率。
且以每0.01kWh向一个方向累计一次电量,停电时,剩余电量和累计使用电量等数据不丢失。
2.2辨伪功能:当使用非指定介质时,电能表不会接受指令,拒绝操作。
2.3返写功能:当插入用户的购电卡后,电能表可将当前的剩余电量、使用电量及电能表的运行状态等信息返写入IC卡中,以供售电系统查询。
2.4受检功能:能接受售电管理系统制作的查询卡的检查,并能将当前剩余电量、使用电量及电能表的运行状态等信息返写到查询卡中,以便对电能表的运行状态进行检查。
2.5补遗功能:当用户购电卡丢失,可通过售电系统进行补卡售电,再插入电能表,此时电能表只接受新补的购电卡,拒绝原购电卡。
2.6初始化功能:用户第一次购电时,售电系统为用户建立唯一的档案并将有关信息传递到购电卡上,当用户将购电卡插入电能表时,电能表被初始化并与该购电卡建立一表一卡的关系。
2.7预付费功能:电能表具有先购电,后用电功能,当表内剩余电量不足时报警,剩余电量为零即断电。
2.8电能表具有三级报警功能:显示报警、声音报警(可选)和拉闸报警(可选),拉闸报警后,用户再插入购电卡,就可以继续用电。
电子科技大学微电子与固体电子学院实验报告实验名称现代电子技术综合实验姓名:詹朋璇学号:评分:教师签字电子科技大学教务处制电子科技大学实验报告学生姓名:詹朋璇学号:指导教师:熊万安实验地点: 211大楼308 实验时间:2014. 晚一、实验室名称:单片机技术综合实验室实验项目名称:数码管显示A/D转换的电压值&数码管显示秒表二、实验学时: 12三、实验目的与任务:1、熟悉系统设计与实现原理2、掌握KEIL C51的基本使用方法3、熟悉实验板的应用4、连接电路,编程调试,实现各部分的功能5、完成系统软件的编写与调试四、实验器材1、PC机一台2、实验板一块五、实验原理、步骤及内容试验要求:数码管的第1位显示任务号1,第3位到第5位显示、A/D转换的电压值,可调节电压,第7、8位显示两位学号;数码管第2位和第6位显示“-”号;按按键key1进行切换,此时数码管第1位显示任务号2,第7、8位显示循环倒计时的秒表,范围为08秒到01秒后,再过01秒,秒表又显示为08秒;(单片机系统中利用定时器/计数器计数秒表的值:利用定时器T0延时1秒进行计数。
),其它位显示不变,按按键key2时,秒表停止计数,再按按键key2时,秒表继续计数,按key1键,又回到任务1的显示状态。
当电压值大于2伏时,按按键不起作用。
1、硬件设计(可打印)2、各部分硬件原理(可打印)数码管动态扫描TLS549ADC工作时序图3、软件设计按下出中断服务程序。
答:将KEY1与KEY2键通过跳线分别接到INT0与INT1接口上。
开启中断:SysInit(){ …EA=0; 用单片机开发板上丰富的资源可以实现一个有一定功能的系统。
2.懂得利用中断可以使单片机的效率提高。
六、对本实验过程及方法、手段的改进建议实在是没有,都挺好的。
七、附录1、程序/*利用TLC549 A/D转换器实现电压测量与显示*/#include <> //包含8051的SFR寄存器定义头文件#include <> //扩展并行接口所需的绝对地址访问库函数#define LED_dig XBYTE[0x9000] //8位数码管显示器的位选输出控制#define LED_seg XBYTE[0x8000] //8位数码管显示器的段码(字形码)输出控制#define KEY_IN XBYTE[0x8000]//定义TLC549操作接口sbit ADC_CS = P1^7;sbit ADC_DATA = P1^6;sbit ADC_CLK = P1^5;code unsigned char disp_seg[]= //显示段码{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5f,0x79,0x71,0x40,0x00,0xff};// 0 1 2 3 4 5 6 7 8 9 a b c d e f - blank,全亮unsigned char DispBuf[8]; //定义显示缓冲区(由定时中断程序自动扫描)unsigned char key_value,flag;//定义键盘返回值,任务标志unsigned char y1000,y100,y10,y;//定义秒表的个位,十分位,百分位,千分位unsigned short mbiao;//定义秒表计数单元void delay(int ms); //延时大约1msunsigned char ReadAdc(void);//读取A/D转换结果void AdcInit(void); //初始化ADC接口void key_scan(void);void main(){unsigned char i=0;unsigned char volt, x100, x10, x;TMOD &= 0x0f;TMOD |= 0x10;TH1 = 0xFC;TL1 = 0x66;TR1 = 1;ET1 = 1;TMOD &= 0xf0;TMOD |= 0x01;TH0 = 0xFC;TL0 = 0x66;TR0 = 1;ET0 = 1;EA =1;AdcInit();for(i=0; i<8; i++)DispBuf[i] = 17; //全部8位显示灭 y1000=9;y100=9;y10=9;y=9;mbiao=9999;flag=0;while(1){while(flag ==0){volt = ReadAdc(); //得到A/D转换结果的数字量(0x00~0xff)volt = volt * 250/256; //转换成电压值,其中Vr=x100 = volt/100;x10 = (volt - x100*100)/10;x = (volt - x100*100)%10;DispBuf[0] = 4;DispBuf[1] = 2;DispBuf[2] = 16;DispBuf[3] = x;DispBuf[4] = x10;DispBuf[5] = x100;DispBuf[6] = 16;DispBuf[7] = 1;delay(100);if(key_value == 8&&volt<=200){flag = 1;mbiao=9000;while(key_value == 8);}}while(flag==1){TR0=1;volt = ReadAdc();volt = volt * 250/256; //转换成电压值,其中Vr=x100 = volt/100;x10 = (volt - x100*100)/10;x = (volt - x100*100)%10;DispBuf[0] = y1000;DispBuf[1] = 0;DispBuf[2] = 16;DispBuf[3] = x;DispBuf[4] = x10;DispBuf[5] = x100;DispBuf[6]=16;DispBuf[7]=2;if(key_value == 8&&volt<=200){flag = 0;while(key_value == 8);}else if(key_value == 7&&volt<=200){flag = 2;while(key_value == 7);}}while(flag==2){TR0=!TR0;if(key_value == 7){flag = 1;while(key_value == 7);} }}}/*函数:T1INTSVC()功能:定时器T1的中断服务函数*/void T1INTSVC() interrupt 3{code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};static unsigned char n = 0;TR1 = 0;TH1 = 0xFC;TL1 = 0x66;TR1 = 1;LED_dig = 0xFF; //暂停显示if(flag==0){if(n==5)LED_seg = ~(disp_seg[DispBuf[n]]|0x80);elseLED_seg = ~disp_seg[DispBuf[n]];//更新扫描数据}if(flag==1){ if(n==5)LED_seg = ~(disp_seg[DispBuf[n]]|0x80);elseif(n==4)LED_seg = ~( disp_seg[DispBuf[n]] ); //更新扫描数据,elseLED_seg = ~disp_seg[DispBuf[n]]; //更新扫描数据 }if(flag==2){LED_seg = ~disp_seg[DispBuf[n]]; //更新扫描数据 }LED_dig = ~com[n]; //重新显示key_scan();n++;n &= 0x07;}void delay(int ms){unsigned int i,j;for(i=0; i<ms; i++) //延时大约1ms (fosc= {for(j=0; j<100; j++);}}/*函数:ReadAdc()功能:读取A/D转换结果返回:8位ADC代码*/unsigned char ReadAdc(void){unsigned char d; //读取得ADC结果unsigned char n; //ADC bit位计数ADC_CS = 0;n = 5;while ( --n != 0 ); //模拟tsu时间n = 8;do{d <<= 1;if ( ADC_DATA )d = d | 0x01; //或d++;ADC_CLK = 1;ADC_CLK = 0;}while ( --n != 0 );ADC_CS = 1;return d;}/*函数:AdcInit()功能:初始化ADC接口*/void AdcInit(void){ADC_CS = 1;ADC_CLK = 0;ADC_DATA = 1;ReadAdc(); //空读一次,用于启动一次A/D转换过程}void key_scan(void){unsigned char key_in;key_in = KEY_IN;switch(key_in){case 0xff:key_value = 0;break;case ~0x01:key_value = 1;break;case ~0x02:key_value = 2;break;case ~0x04:key_value = 3;break;case ~0x08:key_value = 4;break;case ~0x10:key_value = 5;break;case ~0x20:key_value = 6;break;case ~0x40:key_value = 7;break;case ~0x80:key_value = 8;break;default:break;}}/*函数:T1INTSVC()功能:定时器T0的中断服务函数*/void T0INTSVC() interrupt 1 {TR0 = 0;TH0 = 0xFC;TL0 = 0x66;TR0 = 1;if(mbiao<=9000&&TR0==1)mbiao=mbiao-1;if(mbiao==0)mbiao=9000;y1000=mbiao/1000;y100=(mbiao-y1000*1000)/100;y10=(mbiao-y1000*1000-y100*100)/10;y=(mbiao-y1000*1000-y100*100)%10;}。
长沙学院《单片机原理及应用》课程设计说明书题目 LED数码管显示电子秒表设计系(部) **系专业(班级) *************姓名邹部长9931学号******指导教师***起止日期 2016.12.19—2016.12.24《单片机原理及应用》课程设计任务书1系(部):**系专业:******长沙学院课程设计鉴定表目录摘要 (5)第一章概述 (6)1.1电子秒表的设计要求 (6)1.2电子秒表的电路图 (6)1.3电子秒表的设计原理及方案 (7)第二章电子秒表的程序设计 (8)2.1 程序设计流程图 (8)2.2程序设计源代码 (10)第三章程序的调试 (16)第四章设计总结 (17)参考文献 (18)摘要随着经济与社会的发展对智能化和信息化技术要求的不断提高,单片机作为智能控制的核心,逐渐渗透到社会生产和生活的各个方面。
而本文则主要阐述基于单片机设计的数码管秒表,这次设计所采用的的单片机为stc89c52单片机,数码管则是使用2个4位共阴LED数码管组成的8位。
为减少I/O口,而使用了SM74HC138 和74HCT573这2片芯片实现数码管显示8位数据。
利用单片机内部定时器实现计时功能,分别显示为:分—秒—0.01秒。
控制则是使用一键控制,可实现计时开始,计时暂停,计时清零3个功能的循环。
本次的程序设计采用C语言编写,包括显示程序,定时中断服务程序,延时程序。
最后在单片机电路板来观察工作状态。
第一章概述1.1电子秒表的设计要求○1显示要求在初始状态显示的是00—00—00,最左边的2位显示分钟,中间2位显示秒,左边2位显示十分之一秒和百分之一秒,还有个2个LED数码管只显示中间那一段,用作间隔符。
○2然后还的有一个键用来控制秒表,要求按第一下开始计时,按第二下暂停计时,按第三下清零,以此往复循环控制。
○3使用单片机T0方式实现计时0.01秒。
1.2电子秒表的电路图1.3电子秒表的设计原理及方案设计原理根据单片机本身的定时计数器实现1秒的计时。
EDA课程设计-电子钟一、设计要求1、基本功能要求:设计一个电子时钟,要求可以显示时、分、秒,用户可以设置时间。
扩展功能要求:2、跑表功能,闹钟功能,调整数码管的亮度。
二、系统结构控制键—jian5、jian4、jian7、jian8:数码管显示段选信号输出sg:——选择6位数码管中的某一个显示数据;发光二极管控制信号输出—led(7~0)闹钟声音输出—speaker通过一个10M信号分出各种所需频率功能介绍运行后,选择模式7,8位数码管分显示时间的时、分、秒,当前为模式0:时间显示模式,按键7为模式选择键,按下按键7,系统进入模式1,第二次按下为模式2,设置时间模式,第三次按下为跑表模式,第四次为闹钟设置模式,第五次为亮度调节模式:设置时间模式,按键4控制更改数码管的位,按键5控制选中数码管的数值,时间设置完成后,按键按键8,设置时间会保存住,并在模式0中显示;系统进入模式2:秒表模式,按键4为开始/结束键,按键5为清零键;系统进入模式3:闹钟设置模式,相关设置与模式1相同,当当前时间与闹钟设置时间相同时,喇叭就会响;系统进入模式4:亮度调节模式,通过按键4设置亮度,共三种亮度;再按下按键7,系统又会进入模式0。
4、RTL图三、VHDL源程序1、library ieee; --通过10M分出所需频率use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin isport (clk_10M : in std_logic;clk_10000 : out std_logic;clk_100 : out std_logic;clk_1 : out std_logic);end entity;architecture sub1 of fenpin issignal Q_1 : std_logic_vector(8 downto 0);signal Q_2 : std_logic_vector(6 downto 0);signal Q_3 : std_logic_vector(6 downto 0);signal clk10000 : std_logic;signal clk100 : std_logic;signal clk1 : std_logic;beginprocess(clk_10M)beginif clk_10M'event and clk_10M='1' thenif Q_1=500 thenQ_1 <= "000000000";clk10000 <= not clk10000;if Q_2=100 thenQ_2 <= "0000000";clk100<= not clk100;if Q_3=100 thenQ_3 <= "0000000";clk1<=not clk1;else Q_3<=Q_3+1;end if;else Q_2<=Q_2+1;end if;else Q_1<=Q_1+1;end if;end if;end process;clk_10000 <= clk10000;clk_100 <= clk100;clk_1 <= clk1;end sub1;2、library ieee; --扫描数码管use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity xianshi isport(clk_10000:in std_logic;jian4:in std_logic;moshi:in integer range 0 to 4;a0,a1,a3,a4,a6,a7:in integer range 0 to 9;sg11:out std_logic_vector(6 downto 0);bt11:out std_logic_vector(7 downto 0));end;architecture one of xianshi issignal cnt8 :std_logic_vector(2 downto 0);signal a :integer range 0 to 15;signal light: std_logic;signal flash:integer range 0 to 2;signal count1,count2:integer range 0 to 10;beginp1: process(cnt8,light,a0,a1,a3,a4,a6,a7)begincase cnt8 iswhen "000" => bt11<= "0000000"&(light);a<=a0;when "001" => bt11<= "000000"&(light)&'0';a<=a1; when "010" => bt11<= "00000"&(light)&"00";a<=15; when "011" => bt11<= "0000"&(light)&"000";a<=a3; when "100" => bt11<= "000"&(light)&"0000";a<=a4; when "101" => bt11<= "00"&(light)&"00000";a<=15; when "110" => bt11<= '0'&(light)&"000000";a<=a6; when "111" => bt11<= (light)&"0000000";a<=a7;when others => null;end case;end process p1;p2:process(clk_10000)beginif clk_10000'event and clk_10000 ='1' then cnt8 <= cnt8+1; end if;end process p2;p3:process(a)begincase a iswhen 0 => sg11<= "0111111";when 1 => sg11<= "0000110";when 2 => sg11<= "1011011";when 3 => sg11<= "1001111";when 4 => sg11<= "1100110";when 5 => sg11<= "1101101";when 6 => sg11<= "1111101";when 7 => sg11<= "0000111";when 8 => sg11<= "1111111";when 9 => sg11<= "1101111";when 10 => sg11<= "1110111";when 11 => sg11<= "1111100";when 12 => sg11<= "0111001";when 13 => sg11<= "1011110";when 14 => sg11<= "1111001";when 15 => sg11<= "1000000";when others => null;end case;end process p3;process(jian4,moshi)beginif moshi=4 thenif jian4'event and jian4='1' thenif flash =2 thenflash<=0;else flash<=flash+1;end if;end if;end if;end process;process(clk_10000,flash)beginif clk_10000'event and clk_10000 ='1' thencase flash iswhen 0 => light<='1';when 1 => if count1=2 thencount1<=0; light<='1';else count1<=count1+1;light<='0';end if;when 2 => if count2=4 thencount2<=0; light<='1';else count2<=count2+1;light<='0';end if;end case;end if;end process;end;3、library ieee; --跑表开始暂停use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity paobiao isport(clk_1:in std_logic;jian8:in std_logic;shishi1,shige1,fenshi1,fenge1,miaoshi1,miaoge1:in integer range 0 to 9; shishi2,shige2,fenshi2,fenge2,miaoshi2,miaoge2:out integer range 0 to 9); end entity;architecture bhv of paobiao issignal shi:integer range 0 to 100;signal fen:integer range 0 to 100;signal miao:integer range 0 to 100;beginprocess(clk_1,jian8,shishi1,shige1,fenshi1,fenge1,miaoshi1,miaoge1)beginif jian8='1' thenshi<=shishi1*10+shige1;fen<=fenshi1*10+fenge1;miao<=miaoshi1*10+miaoge1;elsif clk_1'event and clk_1='1' thenif miao=59 thenmiao<=0;fen<=fen+1;elsif fen>59 thenfen<=0;shi<=shi+1;elsif shi>23 thenshi<=0;else miao<=miao+1;end if;end if;end process;miaoge2<=miao rem 10;miaoshi2<=miao/10;fenge2<=fen rem 10;fenshi2<=fen/10;shige2<=shi rem 10;shishi2<=shi/10;end;4、library ieee; --设置当前时间use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity settime isport(moshi:in integer range 0 to 4;jian4,jian5:in std_logic;shishi,shige,fenshi,fenge,miaoshi,miaoge:out integer range 0 to 9);end entity;architecture bav of settime issignal a:integer range 0 to 5;signal shishi1,shige1,fenshi1,fenge1,miaoshi1,miaoge1: integer range 0 to 9; beginprocess(moshi,jian4)beginif moshi=1 thenif jian4'event and jian4='1' thenif a < 5 thena<=a+1;else a<=0;end if;end if;end if;end process;process(moshi,a,jian5)beginif moshi=1 thenif a=0 thenif jian5'event and jian5='1' thenif miaoge1 =9 thenmiaoge1<=0;else miaoge1<=miaoge1+1;end if;end if;end if;if a=1 thenif jian5'event and jian5='1' thenif miaoshi1 =5 thenmiaoshi1<=0;else miaoshi1<=miaoshi1+1;end if;end if;end if;if a=2 thenif jian5'event and jian5='1' thenif fenge1 =9 thenfenge1<=0;else fenge1<=fenge1+1;end if;end if;end if;if a=3 thenif jian5'event and jian5='1' thenif fenshi1 =5 thenfenshi1<=0;else fenshi1<=fenshi1+1;end if;end if;end if;if a=4 thenif jian5'event and jian5='1' thenif shige1 =9 thenshige1<=0;else shige1<=shige1+1;end if;end if;end if;if a=5 thenif jian5'event and jian5='1' thenif shishi1 =2 thenshishi1<=0;else shishi1<=shishi1+1;end if;end if;end if;end if;end process;miaoge<=miaoge1;miaoshi<=miaoshi1;fenge<=fenge1;fenshi<=fenshi1;shige<=shige1;shishi<=shishi1;end;5、library ieee; --秒表功能use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity miaobiao isport(clk_100:in std_logic;moshi:in integer range 0 to 4;jian5,jian4:in std_logic;fenshi,fenge,miaoshi,miaoge,xmiaoshi,xmiaoge:out integer range 0 to 9); end entity;architecture bhv of miaobiao issignal fen,miao,xmiao:integer range 0 to 99;signal start:std_logic:='0';signal reset:std_logic:='0';beginprocess(clk_100,jian5,jian4,moshi,reset,start)beginif moshi=2 thenif reset='1' thenfen<=0;miao<=0;xmiao<=0;elsif start='1' thenelsif clk_100'event and clk_100='1' thenif xmiao=99 thenxmiao<=0;miao<=miao+1;elsif miao>59 thenmiao<=0;fen<=fen+1;elsif fen>23 thenfen<=0;else xmiao<=xmiao+1;end if;end if;end if;end process;process(jian4,start)beginif jian4'event and jian4='1' thenstart<=not start;else start<=start;end if;end process;process(jian5,reset)beginif jian5'event and jian5='1' thenreset<=not reset;else reset<= reset;end if;end process;xmiaoge<=xmiao rem 10;xmiaoshi<=xmiao/10;miaoge<=miao rem 10;miaoshi<=miao/10;fenge<=fen rem 10;fenshi<=fen/10;end;6、library ieee; --设置闹钟时间use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity naozhongset isport(moshi:in integer range 0 to 4;jian4,jian5:in std_logic;shishi,shige,fenshi,fenge,miaoshi,miaoge:out integer range 0 to 9); end entity;architecture bav of naozhongset issignal a:integer range 0 to 5;signal fenshi1,fenge1,miaoge1: integer range 0 to 9;signal shishi1: integer range 0 to 9:=1;signal shige1: integer range 0 to 9:=2;signal miaoshi1: integer range 0 to 9:=0;beginprocess(moshi,jian4)beginif moshi=3 thenif jian4'event and jian4='1' thenif a < 5 thena<=a+1;else a<=0;end if;end if;end if;end process;process(moshi,a,jian5)beginif moshi=3 thenif a=0 thenif jian5'event and jian5='1' thenif miaoge1 =9 thenmiaoge1<=0;else miaoge1<=miaoge1+1;end if;end if;end if;if a=1 thenif jian5'event and jian5='1' thenif miaoshi1 =5 thenmiaoshi1<=0;else miaoshi1<=miaoshi1+1;end if;end if;end if;if a=2 thenif jian5'event and jian5='1' thenif fenge1 =9 thenfenge1<=0;else fenge1<=fenge1+1;end if;end if;end if;if a=3 thenif jian5'event and jian5='1' thenif fenshi1 =5 thenfenshi1<=0;else fenshi1<=fenshi1+1;end if;end if;end if;if a=4 thenif jian5'event and jian5='1' thenif shige1 =9 thenshige1<=0;else shige1<=shige1+1;end if;end if;end if;if a=5 thenif jian5'event and jian5='1' thenif shishi1 =2 thenshishi1<=0;else shishi1<=shishi1+1;end if;end if;end if;end if;end process;miaoge<=miaoge1;miaoshi<=miaoshi1;fenge<=fenge1;fenshi<=fenshi1;shige<=shige1;shishi<=shishi1;end;7、library ieee; --闹钟喇叭输出use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity naozhongspeaker isport(clk_100:in std_logic;shishi1,shige1,fenshi1,fenge1,miaoshi1,miaoge1:in integer range 0 to 9; shishi2,shige2,fenshi2,fenge2,miaoshi2,miaoge2:in integer range 0 to 9; speaker:out std_logic);end entity;architecture bav of naozhongspeaker isbeginprocess(clk_100,shishi1,shige1,fenshi1,fenge1,miaoshi1,miaoge1,shishi2,shige2,fenshi2,fenge2,miaoshi2,miaoge2)beginif shishi2=shishi1 and shige2=shige1 and fenshi2=fenshi1 andfenge2=fenge1 and miaoshi2=miaoshi1 thenspeaker<=clk_100;else speaker<='1';end if;end process;end;8、library ieee; --转换模式use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity moshi isport(jian7:in std_logic;moshi:out integer range 0 to 4);end;architecture one of moshi issignal moshis:integer range 0 to 4;beginprocess(jian7)beginif jian7'event and jian7='1' thenif moshis=4 thenmoshis<=0;else moshis<=moshis+1;end if;end if;end process;moshi<=moshis;end;9、library ieee; --五选一选择器use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity mux5_1 isport(moshi:in integer range 0 to 4 ;shishi1,shige1,fenshi1,fenge1,miaoshi1,miaoge1:in integer range 0 to 9;shishi2,shige2,fenshi2,fenge2,miaoshi2,miaoge2:in integer range 0 to 9;shishi3,shige3,fenshi3,fenge3,miaoshi3,miaoge3:in integer range 0 to 9; fenshi,fenge,miaoshi,miaoge,xmiaoshi,xmiaoge:in integer range 0 to 9;a0,a1,a3,a4,a6,a7:out integer range 0 to 9);end entity mux5_1;architecture bhv of mux5_1 isbeginprocess(shishi1,shige1,fenshi1,fenge1,miaoshi1,miaoge1,shishi2,shige2,fenshi2,fenge2,miaoshi2,miaoge2,shishi3,shige3,fenshi3,fenge3,miaoshi3,miaoge3,fenshi,fenge,miaoshi,miaoge,xmiaoshi,xmiaoge,moshi)begincase moshi iswhen 0 =>a0<=shishi1;a1<=shige1;a3<=fenshi1;a4<=fenge1;a6<=miaoshi1;a7<=miaoge1;when 1 =>a0<=shishi2;a1<=shige2;a3<=fenshi2;a4<=fenge2;a6<=miaoshi2;a7<=miaoge2;when 2 =>a0<=fenshi;a1<=fenge;a3<=miaoshi;a4<=miaoge;a6<=xmiaoshi;a7<=xmiaoge;when 3 =>a0<=shishi3;a1<=shige3;a3<=fenshi3;a4<=fenge3;a6<=miaoshi3;a7<=miaoge3;when 4 => a0<=8;a1<=8;a3<=8;a4<=8;a6<=8;a7<=8;end case;end process;end;10、library ieee; --主程序置顶use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity clock isport(clk_10M:in std_logic;jian5,jian4,jian7,jian8:in std_logic;sg:out std_logic_vector(6 downto 0);bt:out std_logic_vector(7 downto 0);speaker:out std_logic);end entity;调用声明语句architecture bav of clock iscomponent fenpin --分频port (clk_10M : in std_logic;clk_10000 : out std_logic;clk_100 : out std_logic;clk_1 : out std_logic);end component;component paobiao --跑表port(clk_1:in std_logic;jian8:in std_logic;shishi1,shige1,fenshi1,fenge1,miaoshi1,miaoge1:in integer range 0 to 9; shishi2,shige2,fenshi2,fenge2,miaoshi2,miaoge2:out integer range 0 to 9);end component;component xianshi --扫描显示port(clk_10000:in std_logic;jian4:in std_logic;moshi:in integer range 0 to 4;a0,a1,a3,a4,a6,a7:in integer range 0 to 9;sg11:out std_logic_vector(6 downto 0);bt11:out std_logic_vector(7 downto 0));end component;component moshi --模式转换port(jian7:in std_logic;moshi:out integer range 0 to 4);end component;component mux5_1 --五选一选择器port(moshi:in integer range 0 to 4 ;shishi1,shige1,fenshi1,fenge1,miaoshi1,miaoge1:in integer range 0 to 9;shishi2,shige2,fenshi2,fenge2,miaoshi2,miaoge2:in integer range 0 to 9;shishi3,shige3,fenshi3,fenge3,miaoshi3,miaoge3:in integer range 0 to 9;fenshi,fenge,miaoshi,miaoge,xmiaoshi,xmiaoge:in integer range 0 to 9;a0,a1,a3,a4,a6,a7:out integer range 0 to 9);end component;component settime --设置当前时间port(moshi:in integer range 0 to 4;jian4,jian5:in std_logic;shishi,shige,fenshi,fenge,miaoshi,miaoge:out integer range 0 to 9);end component;component miaobiao is --秒表port(clk_100:in std_logic;moshi:in integer range 0 to 4;jian5,jian4:in std_logic;fenshi,fenge,miaoshi,miaoge,xmiaoshi,xmiaoge:out integer range 0 to 9);end component;component naozhongset is --闹钟时间设置port(moshi:in integer range 0 to 4;jian4,jian5:in std_logic;shishi,shige,fenshi,fenge,miaoshi,miaoge:out integer range 0 to 9);end component;component naozhongspeaker is --闹钟喇叭输出port(clk_100:in std_logic;shishi1,shige1,fenshi1,fenge1,miaoshi1,miaoge1:in integer range 0 to 9;shishi2,shige2,fenshi2,fenge2,miaoshi2,miaoge2:in integer range 0 to 9;speaker:out std_logic);end component;signal moshis:integer range 0 to 4; --信号声明signal shishi1s,shige1s,fenshi1s,fenge1s,miaoshi1s,miaoge1s:integer range 0 to 9;signal shishi2s,shige2s,fenshi2s,fenge2s,miaoshi2s,miaoge2s:integer range 0 to 9;signal shishi3s,shige3s,fenshi3s,fenge3s,miaoshi3s,miaoge3s:integer range 0 to 9;signal fenshis,fenges,miaoshis,miaoges,xmiaoshis,xmiaoges: integer range 0 to 9;signal a0s,a1s,a3s,a4s,a6s,a7s: integer range 0 to 9;signal clk_10000s,clk_100s, clk_1s: std_logic;begin --元件例化u1:paobiao port map(clk_1=>clk_1s,jian8=>jian8,shishi1=>shishi2s,shige1=>shige2s,fenshi1=>fenshi2s,fenge1=>fenge2s,miaoshi 1=>miaoshi2s,miaoge1=>miaoge2s,shishi2=>shishi1s,shige2=>shige1s,fenshi2=>fenshi1s,fenge2=>fenge1s,miaoshi2=>m iaoshi1s,miaoge2=>miaoge1s);u2:xianshi port map(clk_10000=>clk_10000s,jian4=>jian4,moshi=>moshis,a0=>a0s,a1=>a1s,a3=>a3s,a4=>a4s,a6=>a6s,a7=>a7s,sg11=>sg,bt11=>bt);u3:settime port map(moshi=>moshis,jian5=>jian5,jian4=>jian4,shishi=>shishi2s,shige=>shige2s,fenshi=>fenshi2s,fenge=>fenge2s,miaoshi=>miaosh i2s,miaoge=>miaoge2s);u4:moshi port map(jian7=>jian7,moshi=>moshis);u5:mux5_1 port map(moshi=>moshis,shishi1=>shishi1s,shige1=>shige1s,fenshi1=>fenshi1s,fenge1=>fenge1s,miaoshi1=>m iaoshi1s,miaoge1=>miaoge1s,shishi2=>shishi2s,shige2=>shige2s,fenshi2=>fenshi2s,fenge2=>fenge2s,miaoshi2=>m iaoshi2s,miaoge2=>miaoge2s,shishi3=>shishi3s,shige3=>shige3s,fenshi3=>fenshi3s,fenge3=>fenge3s,miaoshi3=>m iaoshi3s,miaoge3=>miaoge3s,fenshi=>fenshis,fenge=>fenges,miaoshi=>miaoshis,miaoge=>miaoges,xmiaoshi=>x miaoshis,xmiaoge=>xmiaoges,a0=>a0s,a1=>a1s,a3=>a3s,a4=>a4s,a6=>a6s,a7=>a7s);u6:miaobiao port map(clk_100=>clk_100s,moshi=>moshis,jian5=>jian5,jian4=>jian4,fenshi=>fenshis,fenge=>fenges,miaoshi=>miaoshis,miaoge=>miaoges,xmiaoshi=>xmiao shis,xmiaoge=>xmiaoges);u7:fenpin port map(clk_10M=>clk_10m,clk_10000=>clk_10000s,clk_100=>clk_100s,clk_1 =>clk_1s);u8:naozhongset port map(moshi=>moshis,jian5=>jian5,jian4=>jian4,shishi=>shishi3s,shige=>shige3s,fenshi=>fenshi3s,fenge=>fenge3s,miaoshi=>mi aoshi3s,miaoge=>miaoge3s);u9:naozhongspeaker port map(clk_100=>clk_100s,speaker=>speaker,shishi1=>shishi3s,shige1=>shige3s,fenshi1=>fenshi3s,fenge1=>fenge3s,miaoshi1=>m iaoshi3s,miaoge1=>miaoge3s,shishi2=>shishi1s,shige2=>shige1s,fenshi2=>fenshi1s,fenge2=>fenge1s,miaoshi2=>m iaoshi1s,miaoge2=>miaoge1s);end;。
电子线路CAD训练报告专业新能源科学与工程学生姓名陈家蓓班级能源131学号1310604123指导教师张兰红完成日期2016年1月22日目录1 训练目的 (1)2 训练内容 (1)3 训练要求 (1)4 电路原理图的绘制 (1)4.1原理图的设计流程 (2)4.2建立元件库的过程 (3)4.2.1创建原理图元件库文件 (3)4.2.2添加元件 (3)4.2.3提取原理图文件 (4)5 PCB图的绘制 (4)5.1 PCB图的设计流程 (4)5.2 PCB图建立元件库的过程 (5)6 调试与实验结果 (7)6.1 静态检查 (7)6.2 通电检查 (8)6.3 实验结果 (9)7. 结束语 (10)附录1:用LED数码管显示的秒表设计电路原理图 (12)附录2:用LED数码管显示的秒表设计PCB图 (13)附录3:用LED数码管显示的秒表设计元器件目录表 (14)电子线路C AD训练1训练目的(1) 掌握Altium Designer软件的操作。
(2) 学会用SCH原理图来描述电路,深入理解电路设计的流程和方法,掌握简单PCB板绘制方法和设计生产工艺,通过训练,能够独立进行电路图的绘制。
(3) 掌握焊接技术,简单电路元器件装配(4) 培养从事科学实验的技能、技巧,提高分析和解决问题的能力,培养学生的实践和创新能力。
2 训练内容(1) 针对“用LED数码管显示的秒表设计”,用Altium Design软件设计电路原理图与PCB图各一张。
(2) 将所设计的PCB板交给厂家加工。
(3) 借助于单片机课程设计时所做的Proteus仿真、C51设计软件和多孔板实物,在加工好的PCB板上焊接、调试,获得调试成功的实物一份。
3 训练要求运用Altium Designer软件绘制课题的SCH电路原理图,建立SCH库文件,生成网络表并能够分析网络表,建立PCB文件并设置相应的工作环境,建立PCB库文件并能够封装,正确地导入网络表,对PCB进行布局布线,最后导出导入文件。
电子表说明书电子表说明书篇一:电子表使用说明书电子表使用说明书 1 、正常时间模式:正常时间画面显示时、分、秒、星期。
1.1 按START键显示日期。
1.2 按RESET键显示每日闹铃时间。
1.3 按MDE进入跑秒模式。
1.4 按LIGHT键灯亮3秒。
1.5 按RESET+START键打开/关闭每日闹铃,相应的图标显示/消失;按住两键则发出bibi的响声。
1.6 按RESET+MDE键可打开/关闭整点报时(星期全显示为打开,反之则为关闭)。
? 任何状态下按住RESET+START+MDE三键,画面全显示,松开则返回。
2 、跑秒模式:从正常时间模式按MDE键一次进入跑秒模式。
2.1 按START键开始/停止跑秒。
2.2 跑秒停止时,按RESET键跑秒数值归0。
2.3 跑秒运行时,按RESET键,提取一个分段时间,跑秒画面停止(但跑秒并没有中止依然在背后运行)之后:若按RESET键,画面显示总的跑秒值;若按START键,在背后运行的跑秒停止,但画面依然停止,再按RESET键显示跑秒停止时的值。
3 、每日闹铃设定: 从正常时间模式按MDE键两次进入每日闹铃设定状态,时位闪动。
3.1 按RESET键转换设定对象:时分3.2 按START键调整相应的数值,按住键可进行快速调整。
3.3 每日闹铃设定完成,按MDE键保存并退出设定,转到正常时间模式。
?每日闹铃打开,当到达闹铃时间,会发出1分钟的bibi声;闹铃期间,若按START 键,5分钟后会再次闹铃。
4 、正常时间设定:从正常时间模式按MDE键三次进入正常时间设定状态,秒位闪动。
4.1 按RESET键转换设定对象:秒分时日月星期4.2 按START键调整相应的数值,按住键可进行快速调整(秒位除外);秒位调整时按START键秒值归0,若秒值大于或等于30,则分值同时增加1。
4.3 时位设定时,按START键可选择12/24小时显示格式。
4.4 正常时间设定完成,按MDE键保存并退出设定状态,转到正常时间模式。
目录一、设计题目和要求: (2)二、设计目的: (2)三、设计内容: (3)四、课程设计心得体会 (25)五、参考文献 (26)六、课程设计指导教师评审标准及成绩评定 (27)附件1:秒表原理图(实际接线图) (28)附件2:仿真图1 (30)附件3:仿真图2 (31)一、设计题目和要求:题目三:秒表应用AT89C51的定时器设计一个2位的LED数码显示作为“秒表”:显示时间为00~99s,每秒自动加1,设计一个“开始”键,按下“开始”键秒表开始计时。
设计一个“复位”键,按下“复位”键后,秒表从0开始计时。
任务安排:李座负责绘制电路原理图;梁宗林负责收集资料及电子版整理;付忠林负责程序和仿真。
二、设计目的:1.进一步掌握AT89C51单片机的结构和工作原理;2.掌握单片机的接口技术及外围芯片的工作原理及控制方法;3.进一步掌握单片机程序编写及程序调试过程,掌握模块化程序设计方法;4.掌握PROTEUS仿真软件的使用方法;5.掌握LED数码管原理及使用方法。
6.掌握定时器、外部中断的设置和编程原理。
7.通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。
8.该课程设计通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零、复位功能,并同时可以用数码管显示。
三、设计内容:了解8051芯片的的工作原理和工作方式,使用该芯片对LED数码管进行显示控制,实现用单片机的端口控制数码管,显示分、秒,并能用按钮实现秒表起动、停止、清零功能,精确到1秒。
AT89C51单片机的主要工作特性:·内含4KB的FLASH存储器,擦写次数1000次;·内含28字节的RAM;·具有32根可编程I/O线;·具有2个16位可编程定时器;·具有6个中断源、5个中断矢量、2级优先权的中断结构;·具有1个全双工的可编程串行通信接口;·具有一个数据指针DPTR;·两种低功耗工作模式,即空闲模式和掉电模式;·具有可编程的3级程序锁定定位;AT89C51的工作电源电压为5(1±0.2)V且典型值为5V,最高工作频率为24MHz.AT89C51各部分的组成及功能:振荡器和时钟电路数据存储器128字节程序存储器14KBCPU 两个16位定时器计数器中断控制总线扩展控制器并行可编程I/O口可编程串行口内部总线外部中断扩展控制P0 P1 P2 P3 RXD TXD1.单片机的中央处理器(CPU )是单片机的核心,完成运算和操作控制,主要包括运算器和控制器两部分。
沈阳工程学院课程设计摘要摘要本文提出了一个利用微机原理与接口技术完成秒表的设计方案,该方案主要是选择8254A的计数器0进行100ms的定时,其输出于OUT0与8259的IRQ7相连,当定时到100ms 的时候产生一个中断信号,在中断服务程序进行秒的计数,并送入相应的存储单元;8255的A口接七段数码管的位选信号,B口接七段数码管的段选信号,C口上面接键盘,通过键盘控制暂停计时、继续计时。
秒,毫秒的数值通过对8255的编程可以显示在七段数码管上面。
通过对一个基于微型计算机的能实现电子时钟的设计学习,详细介绍了微型计算机原理控制的应用中的数据转换显示,LED显示原理,微型计算机控制的定时中断原理。
从而达到学习、了解微机原理控制的相关指令在各方面的应用。
系统由8254、8255、8259等构成,能实现秒表显示的功能,能进行秒、毫秒的显示。
关键词:定时器8254A,并行通信接口芯片8255,七段数码管。
目录摘要 (I)第1章概述 (1)1.1 设计题目 (1)1.2 设计目的 (1)1.3 设备器材 (1)1.4 任务分析 (1)第2章设计原理 (3)2.1 设计原理 (3)2.2 元器件功能特性 (3)2.2.1 8255简介 (3)2.2.2 8259简介 (5)2.2.3 8254简介 (6)2.2.4 七段LED数码管及其接口 (8)第3章系统设计 (9)3.1 硬件设计 (9)3.2 软件设计 (9)第4章系统实现 (11)4.1 概述 (11)4.2 程序模块 (11)4.2.1 主程序模块 (11)4.2.2 显示模块 (12)4.2.3 小键盘模块 (13)4.2.4 定时模块 (13)4.2.5 中断处理模块 (14)第5章遇到的问题及解决方法 (15)5.1 遇到的问题 (15)5.2 解决的方法 (15)总结 (17)致谢 (18)参考文献 (19)附录 (20)A1.1 源程序代码 (20)第1章概述1.1 设计题目用七段LED数码管显示秒表1.2 设计目的《微型计算机原理及应用》是一门实践性较强的课程,让学生在学完该课程之后,进行一次课程设计,使学生将课堂所学的知识和实践有机结合起来,初步掌握计算机应用系统设计的步骤和接口设计的方法,提高分析和解决实际问题的能力。
实验一设计数码管电子表一.实验要求:使用8253的两个计数器串连,作为微机系统的外扩定时源,以数码管电路作为外扩输出设备,采用中断方式编程,实现数码管电子表“具体要求如下:1.六位数码管分别显示时,分,秒。
2.初始时间由主机键盘输入。
3.主机按任意键停止计时返回DOS。
二:实验电路+5VQ2A0IORIOW8253CS 200H -207H(*注意:A1,A0用来选择8253内部三个计数器中的一个,它们分别与计算机地址线的低两位相连。
RD ,WR 用来控制8253的读写,它们分别与计算机的IOR ,IOW相连) 电路分析:从Q2出来的时钟频率为1MHZ ,为实现一秒钟调用一次中断,必须要每1000000次时钟调用一次中断。
我们同时将计数器0和计数器1的初值都设为1000,并将计数器0的输出OUT0作为计数器1的时钟,并将计数器1的输出OUT1连到B4端子上,这样就实现了每1000×1000=1000000次时钟调用一次中断。
三.8253控制字格式D7 D6 D5 D4 D3 D2 D1 D0四.程序清单:TITLE DISPTIMEDSEG SEGMENTINPUT_TIM DB 'Please input the current t ime.',13,10,'$' SHOW_TIM DB 'Time is as the follow.Press Ctr-C to exit.',13,10,'$'BAD_DATA DB 'Digits mush be between 0 and 9',13,10,'$' BAD_HRS DB 'Hour must be between 0 and 23',13,10,'$' BAD_MINS DB 'Minutes mush be between 0 and 59',13,10,'$' BAD_SECS DB 'Seconds mush be between 0 and 59',13,10,'$' CRLF DB 13,10,'$'ASK_HRS DB 'Hour(0-23):$' ASK_MINS DB 'Minute(0-59):$'ASK_SECS DB 'Second(0-59):$'USER DB 3,3 DUP(?)TIME DB 3 DUP(?)COUNT DW 1OLD0A DD ?TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH, 07H,7FH,6FH,77H,7CH,39H,5EH, 79H,71HDSEG ENDSSSEG SEGMENT STACK 'STACK' DB 256 DUP(?)SSEG ENDSCSEG SEGMENTASSUMECS:CSEG,SS:SSEG,DS:DSEG,ES:D SEGSTART PROC FARMOV AX,DSEGMOV DS,AXCALL GET_TIMECLICALL I8253 (初始化8253)CALL I8259 (初始化8259)CALL RD0A(读入原0A中断向量)CALL WR0A(写入新中断向量)ROTATE: CALL DISPLAY(只要不按键,就不断调用DISPLAY显示TIME变量中的时间)MOV AH,1INT 16H JZ ROTATE(按键输入后退出。
)CALL RESETMOV AH,4CHINT 21HRETSTART ENDP;*************************** *********(SERVICE为新的中断程序)SERVICE PROC NEARPUSH AXPUSH DSMOV AX,DSEGMOV DS,AXCALL CHANGE_TIME(函数CHANGE_TIME用以将时间增加一秒)MOV AL,20HOUT 20H,AL(送应答信号)POP DSIRETSERVICE ENDP;**************************** ********(此函数将保存在TIME变量中的时间显示在数码管上。
) DISPLAY PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIMOV SI,OFFSET TIME MOV BX,OFFSET TABLE MOV CL,4MOV AL,[SI]MOV AH,ALSAR AL,CLAND AH,00001111BXLAT OUT DX,ALMOV DX,200HMOV AL,01HOUT DX,ALMOV AL,0OUT DX,ALMOV AL,AHXLATMOV DX,201HOUT DX,ALMOV DX,200HMOV AL,02HOUT DX,ALMOV AL,0OUT DX,ALMOV AL,[SI+1]MOV AH,ALSAR AL,CLAND AH,00001111B XLATOUT DX,ALMOV DX,200HMOV AL,04HOUT DX,ALMOV AL,0OUT DX,ALMOV AL,AHXLATMOV DX,201HOUT DX,ALMOV DX,200HMOV AL,08HOUT DX,ALMOV AL,0OUT DX,ALMOV AL,[SI+2]MOV AH,ALSAR AL,CLAND AH,00001111B XLAT OUT DX,AL MOV DX,200H MOV AL,10H OUT DX,AL MOV AL,0OUT DX,AL MOV AL,AH XLATMOV DX,201H OUT DX,AL MOV DX,200H MOV AL,20H OUT DX,AL MOV AL,0OUT DX,ALPOP SIPOP DXPOP CXPOP BXPOP AXRETDISPLAY ENDP;*************************** *********I8253 PROC NEARMOV AL,00110100B MOV DX,20BHOUT DX,AL(设定8253的计算器0,写入时先低字节后高字节,方式2,二进制计数)MOV AX,1000MOV DX,208HOUT DX,ALMOV AL,AHOUT DX,AL(计数器0的初值设为1000。
) MOV AL,01110100BMOV DX,20BHOUT DX,AL(设定8253的计算器1,入时先低字节后高字节,方式2,二进制计数)MOV AX,1000MOV DX,209HOUT DX,ALMOV AL,AHOUT DX,AL(计数器1初值设为1000。
)RETI8253 ENDP;*************************** *******I8259 PROC NEARIN AL,21HAND AL,11111011B OUT 21H,ALIN AL,0A1HAND AL,11111101B OUT 0A1H,ALRETI8259 ENDP;********************************RD0A PROC NEARMOV AX,350AHINT 21HMOV WORD PTR OLD0A,BXMOV WORD PTR OLD0A+2,ESRETRD0A ENDPWR0A PROC NEARPUSH DSMOV AX,CSEGMOV DS,AXMOV DX,OFFSET SERVICEMOV AX,250AHINT 21HPOP DSRETWR0A ENDP ;**************************** ****RESET PROC NEARMOV DX,WORD PTR OLD0AMOV DS,WORD PTR OLD0A+2MOV AX,250AHINT 21H (恢复原来的中断向量)IN AL,0A1HOR AL,00000010BOUT 0A1H,AL (屏蔽用户中断)RETRESET ENDP;**************************** *******(函数GET_TIME的作用是接受用户输入的时间,并把它保存在6字节变量TIME中。
为了保证程序的严谨,如果输入的时间非法,则显示出错信息并要求重输。
)GET_TIME PROC NEARLEA DX,INPUT_TIM MOV AH,9INT 21H (提示输入时间)HOUR: LEA DX,ASK_HRSMOV AH,9INT 21H (提示输入小时)CALL INPUT_TIME (函数INPUT_TIME的功能是把用户输入的字符转化为时间值并存放在BL中如果输入的不是数字,那么让标志寄存器CF=1) JC HOUR (输入不是数字,重输)CMP BL,23HJNA HRS2 (如果输入的数字比24小,那么跳到HRS2去执行下面的内容;如果输入的数字大于等于24,那么要求重输。
对于分,秒的输入也按照此法处理。
)LEA DX,BAD_HRSMOV AH,9INT 21HJMP HOURHRS2: PUSH BXMIN: LEA DX,ASK_MINSMOV AH,9INT 21HCALL INPUT_TIMEJC MINCMP BL,59HJNA MIN2LEA DX,BAD_MINSMOV AH,9INT 21HJMP MINMIN2: PUSH BXSEC: LEA DX,ASK_SECSMOV AH,9INT 21HCALL INPUT_TIMEJC SECCMP BL,59HJNA SEC2LEA DX,BAD_SECSMOV AH,9INT 21HJMP SEC(以下程序段将输入的的时间保存在TIME变量中)SEC2: MOV SI,OFFSET TIME MOV [SI+2],BLPOP BXMOV [SI+1],BLPOP BXMOV [SI],BLRETGET_TIME ENDP;************************************(函数INPUT_TIME的功能是把用户输入的字符转化为时间值并存放在BL中;如果输入的不是数字,那么让标志寄存器CF=1)INPUT_TIME PROC NEARLEA DX,USERMOV AH,0AHINT 21HLEA DX,CRLFMOV AH,9INT 21HCMP USER+1,1JAE CONVERTMOV BL,0RETCONVERT: MOV CL,4MOV AL,USER+2CALL CHECKJC LEAVEAND AL,0FHMOV BL,ALCMP USER+1,2JB CLR_CFSHL BL,CLMOV AL,USER+3CALL CHECKJC LEAVEAND AL,0FHOR BL,ALCLR_CF: CLCLEAVE: RETINPUT_TIME ENDP;*************************** ********CHECK PROC NEARCMP AL,'0'JB ERRORCMP AL,'9'JA ERRORCLCRETERROR: LEA DX,BAD_DATAMOV AH,9 INT 21HSTCRETCHECK ENDP;*************************** ********(此函数将保存在TIME变量中的时间增加一秒)CHANGE_TIME PROC NEARPUSH AXPUSH CXPUSH DXPUSH SIMOV SI,OFFSET TIME MOV AL,[SI]MOV CH,ALMOV AL,[SI+1]MOV CL,ALMOV AL,[SI+2]MOV DH,AL(CH:CL:DH=时:分:秒) MOV AL,DHADD AL,1DAAMOV DH,ALCMP DH,60H JNE EXITCHG MOV DH,0MOV AL,CLADD AL,1DAAMOV CL,ALCMP CL,60H JNE EXITCHG MOV CL,0MOV AL,CHADD AL,1DAA MOV CH,ALCMP CH,24HJNE EXITCHGMOV CH,0 EXITCHG: MOV SI,OFFSET TIME MOV [SI],CHMOV [SI+1],CLMOV [SI+2],DHPOP SIPOP DXPOP CXPOP AXRETCHANGE_TIME ENDPCSEG ENDSEND START五.实验总结:1.由于与本实验相关的程序上学期编过(在屏幕上显示时间),所以这次实验我的程序中的主要部分是用的以前的,添加了将时间显示在数码管上的程序。