基于单片机的纸张计数器设计_第1页
基于单片机的纸张计数器设计_第2页
基于单片机的纸张计数器设计_第3页
基于单片机的纸张计数器设计_第4页
基于单片机的纸张计数器设计_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

页第1章绪论1.1课题研究的背景在21世纪的今天,计算机电子技术飞速发展,其几乎渗透到了人们生活中的各个领域,有利推动了社会生产力的发展和社会信息化程度的提高。同时现代电子产品的性能愈来愈高,产品的更新迭代愈来愈快,这就需要的更加高深科学知识和更好的创新能力来支撑产品的升级,而单片机技术的在其中占有极为重要的部分。近几年来,单片机在“智能化”电子产品中的应用越来越广泛,同时单片机计数以其高集成度、高可靠性、体积小、便于携带等优势在“智能化”电子产品中受到了广大客户的青睐。目前基于单片机等嵌入式技术几乎渗透到了我们生活中各个领域,几乎很难找到哪个领域没有单片机的踪迹,导弹的导航系统、飞机上仪表控制、计算机网络通讯与数据传输、工业自动化控制,民用的安保系统、手机、自动洗衣机、录音机、摄影机,更不用说自动控制邻域的机器人、智能仪表、医疗器械等[1]。随着电子产品的智能化,基于单片机等硬件编程的嵌入式技术就显得格外重要了,像我们平时见到的手表、数字相机,都是典型的基于单片机的嵌入式技术,随着internet的迅速发展和链家处理器的出现,单片机技术在日常生活里形成更大的应用领域。从事该行业的待遇和发展前景可想而知。首先关于单片机的研究,早在上世纪70年代,Intel公司研制出了第一块4位微处理器,随着半导体计数及大规模继承点路技术的发展,单片机逐渐发展到后来的8位、16位、32位甚至64位。国内的台湾华邦公司很早前已经生产了W77和W78系列单片机并且完全兼容80C51;宏晶科技公司推出的STCMCU全系列单片机其基于Flash制造工业的80C51单片机,宏晶STC不仅支持ISP技术且拥有完全独立自主的知识产权,该系列单片机还有超强加密、高速、低功耗、低价、功能强、抗干扰能力强等[2]。由此可以看出,单片机无论是在国内外已经有了非常成熟的技术基础了。1.2国内外发展现状但尽管单片机技术成熟,智能化发展越来越快,但是其应用面还不够广泛,如在印刷行业中,其发展还处于初级阶段,多数企业对智能化建设的解决方案、关键计数等认识不清。虽然有少数印刷企业在装备上已经逐渐实现了机械化、自动化,但是还有有数量众多的中小型企业在设备的智能化方面基础薄弱、缺少经济支撑以及系统建设规划,甚至还有企业在使用传统的人工作业,如在纸张计数流程中使用人工计数,这就造成了操作人员长期处于疲劳状态,费时费工,而且还会出现计数不准确现象,效率大大较低。当然目前也出现了一些纸张计数器能够使用在印刷业中,如光电纸张计数器,计数器是利用投射式光路,利用应刷前纸张透射率大致均匀的特点,检验透射光的强度的变化达到计数的目的,但是这种方式的计数器不适合用于印刷后纸张的计数。而本次所设计的基于单片机的纸张计数器,则可以解决这个问题,因为它的检测时通过电容变化来进行检测,与纸张投射率关系不大。1.3研究的意义及重点为了解决人工纸张计数中所发生的一系列效率问题,本文中设计了一款基于单片机的纸张计数装置,其是通过STC89C52RC单片机进行控制,通过测量不同纸张引起的不同频率的脉冲,经过编程的控制实现最终结果的快速显示。该装置在一定程度上解决了人工计数多带来的效率慢、错误率高等各种问题,提高的企业生产上的效率。当然要是实现基于单片机的纸张计数器,也是需要一定的理论知识基础和克服一些问题的。首先是单片机的知识,由于之前从未接触过单片机的相关理论知识,所以需要花费一定的时间精力学习相关知识。纸张计数器的需要研究重点是通过测量纸张的什么数据来计算纸张的数量。纸张的数据是如何存储和显示的。编写什么样的程序来实现所测量的纸张的数据转换成最终的纸张张数并显示在数码上的。设计什么样测量装置能够保证一定的测量数据的稳定性。第2章系统方案设计2.1系统设计要求(1)极板A和极板B上的金属电极部分均为边长50mm±1mm的正方形,导线a和导线b长度均为500mm±5mm。测量显示电路应具有“自校准”功能,即正式测试前,对置于两极板间不同张数的纸张进行测量,以获取测量校准信息;(2)测量显示电路可自检并报告极板A和极板B电极之间是否短路;(3)测量置于两极板之间1~10张不等的给定纸张数。每次在极板间放入被测纸张并固定后,一键启动测量,显示被测纸张数并发出一声蜂鸣。每次测量从按下同一测量启动键到发出蜂鸣的时间不得超过5秒钟,在此期间对测量装置不得有任何人工干预;

(4)极板、导线均不变,测量置于两极板之间15~30张不等的给定纸张数。对测量启动键、显示蜂鸣、测量时间、不得人工干预等有关要求同“基本要求(3)”;(5)极板、导线均不变,测量置于两极板之间30张以上的给定纸张数。对测量启动键、显示蜂鸣、测量时间、不得人工干预等有关要求同“基本要求(3)”;(6)系统具有显示、清零功能。2.2系统模块设计思路通过系统设计的要求的分析思考,将本系统大致分成控制模块、测量模块、存储模块、显示模块、报警模块以及电源模块。2.2.1控制模块控制模块是整个系统的核心,它起着系统各个模块的之间的协调控制以及数据的运算等作用。2.2.2测量模块测量模块是纸张的某些信息,如纸张的电容、以及电容引起的其他的装置的变化的测量。2.2.3存储模块存储模块的作用是在校准的时候将纸张的信息存储起来,到测量纸张的数量的时候,控制模块则负责将存储的信息取出来。2.2.4显示模块显示模块的作用就是负责显示纸张测量来的信息数据,如纸张的数量等。2.2.5报警模块该模块的作用就是当系统发生短路情况的时候,该模块报警,防止烧毁整个系统。2.2.6电源模块电源模块的作用为系统各个模块提供必要的能源,使得每个模块都能够正常的工作。2.3系统设计的整体结构框图 图2-1系统总体框图2.4方案的论证与比较通过对各个模块的设计方案进行论证比较,选出适合本系统的各种元器件和组装方案。2.4.1控制模块的设计方案论证选择根据设计要求,控制部分主要有用于对测量纸张的的数据进行存储计算显示、控制报警系统等。方案一:采用FPGA作为控制系统FPGA是现场可编辑逻辑器件,由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。加电后,FPGA芯片将EPROM中数据读入片知内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻道辑关系消失。因此,FPGA可以反复使用,并且通过不同的编程数据能够实现不同的电路功能,使用灵活[3]。方案二:使用单片机 单片机是单片机未向计算机的简称。它是将计算机中的微处理器、只读存储器、随机存储器、I/O接口、串行接口、中断系统、定时器/计数器等基本功能模块集成到一块芯片上构成的小而完善的计算机系统。因此省去了诸多外部独立元件。单片机本身拥有稳定性强、精确度高、抗干扰能力强、外部扩展能力强等特点。并且单片机支持C语言编程控制,通过编写C语言以及调用其库函数能够简便实现很多复杂的功能[1]。综上,考虑到单片机的易用性以及对FPGA的相关知识不熟悉,最终使用单片机作为本系统的控制部分。2.4.2显示模块的设计方案论证选择方案一:液晶显示LCD1602液晶显示器是广泛使用的一种字符性液晶显示模块,具有体积小、功耗低等优点,他是一种专门显示字母、数字、符号等的点阵型液晶模块。方案二:数码管显示数码管是通过单片机的I/O端口驱动数码管各个段码,点亮不同的段码从而形成字符显示我们所需要的数字。其具有:低能耗、寿命长、对顽疾我环境要求低、易于维护,同时其精度高,操作简单,数码管采用BCD编码显示数字和代码,程序的编写容易,资源占用较少。由于本系统所需要显示的内容信息种类并不多,相比LCD1062的控制程序的繁琐和复杂,数码管的程序更为简洁,所以系统最终采用了4位数码管作为最终显示模块。2.4.3测量模块的设计方案论证选择方案一:fdc2214电容式传感器fdc2214一个电容检测传感器,其原理时是基于LC谐振电路,即将芯片的每一个检测通道的输入端都连上一个电感和一个电容。而被测的电容传感端LC谐振的电路连接在一起,将产生一个谐振的频率,通过频率我们可以计算出被测的电容值[4]。但是芯片使用较为复杂,并且成本较贵。方案二:555定时器搭建多谐振荡电路利用555定时器搭建一个多谐振荡电路,该电路可以通过不同纸张影响使其发射出不同频率的脉冲信号,利用这一点,可以判断纸张的相关信息。555定时器搭建电路简单、使用方便,且成本便宜,稳定性高。综上,我们选择性价比更高的方案二。2.4.4测量机械结构的设计方案论证选择该部分可以说时本系统灵魂部分,它本实其实和电路方面的关系不大,但是其直接关系到了测量纸张的电容的准确性。而电容的特性大家都知道,面积、间距、介质等都会对测量值的准确性造成一定影响。这个在实际测量中反应出来是什么状况,例如:如果两块极板对得不齐,一会正一会斜,那么测量出来的数据肯定时不准确的。那么如何去固定板子,就是一个问题。如何让其固定并且保持两块板子对应的面积不变,并且又可以塞入纸张?为此查阅了相关资料,并且得到了一些答案。方案一:通过升降式的方式对板子进行控制,如图2-2:图2-2升降舵机式结构虽然这种方式能够基本保证的两块板子100%对齐,但是该装置的设备设计非常复杂,并且实验的条件十分有限,这种机械加工对应电子专业的学生来说有点爱莫能助。方案二:通过木板整齐的切面来保证两个极板对齐:如图2-3:图2-3切面固定结果虽然这种办法没有办法方法1中那样高度精确,但是,其却大大增加了机械机构制造的可行性,是一种不错的替代方法,在此基础上,我搭建出了一个类似的测量机械结构。2.4.5软件编程语言的选取方案论证选择方案一:汇编语言汇编语言时一种面向CPU指令的程序设计语言,它采用指令助记符来表示操作码和操作数,用符号地址表示操作数地址。用汇编语言编写的程序能够直接利用硬件系统的特性,直接对位、字节、字寄存器、存储单元、I/O端口等进行处理,通过也能直接使用CPU指令系统和指令系统提供各种寻址方式编制出高质量的程序,程序占用内存空间少,执行速度快[5]。但是特定的汇编语言和特定的机器语言指令集是相对应的,不同平台之间不可直接移植,其可读性很差,初学者调试和排错非常困难。方案二:C语言C语言是一种编译型程序设计语言,其兼顾了多种语言的特点。C语言有功能丰富的库函数、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。使用C语言编写控制程序,可以缩短编写周期,增加代码可读性,便于改进和扩充。综上,以及对C语言更为了解的情况下,本系统中使用C语言作为控制语言。第3章系统硬件设计3.1系统主要元器件介绍该部分内容针对系统使用的主要元器件进行介绍。3.1.1单片机本系统选取的单片机是是stc公司生产的一种低功耗、高性能的以MCS-51为核心的芯片STC89C52RC单片机。单片机的引脚图如图3-1:图3-1单片机引脚图VCC(40引脚):电源电压VSS(20引脚):接地P0端口(P0.0-P0.7,39-32引脚):P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0口接受指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。P1端口(P1.0-P1.7,1-8引脚):P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作为输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。Flash编程和程序校验期间,P1接受低8位地址。P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作为输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位四肢的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据,在访问8位地址的外部数据存储器(例如执行MOVX@RI指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中R2寄存器的内容),在整个访问期间不改变。Flash编程和程序校验时,P2也接收高位地址和其他控制信号。P3口:P3是一个带有内部上拉电阻的8位双向I/O口,P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作为输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是,每当访问外部数据存储器时将跳过一个ALE脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令ALE才会被激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。PSEN:程序存储允许输出是外部程序存储器的读选通型号,当89C51由外部存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,这两次有效的PSEN信号不出现。EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12v的编程允许电源Vpp,当然这必须是该器件使用12v编程电压Vpp。XTAL1:振荡器反相放大器及内部时钟发生器的输入端。XTAL2:振荡器反相放大器的输出端。89C51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器,振荡电路参见图5。外接石英晶体或陶瓷谐振器及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。对电容C1、C2虽没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程度及温度稳定性,如果使用石英晶体,我们推荐电容使用30Pf±10Pf,而如使用陶瓷谐振器建议选择40Pf±10Pf。用户也可以采用外部时钟。这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端XTAL2则悬空。掉电模式:在掉电模式下,振荡器停止工作,进入掉电模式的指令是最后一条被执行的指令,片内RAM和特殊功能寄存器的内容在终止掉电模式前被冻结。推出掉电模式的唯一方法是硬件复位,复位后将重新定义全部特殊功能寄存器但不改变RAM中的内容,在Vcc恢复到正常工作电平前,复位应无效,且必须保持一定时间以使振荡器重启动并稳定工作。89C51的程序存储器阵列是采用字节写入方式编程的,每次写入一个字符,要对整个芯片的EPROM程序存储器写入一个非空字节,必须使用片擦除的方法将整个存储器的内容清楚[6]。3.1.23线-8线译码器译码器的逻辑功能是将每个输入的二进制代码译成对应的输出高电、低电平信号或另外一个代码。系统中使用的译码器是一种二进制译码器,其输入的3位二进制代码共用8种状态,译码器将每个注入代码译成对应的以根输出线上的高、低电平信号。因此,也将这个译码器称为3线-8线译码器。在本系统种,我们使用3线-8线译码器来分别控制2个4位数码管分别显示各个位的数字,达到动态显示的效果。图3-2译码器引脚图3.1.3数码管数码管是一种半导体发光器件,器基本单元是发光二极管,本系统中采用的是共阴极四位数码管,能够动态显示4位数。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极的数码管。共阴数码管在应用时应将公共极接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。数码管动态驱动方式将所有数码管的8个显示划“a,b,c,d,e,f,g,dp“的同名端连在一起,另外为每个数码管的公共极COM增加增加选通控制电路,位选通有各自独立的I/O线控制,显示数据时,通过单片机对数码管各个位分时轮流控制,达到显示多位数据的效果。这就是动态驱动。动态显示的效果和静态显示时一样的,能够节省大量的I/O端口,而且功耗更低。而本系统所采用的驱动方式就是动态显示。以下为4位共阴极数码管引脚图:图3-3数码管引脚图3.1.4AT24C02芯片AT24C02是低电压的2k串行电可擦除只读存储器,内部组织为128个字节,每个字节8位,该芯片被广泛应用于低电压及低功耗的工商业领域。在本系统中,用来存储测量的数据。其引脚图如下:图3-4AT24C02引脚图引脚说明:串行时钟信号(SCL):在SCL输入时钟信号的上升沿将数据送入EEPROM器件,并在时钟的下降沿将数据读出。循环性数据输入/输出引脚(SDA):SDA引脚可实现双向串行数据传输。该引脚为开漏输出,可以其他多个开漏输出器件或开集电极器件线或连接。器件/页地址(A2,A1,A0):A2、A1、A0引脚为AT24C02的硬件连接的器件地址输入引脚。AT24C02在一个总线上最多可寻址八个2k器件,A2、A1和A0内部必须连接。写保护(WP)引脚:AT24C02具有用于硬件数据写保护功能的引脚。当该引脚接GND时,允许正常的读/写操作。当该引脚接VCC时,芯片启动写保护功能[7]。3.1.5蜂鸣器在本系统种采用的是有源蜂鸣器。有源蜂鸣器是一种一体结构化的电子讯响器,采用直流电压供电,蜂鸣器如下图:图3-5蜂鸣器实物图3.1.6555定时器定时器是一种多用途的数字模拟混合集成电路,利用它能够及其方便的构成多谐振荡电路。如图3-6,为定时器的电路结构图,它是由比较器C1和C2、SR锁存器和集电极开路的放电的三极管TD三部分组成。 图3-6555定时器电路结构图1脚接地。2脚位触发输入端;3脚位输出端,输出的电平状态受触发控制,而触发器受上比较器6脚和下比较器2脚的控制。当触发器接受上比较器A1从R脚输入的高电平时,触发器被置于复位状态,3脚输出低电平:2脚和6脚是互补的,2脚只对低电平起作用,高电平对它不起作用,即电压小于1Ucc/3,此时3脚输出高电平。6脚为阈值端,只对高电平起作用,低电平对它不起作用,即输入电压大于2Vcc/3,称高触发端,3脚输出低电平,但有一个先决条件,即2脚电位必须大于1Vcc/3时才有效。3脚在高电位接近电源电压Vcc,输出电流最大可打200mA。4脚是复位端,当4脚电位小于0.4V时,不管2、6脚状态如何,输出端3脚都输出低电平。5脚是控制端。7脚称放电端,与3脚输出同步,输出电平一致,但7脚并不输出电流,所以3脚称为实高(或低)、7脚称为虚高。利用555定时器可以接成本系统中使用到的多谐振荡电路。3.2电路模块设计3.2.1控制模块电路控制模块采用的是51单片机为核心的AT89C51(其与硬件芯片STC89C52RC基本一致)作为本系统的核心模块,通过C语言编程的方式分别控制控制处理其他模块的正常运转,例如纸张数据的计算显示、报警模块等。如图3-7:图3-7单片机仿真图3.2.2测量模块电路系统的测量模块采用的时利用555定时器搭建的一个多谐振荡器,然后利用C电容充当测量极板。多谐振荡电路原理:施密特触发器有当输入信号达到某一定电压值时,输出电压会发生突变(即当输出电压逐渐升高或下降时,输出电压会跳变),并且它的电压传输特性有一个滞回区。而555定时器能很方便地接成施密特触发器,我们可以先将它接成施密特触发电路,再将其改造成多谐振荡电路。我们只要把施密特触发电路的反向输出端经RC积分电路接回到它的输入端,就构成了多谐振荡电路。因此,只要将定时器的v11和v12连接在一起接成施密特触发电路,然后再将v0经RC积分电路接回输入端得到了多谐振荡电路。如图3-8所示:图3-8用555定时器接成的多谐振荡电路为减轻门G的负载,在电容C的容量较大时不宜直接由G提供电容的充、放电电流。为此,在电路中将TD于R1接成一个反向器,它的输出V0D于V0在高、低电平状态上完全相同。将v0D经R2和C组成的积分电路接到施密特触发电路的输入端同样也能构成多谐振荡电路。根据多谐振荡电路中的知识得知,电容上的电压vc将在VT+和VT-之间往复振荡,vc和v0的波形将如图3-9所示:图3-9电路的电压波形图由图中vc的波形求得电容C的充电时间T1和放电时间T2各为:

T1= =R1+R2CIn2 (3.T2=R2CIn =R2CIn2 (3.2)由公式(3.1)和公式(3.2)可得电路的振荡周期为: T=T1+T2=R1+2R2CIn2 由公式(3.3)振荡频率为:

f=所以通过R和C的参数即可改变振荡频率[8]。通过仿真软连接如下仿真图3-10:图3-10多谢振荡电路仿真图3.2.3显示模块电路其原理是两块数码管的控制发光二极管的亮灭的引脚共同接在单片机的P0(P0.0-P0.7)端口上,以此控制数码上数字显示,当然P0端口上还应接上一块74HC245芯片,它是一种兼容TTL器件引脚的高速CMOS总线收发器,典型的CMOS型三态缓冲门电路,八路信号收发器。由于单片机或CPU的数据/地址/控制总线端口都有一定的负载能力,所以需要额外的芯片74HC245来增加驱动能力。而两个数码管的控制其位显示的引脚接分别一次接在一个38译码器上,通过单片机控制驱动译码器来分别实现两个数码管快速依次显示每一位数字,由于视觉暂留,看上去数码管好像每一位都显示着数字。以此来达到显示纸张数据的效果。通过仿真采用的时两个4位共阴极数码管对数据进行动态显示。如图3-11:图3-11数码管仿真图3.2.4报警模块电路原理是报警模块是通过一个pnp三极管驱动的蜂鸣器,当测量极板短路时,pnp三极管发射极e电压大于基极b电压0.7V以上使得三极管发射极e和集电极导通[9]。导通后蜂鸣器发出声音。报警模块仿真如图3-12:图3-12报警模块的仿真图3.2.5存储数据模块电路存储数据模块采用24C02芯片对纸张测量数据的存储与调用。在系统校准时,当测量纸张的频率和张数信息时,通过按钮触发单片机INT1中断,实现对每N张纸频率信息的存储。当测量时,放N张纸,测量出其频率信息,然后对比存储芯片中的频率信息,将相应的纸张数量调出显示在数码管上。其仿真如图3-13:图3-13存储模块仿真图3.2.6系统的总设计图图3-14系统总设计图第一部分图3-15系统总设计图第二部分

第4章 系统软件设计4.1软件设计平台在本系统中软件设计频台使用的是Keil,其是美国公司KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统。4.2软件设计思路在本系统中,我们要考虑将系统功能实现分成多个模块分别编写函数,从而协调各个模块功能最终达到控制整个系统的作用。4.2.1数码管显示函数设计系统中要显示的数据均需通过该函数控制数码管才能显示相应数据,其设计流程图如下:图4-1数码管显示设计流程图具体步骤:我们首先需知道的是GPIO_DIG就是单片机P0口,其控制着数码管每一位中8段LED灯的亮灭。而LSA、LSB、LSC代表38译码器输入端,而译码器的输出端Y0-Y7就分别控制着8位数码管的每一位显示与否。而DisplayData[i]是一个存储着数码管每一位显示的编码,而所谓的编码就控制P0口各引脚输出,达到数码管显示字符的效果。在本函数中,我们设置一个for循环,并且循环8次,因为数码管有8位,在第i次循环中,通过switch控制第i位显示,而显示的字符内容是DisplayData数组中的第i个编码控制的字符,并且延时100ms后清空P0口。通过这种方式达到动态显示相应数据内容的效果[10]。4.2.2频率存储函数设计在系统的校准阶段,通过调用该函数实现对频率的存储,其流程图如下:图4-1频率存储函数流程图具体步骤:在校准的阶段时,我们需要将每N张纸测量出的频率存储到24c02中。当频率值稳定时,按下相应按钮,触发中断1函数,在程序中,我需要设置一段延时来消除按下按钮之后回弹抖动的现象所带来的影响,并通过条件if(KeySure==0)判断是否真的按下去了,当满足条件时,我们将测量的频率Freqs[5]写入到24c02芯片中。最后还需将第N次校准的N的值传入显示的编码数组,交给显示函数控制数码管显示N数字,表示第几次校准,其代码如下:At24c02Write(NumOfPos,Freqs[5]/255);NumOfPos++;At24c02Write(NumOfPos,Freqs[5]%255);NumOfPos++;DisplayData[6]=smg[(NumOfPos/2-1)/10];DisplayData[7]=smg[(NumOfPos/2-1)%10];其中由于24c02每个地址位只能存储一个字节,而频率值是int类型,为2字节,所以需要将频率值分成高低8位分别存储到两个地址位中。NumOfPos代表地址位位置,所以第N次校准数字N可以表示为NumOfPos/2-1。4.2.3纸张计算函数设计纸张的计算函数是测量时通过测量频率值来与24c02中存储的频率值做对比,并最终计算出纸张数量并返回。其流程图如下:图4-3纸张计算流程图具体步骤:传入频率值后,将频率值与24C02中的频率值做出对比并进行计算,我们不断依次取出三个相邻的频率值N-1、N、N+1张纸频率分别为freq1、freq2、freq3,直到第i次循环后,N张纸的频率在区间[freq2-(freq2-freq1)*0.4,freq2+(freq3–freq2)*0.6]内,纸张的数量就可以判定为i/2,并返回纸张数量。其代码思路如下:for(i=2;i<MAXNUM-3;i+=2){if((freq2-(0.4)*(freq2-freq1)<=freq)&&(freq<freq2+(0.6)*(freq3-freq2))){PaperNum=i/2;returnPaperNum; }}其中i=2是因为,24c02在初始化时提前将0特殊值存储在地址位的前2位。MAXNUM代表是24c02地址位最大使用数量,而MAXNUM-3是为了预留空间,防止存储内容超额。4.2.4外部中断0函数在本中断中,实现纸张数量的显示,并且蜂鸣器需要发声。其流程图如下:图4-4外部中断0函数具体步骤:当按下测量按钮时,触发该中断,程序中也需要延时消抖再判断操作,当真的按下后,通过调用纸张计算函数获得纸张数量,并将该数字各位调用相应的编码传入显示编码数组中,通过数码管显示函数进行显示:Num=FigurePaper(Freqs[5]);DisplayData[6]=smg[Num/10]; DisplayData[7]=smg[Num%10]; smg是存储着共阴极数码管0-9字符对应的字符编码数组,为全局变量。最后蜂鸣器发出响声:bee=0;delay(500);bee=1;delay(10);4.2.5定时器/计数器0中断函数该函数中主要处理的是利用定时器定时规定时间,而计数器记录多谐振荡器发出脉冲的个数。通过此,可以最终实现频率的计算。其流程图如:图4-5定时器/计数器0中断流程图 具体步骤:在本函数之中,我们通过先将定时器定时为50ms。这里使用16位的定时器,那单片机定时器0的最大计数就是65536。单片机晶振为12M,那单片机的一个机器周期就是1us,定时器0工作在方式1时最大定时65536us。则其定时器的定时时间为T=(65536-X)us,所以初值为X=(65536-T)us,则初值为X=65536-50000=15536,转化成16进制为0x3CB0,所以有: TH0=0x3C TL0=0xB0而timeCount是一个全局变量,负责记录定时器0中断执行的次数,由于每次中断定时50ms,所以当TimeCount为20时,定时器计数器关闭,就可以定时1s,此时,计数器中就记录了1s内脉冲数量。其代码思路如:TimeCount++; if(TimeCount==20){TimeCount=0;TR1=0;TR0=0;}4.2.6主函数设计系统中主函数是程序开始执行的地方,本函数是通过协调调用各个函数功能达到实现系统总的功能,其设计流程图如下:图4-6软件设计流程图第一步:启动装置,程序进行初始化。第二步:接收并计算多谐振荡器发出的频率。如何计算频率,通过定时器/计数器0中断函数中实现的计数器在1s之内所记录的脉冲数量,检测到定时器结束后,取计数器中的脉冲数。定时器分为高八位和低八位,所以高八位的数据需要乘以256对数据进行恢复。最后得到瞬时频率Freq:Freq=Freq+TL1;Freq=Freq+(TH1*256);将Freq[4]存储的瞬时频率值往前传,实现频率的不断更新:Freqs[0]=Freqs[1];…Freqs[3]=Freqs[4];Freqs[4]=Freq;将数组中保存的5个频率数据进行加权平均,得到频率的稳定值后将该值再次存储到频率数组Freqs中:Freqs[5]=Freqs[0]*0.1+Freqs[1]*0.1+Freqs[2]*0.2+Freqs[3]*0.3+Freqs[4]*0.3;第三步:判断频率Freqs[5]是否为0,如果是0,蜂鸣器报警:bee=~bee。如果不是,我们将Freqs[5]的值的每一位数字其对应的编码传给显示的编码数组DisplayData,如下:DisplayData[0]=smg[Freqs[5]%100000000/1000000];DisplayData[1]=smg[Freqs[5]%10000000/1000000];…DisplayData[7]=smg[Freqs[5]%10];再将数组交给数码管显示函数进行显示。第四步:进行校准时,按下按钮触发中断1,执行频率存储函数将测量的频率值写入24c02中。第五步:进行测量工作时,按下按钮触发中断0函数,执行纸张计算和显示功能,并进行下一次测量。第5章系统的调试结果5.1系统仿真的调试结果5.1.1多谐振荡器波形调试结果图5-1多谐振荡波形图如图,我们尝试了555定时器搭建的多谐振荡器是否能够发出波形脉冲,通过示波器,我们可以看到波形图,说明多谐振荡器搭建成功。5.1.2数码管显示调试结果图5-2数码管显示在仿真电路时,我们将测量极板模拟成一个电容,并且在数码管上看到了其显示的频率值。说明仿真电路问题不大。5.2系统硬件的调试结果通过系统设计要求中的条目对纸张计数器的功能进行相应的测试。5.2.1测试环境测试的实验环境在室内进行,其温度约为25摄氏度左右。如图:图5-3测试环境其中测量结构的两个极板为边长10cm的铜板,连接极板的两条导线长约50cm左右,基本符合系统设计要求(1)中的规定。5.2.2测试校准校准是在正式测量前获取纸张的校准信息。(1)校准1张纸信息图5-4校准1张纸如图5-4所示,在极板间放1张纸,按下校准按钮,可以看到数码管显示1,说明将1张纸信息存储到了24c02芯片中。(2)校准2张纸信息图5-5校准2张纸如图5-5所示,在极板间放2张纸,按下校准按钮,可以看到数码管显示2,说明将2张纸信息存储到了24c02芯片中。通过不断重复以上校准动作,可以实现系统对每N张纸校准信息的收集,最后在测量时才能有正确的数据做对比。而此功能也基本符合系统设计(6)要求中的校准。5.2.3测量纸张数量本测试是基于系统设计要求中的(3)、(4)、(5)就纸张在0~10、15~30以及30以上张数的纸进行抽取测试。(1)5张纸的测量结果图5-65张纸显示频率在放入5张纸在极板上,使用重物固定后,可以看到如图5-6中数码管显示的结果,其频率显示为3761。然后此时按下测量按钮,如图5-7:图5-75张纸测量结果图5-7中数码管显示了测量纸张的张数5,并且蜂鸣器发出声响。通过本次测试,可得系统基本满足设计要求(3)中0~10张给定纸张数量。(2)15张纸的测量结果图5-815张纸显示频率在放入15张纸在极板上,使用重物固定后,可以看到如图5-8中数码管显示的结果,其频率显示为6703。然后此时按下测量按钮,如图5-9:图5-915张纸测量结果图5-9中数码管显示了测量纸张的张数15,并且蜂鸣器发出声响。(3)22张纸的测量结果图5-1022张纸显示频率在放入22张纸在极板上,使用重物固定后,可以看到如图5-10中数码管显示的结果,其频率显示为8015。然后此时按下测量按钮,如图5-11:图5-1122张纸测量结果图5-11中数码管显示了测量纸张的张数22,并且蜂鸣器发出声响。通过以上两次测试结果可得系统基本满足设计要求(4)中15~30给定的纸张数量。(3)31张纸的测量结果图5-1231张纸显示频率在放入31张纸在极板上,使用重物固定后,可以看到如图5-12中数码管显示的结果,其频率显示为9380。然后此时按下测量按钮,如图5-13:图5-1331张纸测量结果图5-13中数码管显示了测量纸张的张数31,并且蜂鸣器发出声响。通过本次测试结果可得系统基本满足设计要求(5)中30张以上的给定纸张数。5.2.4极板短路报警测试图5-14极板短路图当两个极板合在一起形成短路的时候,数码管上显示“ERROR”的字样,并且蜂鸣器不断发出警报声响。通过本次测试可以确定系统基本满足设计要求(2)中的报警功能。第6章结论6.1毕设的总结通过长时间的毕业设计的制作,最终基本完成了毕业设计的系统,系统的功能以及指标等基本达到了了课题要求。系统的创新点和作用:在一定范围内,本通能够准确快速测量出纸张的数量,该系统不仅能够充分替代人力实现对纸张的计数,提高效率,而且能够根据不同的纸张类型进行校准,进而达到测量多种纸张的功能。本系统的制作成本不高,在一定程度上可以节省企业的成本。系统存在的一些问题:首先是本系统测量纸张的机械结构问题,由于受到实验条件及工艺的影响。机械结构的不太完善,导致了系统的检测功能的稳定性不太好,受外接环境以及纸张差异的影响较为大,因此需要一定严格的实验环境。其次是单片机的性能问题,由于在设计代码时,没有考虑到单片机的性能有限,导致代码的总体量比较冗余,从而使单片机处理的时间较为缓慢,当然相对于人力计数,确实效率提高不少,但是如果可以更换新能更加强大的单片机芯片和设计更好测量机械结构,纸张计数器的运算速率和准确性将会得到更大的提高。6.2收获及感悟毕业设计作为我们大学生活的最后一个环节,是对大学四年的学习知识以及学习能力的综合的运用和考核。同时也是个人学习能力再一次提升和知识的再一次丰富。大学的毕业设计决定着该大学教育的综合水平,所以说大学也是对本环节及其的重视,通过也为每个学生提供了很多的毕业设计上的指导。可见学校对学生的重视程度。当然,毕业设计的整个过程使充满了困难与挑战。在分析本次选到的课题时,就发现了诸多难题,首先是单片机的使用以及选择。因为大学的期间并没有接触到单片机的相关课课程,还有就是对以前所学知识的遗忘。所以不仅需要阅读学习大量新的文献资料看大量学生课程,还要回顾温习以前学习过的文献资料。当然对于本人来说这些问题其实不是问题,因为一个合格的大学生因该拥有了一定的自学能力。在学习完相关的知识后,我们就需要投入到真正的毕业设计当中了。首先是仿真电路的设计和程序的设计。通过查阅资料和不断尝试相关的电路和修改代码,最终,完成了整个电路的设计图。然后是元件的选择和实物的组装焊接,在组装实物过程中,通过元件参数的不断测试和更换,基本完成了实物的组装,但是最棘手的问题出现在了自己的面前,那就是测量机械结构的搭建,该机构直接关系到测量的纸张数据的准确性。所以我在这里放缓了步伐,然后通过老师的帮助以及在网上查阅相关示例的一些参考后,我最终搭建出来了一个相对较好机械结构。虽然也有一些瑕疵,但是这是通过自己搭建出来的,这就是对自己能力的一种肯定。总的来说,本次毕业设计虽然困难重重,但是也收获满满,首先就是学生的独立思考的能力,当我们遇到新的难点时候,应该学会通过自己的能力解决它,而不是张口就问,因为问题的独立思考不仅有助于对知识理解程度加深,还能培养个人迎难而上的精神。当然,老师等他人的意见也很重要,因为其可以给我们指定相对较好的方向去努力,这样可能会使我们的工作效率得到提升,做起事来事半功倍。本次毕业设计通过理论和实际相结合,不仅是课堂上所学相关知识的综合运用,还引导了学生去了解社会上实际生产上的知识内容。这样理论实践相结合的方式为将来自己走向社会奠定了基础。 参考文献[1]陈章龙.嵌入式系统[M].北京航空航天大学出版社.2002:1-2.[2]陈勇.单片机原理与应用[M].高等教育出版社.2010:2-4.[3]华清远见.FPGA应用开发入门和经典实例[M].人民邮电出版社.2008:1-2.[4]马其才.纸张计数器显示装置设计[J].中国科技信息.2019,第21期:1.[5]杨立.微型计算机原理与接口技术[M].第二版.中国铁道出版社.2006:79.[6]Atml.instructions for AT89C52 of Atmel Corporation[M].AtmelCorporatio.2000:3-6.[7]联拓辉电子.二线制串行EEPROM-AT24C02[M].联拓辉电子.2002:1-8.[8]阎石.数字电子技术基础[M].第六版.高等教育出版社.2006:375-380.[9]杨拴科.模拟电子技术基础[M].高等教育出版社.2003:31-34.[10]彭伟.单片机C语言程序设计实训100例[M].电子工业出版社.2010:7-8.致谢为期几个月的毕业设计即将进入尾声,首先我对整个毕业设计过程中帮助过我的老师、同学以及网上学习博客、视频的作者致以最衷心的感谢。虽然受到疫情的影响,不能到学校开展毕业设计。但是这也并没有使我的毕业设计进度受到太大的影响。这一切很大部分都要归功于导师们的在线监督和指导,以及大学同学的帮助,使得我的毕业设计顺利进行。大学即将结束,感谢大学四年来老师、教授们对我们传授知识,感谢大学四年来陪伴我的室友同学。附录附录1AT24C02芯片封装函数 #include"i2c.h" voidDelay10us(void)//误差0us { unsignedchara,b; for(b=1;b>0;b--) for(a=2;a>0;a--); } voidI2cStart() { SDA=1; Delay10us(); SCL=1; Delay10us(); SDA=0; Delay10us(); SCL=0; Delay10us(); } voidI2cStop() { SDA=0; Delay10us(); SCL=1; Delay10us(); SDA=1; Delay10us(); } unsignedcharI2cSendByte(unsignedchardat) { unsignedchara=0,b; for(a=0;a<8;a++) { SDA=dat>>7; dat=dat<<1; Delay10us(); SCL=1; Delay10us(); SCL=0; Delay10us(); } SDA=1; Delay10us(); SCL=1; while(SDA) { b++; if(b>200) { SCL=0; Delay10us(); return0; } } SCL=0; Delay10us(); return1; } unsignedcharI2cReadByte() { unsignedchara=0,dat=0; SDA=1; Delay10us(); for(a=0;a<8;a++) { SCL=1; Delay10us(); dat<<=1; dat|=SDA; Delay10us(); SCL=0; Delay10us(); } returndat; } voidAt24c02Write(unsignedcharaddr,unsignedchardat) { I2cStart(); I2cSendByte(0xa0); I2cSendByte(addr); I2cSendByte(dat); I2cStop(); } unsignedcharAt24c02Read(unsignedcharaddr) { unsignedcharnum; I2cStart(); I2cSendByte(0xa0); I2cSendByte(addr); I2cStart(); I2cSendByte(0xa1); num=I2cReadByte(); I2cStop(); returnnum; }附录2系统完整的程序代码#include"reg52.h"#include"i2c.h"typedefunsignedcharu8;//u8替代unsignedchartypedefunsignedintu16;u8codesmg[16]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79};//数码管共阴极编码#defineGPIO_DIGP0#defineMAXNUM80unsignedlongTimeCount;u16Freqs[6]={0};//装频率的数组u16NumOfPos=0;//计数起始位charNum=0;//当前纸张数量u8DisplayData[8];u16Freq=0;sbitLSA=P2^2;sbitLSB=P2^3;sbitLSC=P2^4;sbitKeyAddNum=P3^2;//定义按键 外部中断0sbitKeySure=P3^3;//定义按键K4 外部中断1sbitbee=P2^7;//蜂鸣器voiddelay(u16i){while(i--);}//定时器和计数器配置voidTimer_Config(){ TMOD=0x51;//定时器0模式,工作方式1,仅用TR0打开启动 TH0=0x3C; //赋初值50ms TL0=0xB0; ET0=1;//打开定时器0中断允许 ET1=1;//打开定时器计数器1中断允许 EA=1;//打开总中断 TR0=1;//打开定时器0 TR1=1;//打开计数器1}//外部中断0&1初始化voidInt01_Config(){//设置INT0IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 //设置INT1 IT1=1;//跳变沿出发方式(下降沿) EX1=1;//打开INT1的中断允许。 PX1=1; EA=1;//总中断}voidTimer_On(){ TR0=1;//打开定时器0,定时 TR1=1;//打开定时器1,计数} voidTimer_Off(){ TR0=0;//关闭定时器0,定时 TR1=0;//关闭定时器1,计数}voidDigDisplay(){ u8i; for(i=0;i<8;i++) { switch(i) { case0:LSA=0;LSB=0;LSC=0;break; case1:LSA=1;LSB=0;LSC=0;break; case2:LSA=0;LSB=1;LSC=0;break; case3:LSA=1;LSB=1;LSC=0;break; case4:LSA=0;LSB=0;LSC=1;break; case5:LSA=1;LSB=0;LSC=1;break; case6:LSA=0;LSB=1;LSC=1;break; case7:LSA=1;LSB=1;LSC=1;break; } GPIO_DIG=DisplayData[i]; delay(100); GPIO_DIG=0x00; }}//纸张数计算函数unsignedcharFigurePaper(u16freq){ chari; intfreq1,num11,num12; intfreq2,num21,num22; intfreq3,num31,num32; unsignedcharPaperNum; for(i=2;i<MAXNUM-3;i+=2) { num11=At24c02Read(i-2); delay(1000); num12=At24c02Read(i-1); delay(1000); freq1=num11*255+num12; num21=At24c02Read(i); delay(1000); num22=At24c02Read(i+1); delay(1000); freq2=num21*255+num22; num31=At24c02Read(i+2); delay(1000); num32=At24c02Read(i+3); delay(1000); freq3=num31*255+num32; //在频率表前后点范围内查询该频率对照的纸张数量 if( (freq2-(0.4)*(freq2-freq1)<=freq) &&(freq<freq2+(0.6)*(freq3-freq2)) ) { PaperNum=i/2; returnPaperNum; } } return0;} //共阴voidmain(){ Int01_Config(); Timer_Config();//定时器0/1初始化 At24c02Write(NumOfPos,0); NumOfPos++; delay(2000); At24c02Write(NumOfPos,0); NumOfPos++; delay(2000); while(1) { if(TR1==0)//定时到达200ms,计数器关闭 { Freq=Freq+TL1; Freq=Freq+(TH1*256); Freqs[0]=Freqs[1]; Freqs[1]=Freqs[2]; Freqs[2]=Freqs[3]; Freqs[3]=Freqs[4]; Freqs[4]=Freq; Freqs[5]=F

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论