版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录摘要 iAbstract ii1.前言 11.1智能电表的概念 11.2智能电表的发展背景 12设计总体方案论证 22.1单片机的方案选择 22.2数字时钟方案 32.3电能检测方案 42.4显示电路的选择 62.5电源电路的选择 72.6基于单片机的智能电表的设计系统方案 83系统硬件设计 103.1单片机设计方案 103.2时钟日历芯片设计 153.3电能检测系统的设计 173.4LCD显示电路 183.5键盘控制系统的设计 193.6继电器电路 203.7电源电路 204系统软件设计 214.1AltiumDesigner10软件 214.2编程软件keil 214.2.1主程序设计 224.2.2键盘扫描程序 244.2.3LCD1602显示子程序 254.3protues软件 25总结 27参考文献 40.前言1.1智能电表的概念智能电表它是科技时代的新产物,它能够进行测量、数据处理,因此测量单元、数据处理单元是它的重要组成部分。在智能电表这一系统中,它能通过各类型的芯片来进行电能的测量、计算、存储,并且具有实时监控功能和自动控制等功能。和传统的电能表相比。计量功能是智能电表的最基本的功能,而它本身就是一个电子式的电表,并且它能够通过端口与外部时钟进行通讯。微处理器(微控制器)是智能电表的最重要的核心设备。没有它,智能电表不能存储,分析,判断和处理大量的测量数据。智能仪表通常具有自动地检测数据,数据转换和自动调零功能,以及通过操作面板进行显示数据的功能。本次设计的智能电表主要运用了微机和通信等两方面的技术,为了减少能耗,把采集数据和处理数据等功能运用芯片进行,这样既可以节省了成本以及人力资源,还可以增加其工作的效率,可以满足了现代的用电户的需求。1.2智能电表的发展背景电表诞生于1880年,最早的电表是以电磁感应为基本原理制造而成。为了满足工业化和电源管理发展的需要,电子仪表已经出现。基于感应原始电子仪表仍然具有测量的功能,但所述盘的旋转成为一个电脉冲;其次是基于乘数原理的电子式电能表,数字倍增器电子仪表具有扩展功能,适用于自动化系统集成等特点,已成为当今电表的主要发展方向。目前,智能电表主要分为电感式,电子式和智能型等几种类型,我国生产的电能表不仅可以满足地区和国家的市场需求,而且我们还有有价格优势。因此,中国的电能表在世界各个市场都具有良好的竞争水平。随着中国电网的不断智能化,我们对电表等电能计量装置的要求也在不断提高。中国的电网技术与国外的相关科技差别不大。同时,它还是低碳经济,可持续发展道路的重要的部分,因此其发展前景相当乐观。与国外同类产品相比,中国智能电表具有完善,规范,分类单价和控制负荷的功能,均高于其他国家。它更能满足中国现代智能电网建设的需要。目前,中国的用户数量非常庞大。根据2009年的统计数据,截至年底,国家电网公司的服务系统已录得2.3亿户家庭。根据每户4户的平均数,有人口10.4亿,在全国推广智能电表并非易事。它不仅需要巨额资金,而且需要大量的人力,物力和长时间的执行。同时,智能电表的功能多样化,显示的数据类型很多,用户可以准备更多的电力服务,但更换电表也需要得到用户的同意,理解和包容,所以用户还必须对一对智能电表有一定的了解,所以我们必须调动各行各业的力量生命有效地宣传这一点。由于国家电网公司发布了一系列的计划,智能电网改革,电表和智能,自动化产业的发展面临着前所未有的发展前景。智能电表是智能电网的智能终端。它不是传统意义上的功率计。除了传统的电能表的基本计量的功能,智能电表还具有双向数据通信功能,并且有防偷电功能等,以适应使用智能电网的发展趋势。本文的主要任务是系统的硬件电路设计和软件的设计。硬件电路采用模块化设计,包括接口电路、用电量检测电路、继电器驱动电路、LCD显示电路等,详细介绍了各单元的工作原理;系统软件采用C语言编制,给出了具体的程序流程图。系统具有电量信息显示、掉电记忆、定时供停电、继电器智能开关控制、防干扰等功能。2设计总体方案论证本多功能智能电表可分为以下几个模块电路组成:单片机模块,时钟模块,电能检测模块,液晶显示模块和电源模块等。2.1单片机的方案选择在嵌入式领域中有多种微处理器可以选择,比如FPGA、DSP、单片机、ARM等,在这些处理器中单片机的价格最低,性能适中,适合此类场合。下面介绍一些常见类型的微控制器:方案一:51系列单片机。51单片机是对所有兼容Intel8031\t"/item/51%E5%8D%95%E7%89%87%E6%9C%BA/_blank"指令系统的\t"/item/51%E5%8D%95%E7%89%87%E6%9C%BA/_blank"单片机的统称,其代表型号是\t"/item/51%E5%8D%95%E7%89%87%E6%9C%BA/_blank"ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。方案二:MSP430MSP430系列是一个16位、具有精简指令集、超低功耗的混合型单片机,由于它具有极低的功耗、丰富的片内外设和方便灵活的开发手段,已成为众多单片机系列中一颗耀眼的新星。片上集成了AD、DA、PWM、LCD驱动,其比较器AD采样方式能达到很高的精度,开发系统也很便宜。缺点是在位操作时有点麻烦,不适合用于逻辑控制以及对功耗不敏感的使用场合。从成本、开发的难易程度考虑,使用STC89C52单片机。它是一种低功率,高性能CMOS8位微控制器具有8K可编程闪存,与80C51产品说明书和销,闪光的8K字节,256个字节RAM,32位I/O端口线,看门狗定时器,2数据完全兼容指针,3个16位的定时器/计数器,16-载体2级中断结构,全双工串行端口和时钟电路。2.2数字时钟方案数字时钟是本设计的最重要的部分,有两种方案可以选择。方案一:本方案采用Dallas公司的专用时钟芯片DS1302。低功耗,高性能实时时钟芯片,具有31字节静态RAM,使用SPI三线接口与微控制器同步通信,并能够以突发模式传输多个字节的时钟和RAM数据一时间实时时钟可以提供年,月,日,周,小时,秒,每月可自动调整不到31天,并具有闰年补偿。工作电压为2.5~5.5V。它由双电源供电(主电源和备用电源),或者可以使用备用电源进行设置,该备用电源能够以精细电流为备用电源充电。它确保时钟在意外情况下仍能正常工作,例如电源电压不足或突然断电。当电源电压不足或突然断电时,系统会自动切换到外部备用电池供电系统。即使系统未通电,备用电池也可以在程序未执行时确保芯片的正常运行,并且可以随时提供正确的时间。方案二:本方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。使用定时中断与软件结合来实现1秒定时中断,每产生一次中断,存储器内对应的秒值加1;当秒值达到60,则将其清零,并将相应的分值加1;若分值达到60,则清零分字节,并将时字节值加1;当时值达到24,则将十字节清零。这种方案具有硬件电路简单的特点。然而,每次执行程序时,定时器都要重新赋初值,所以该时钟精度较低。而且,因为是软件来实现时钟,当单片机断电时,程序将不再执行,时钟也会停止工作。基于本设计精度的考虑,这里采用方案一完成数字时钟的功能。2.3电能检测方案电能检测的工作原理为:由分压器完成电压取样,由取样电阻完成电流取样,取样后的电机交换的通道以及外围的电路组成。信号的输入输出通道主要能够让模拟信号以及数字信号通过,从而与外部进行数据交换,输入输出通道主要包括传感器元器件、数模转换器、调理信号电路部分以及模数转换器。微处理器和它的外围电路这部分主要是用来储存数据和程序的,并且在单片机里面能够对数据进行一定的运算和处理,这部分主要由数据寄存器和程序寄存器以及输入输出端口电路的部分组成的。人机交换的通道顾名思义就是人与机器进行互相交流的重要通道,它通常包括键盘部分、数码拨盘部分、打印机部分、显示部分等部分构成的。标准的通讯接口很明显就是用来与计算机进行交流的端口,这些端口方便计算机对被控器件进行有效的控制。在智能电表中,监测程序和端口管理程序这两部分就构成了其软件部分。其中接口管理程序主要是面向通信接口,它的主要作用就是接受并且分析各种各样的程控码,主要包括各种操作方式的程控码、不同功能的程控码以及各种工作参数的程控码等等,以此同时各器件的实时工作状态以及不同测量数据的处理结果都会通过通信接口的输出仪器部分,以这种方法来响应计算机的远程控制指令。而监测程序就实现对键盘模块和显示模块进行操作,它可以设定某一按键的功能并存储相应的工作参数和运行方式,它可以通过I/O口对数据进行采样并且设定好数据的类型等参数,还可以通过相应的指令对数据寄存器中的数据和状态进行不同的分析处理,最后电压、电流信号由乘法器转换为功率信号,经V/F变换后,将脉冲信号输入单片机系统进行处理。本设计选用ADE7755制作电能检测模块,它是一种高精度的电功率测量芯片,其成本也较为便宜。2.3.1ADE7755的内部功能框图图1ADE7755的内部功能框图它由两个部分组成:模拟电路(模拟-数字转换电路、基准电路和电源电压监视电路)和数字信号处理电路。测量的电压和电流由ADC换成数字量由相位校正电路、高通滤波器、乘法器、低通滤波器、频率转换器等实现数字信号处理以方便计量。
2.3.2ADE7755线路连接图ADE7755线路连接图如图2图2ADE7755线路连接图此电路主要由ADE7755芯片、电流互感器、晶振等组成。大电流先从I+、I-端流入,电流互感器以1000:1的比例关系将大电流转化为小电流,从Q+、Q-端流出,再经过R11和R12两个电阻转化为可用于测量的交流电压,并经R13、C6和R17、C7组成的滤波网络滤波后送到ADE7755的测量通道V1;因为V1P、V1N端口只能允许470mV的电压通过,由V=RI得,允许最大通过电流为0.47/200=2.35mA,所以最大测量电流为2.35mA*1000=2.35A。交流大电压通过隔离变压器降为小电压,再经过由R15和R16组成的分压电路,信号衰减100倍滤波后送到ADE7755的测量通道V2;V2P和V2N端口最大允许630mV电压通过。3.58MHZ的晶振为ADE7755芯片提供稳定的工作时钟;有功功率瞬时值从引脚CF以频率方式输出,用单片机对此端口的频率进行检测可得到成线性比例关系的功率值。本电路中的CF(22脚)接到单片机的P3.4口,I+和I-接到220V交流线路上,AC端接到隔离变压器的相输出端。电流互感器在本测量作用电路中起到很重要的作用,它的性能会直接影响电表的精度和测量范围。其特性表如表1:表1特性表电流互感器额定一次电流5A相位差(0负载)<10分额定二次电流5mA常通一次电流15A比值差(0负载)±0.1%最大可测量一次电流30A比值差非线性度(0负载)<0.1%线性工作范围0—30A(负载5.1Ω)从表中可以看出,本电路中的电流互感器的精度为0.1%,可最大测量30A的电流,转换比为1000:1。2.4显示电路的选择常用的单片机显示电路被分为两类:LED显示和LCD显示:方案一:LED显示屏:是由若干个LCD显示屏组成,LCD显示屏(LEDSegmentDisplays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。如:显示一个“2”字,那么应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。方案二:LCD显示屏:分为段式LCD和点阵式LCD,对于普通的段式LCD,需要专门的驱动电路,LCD显示的可视角度较小,本身不发光;对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般采用并行接口,对微处理器的接口要求较高,占用资源多,但显示内容丰富。LCD1602液晶显示屏:也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。LCD128642LCD:带中文字库的128X64是一种4位/8位并行,2线或3线串行接口。它包含点阵液晶显示器和国家标准的一级和二级简体汉字库。模块;其显示分辨率为128×64,内置8192个16*16点汉字,128个16*8点ASCII字符集。灵活的界面模式和简单方便的操作指令,可以形成完整的中文语言。人机交互图形界面。它可以显示8×4行16×16点阵汉字。它还可以完成图形显示。低电压和低功耗是另一个显著特征。由模块组成的液晶显示方案比同类型的图形点阵液晶显示模块紧凑得多,无论硬件电路结构或显示程序如何,模块的价格略低于图形液体相同点阵的晶体模块。显示模块采用具有汉字图形显示功能的点阵液晶12864,内置汉字库使用更方便。本设计选用显示丰富灵活的LCD1602液晶显示屏作为显示模块。2.5电源电路的选择根据调整管的工作状态,我们常把稳压电源分成两类:线性稳压电源和开关稳压电源。我们通过一个表格来对比它们的优缺点,这样有利于我选择出适合该设计所需的电源电路,从而使我的设计更具有可靠性和实用性。开关稳压电源和线性稳压电源的优缺点如表2表2开关稳压电源和线性稳压电源的比较开关稳压电源线性稳压电源定义开关电源是利用现代电力电子技术,控制开关管开通和关断的时间比率,维持稳定输出电压的一种电源,开关电源一般由脉冲宽度调制(PWM)控制IC和MOSFET构成比较早使用的一类直流稳压电源优点功耗低、小型、轻量和高效率输出电压比输入电压低;反应速度快,输出纹波较小;工作产生的噪声低缺点设计复杂、维修不方便效率较低;发热量大(尤其是大功率电源)间接地给系统增加热噪声因本设计电路功耗较低,采用开关稳压电源较为合适,选用220V/5V稳压模块为单片机、显示屏和其他电路提供+5V电源。2.6基于单片机的智能电表的设计系统方案本设计选用ADE7755制作电能检测模块。时钟芯片DS1302采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力,即使在断电的情况下也能使计时准确。同时采用LCD1602液晶显示,通过软件编程可以完成更多的附加功能,对单片的利用率更高,更加能满足现代生活的需要。其中电表的时间、定时开关机时间通过键盘来进行调节。以上功能通过七个模块:电源、时钟模块、电能模块、单片机、LCD显示屏、键盘和继电器电路即可满足设计要求。本系统的电路设计方框图如图3所示,它由七部分组成:1、电源为5V直流电;2、时钟模块采用DS13023、电能检测芯片采用ADE77554、微型控制器部分芯片采用单片机STC89C52;5、显示部分采用LCD1602显示屏来显示;6、继电器电路由三极管和继电器组成;7、按键用来调节时间和定时开关机。电源模块电源模块时钟模块DS1302电源单片机STC89C52显示屏LCD1602按键继电器电路图3系统原理框图3系统硬件设计3.1单片机设计方案单片机是一个微型计算机的主要分支。其结构特征使其能够由CPU,存储器,计时器,以及各种输入/输出接口电路大规模非常集成电路芯片上集成。在其组成和功能方面,单片机是一台微型计算机。单片机的性价比非常高、集成度高、体积小、有很高的可靠性,而且具有很强的控制功能,耗能小,电压低,操作时较为安全。它外部总线增加了I2C、SPI等串行总线方式,进一步缩小了体积,简化了结构,其系统扩展、系统配置较典型、规范,容易构成各种规模的应用系统。因此,微型计算机被广泛用于智能电表,机电一体化,实时控制,分布式多处理器系统,以及人们的生活各个角落。单片机应用具有十分重要的意义,它已经从根本上改变了传统控制系统的设计思路和方法。大多数过去的必须是功能性的模拟电路或数字电路实现的功能,单片机的软件已能够全部实现。由软件代替硬件控制技术,是生产控制技术的一场革命。使用单片机的智能性,智能电表可以很容易地设计成具有智能功能的。微控制器有一个时钟振荡系统,微处理器系统利用时钟定时器/计数器功能来实现智能电表功能。然而,这种设计系统时钟误差较大时,累积误差也更大,因此它可以通过纠错软件进行修正,或添加设计高精度时钟日历芯片,以达到精确的时间。还有很多不同的微控制器功能都是兼容的,这就比较容易实现产品的多功能性。目前在单片机系统中,广泛使用8XC5X主微处理器芯片微控制器系列。该设备是标准MCS-51内核,兼容的硬件资源,种类齐全,功能完善,性能稳定,体积小,价格低,货源充足,方便调试和编程,所以应用广泛。例如,常用的STC89C52单片机如图4,具有8KB闪存可编程可擦除只读存储器(EEPROM)的低电压,高性能CMOS8位微型计算机。有32个可编程I/O引脚,2个16位定时器/计数器,6个中断源,可编程串行UART通道,可直接驱动LED输出。系统内部的闪存芯片可适于允许程序或用常规的非易失性存储器编程到程序。因此,STC89C52是一款功能强大,灵活性高和价格合理的单芯片,可在各种控制领域很容易地应用。图4图4STC89C52单片机STC89C52系列单片机的封装形式共分为DIP、PLCC及PQEP3中形式,常用的是DIP封装方式。STC89C52单片机共40个引脚,大致可分为4类:具体说明如表3表3STC89C52单片机引脚名称及功能表引脚名称功能电源引脚Vcc(40脚)电源端,+5VVss(20脚)接地端(GND)时钟电路引脚XTAL1(19脚)外部接晶振输入端XTAL2(18脚)外部接晶振输出端I/O引脚P0口(39~32脚)P0口是一组8位的漏极开路型双向I/O口,也是地址和数据的总线复用口P1口(1~8脚)P1口是一组带内部上拉电阻的8位准双向I/O口,可驱动4个TTL门电路P2口(21~28脚)P2口是一组带内部上拉电阻的8位准双向I/O口,可驱动4个TTL门电路P3口(10~17脚)P3口是一组带内部上拉电阻的8位准双向I/O口,该端口的每个引脚都有第二功能控制线引脚RST(9脚)复位端EA/VPP(31脚)片外的存储器选择端/Flash存储器编程电源ALE/PROG(30脚)地址锁存允许端/编程脉冲输入端PSEN(29脚)读片外程序存储器选通信号输入端STC89C52单片机最大的特点就是有ISP/IAP功能,它具有4K字节的EEPROM。其内部集成的EEPROM是与程序空间分开的,内部寄存器和功能描述如表4下:表4STC89C52RC、STC89LE52RC单片机内部EEPROM地址表名称地址功能描述D7D6D5D4D3D2D1D0复位值ISP_DATAE2hFlash数据寄存器11111111ISP_ADDRHE3hFlash高字节地址寄存器00000000ISP_ADDRLE4hFlash低字节地址寄存器00000000ISP_CMDE5hFlash命令模式寄存器----------MS2MS1MS0XXXXX000ISP_TRIGE6hFlash命令触发寄存器XXXXXXXXISP_CONTRE7hISP/IAP寄存器ISPENSWBSSWRST----WT2WT1WT0000XX000ISP_DATA:ISP/IAP操作时的数据寄存器。ISP/IAP从Flash读出的数据放在此处,向Flash写入的数据也需放在此处。ISP_ADDRH:ISP/IAP操作时的地址寄存器高八位。ISP_ADDRL:ISP/IAP操作时的地址寄存器低八位。ISP_CMD:ISP/IAP操作时的命令模式寄存器,须命令触发寄存器触发方可生效。命令模式如表5所示。表5ISP_CMD寄存器模式设置D7D6D5D4D3D2D1D0模式选择保留命令选择----------000待机模式,无ISP操作----------001对用户的应用程序flash区及数据flash区字节读----------010对用户的应用程序flash区及数据flash区字节编辑----------011对用户的应用程序flash区及数据flash区扇区删除程序在系统ISP程序区时可以对用户应用程序区/数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除;程序在用户应用程序区时,仅可以对数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除。STC89C51RC/RD+系列单片机出厂时已经固化有ISP引导码,并设置为上电复位进入ISP程序区,并且出厂时就已完全加密。ISP_TRIG:ISP/IAP操作时的命令触发寄存器。在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,再写入B9h,ISP/IAP命令才会生效。STC89C52RC,STC89LE52RC单片机内部可用DataFlash(EEPROM)的地址如表6所示表6STC89C52RC、STC89LE52RC单片机内部EEPROM地址表第一扇区第二扇区第三扇区第四扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2000H21FFH2200H23FFH2400H25FFH2600H27FFH第五扇区第六扇区第七扇区第八扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2800H29FFH2A00H2BFFH2C00H2DFFH2E00H2FFFH单片机最小系统主要由复位电路,晶振电路,电源等几部分组成。1.复位电路复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方式。如图5所示。图5时钟和复位电路2.晶振电路单片机系统的晶体振荡器在单片机系统中的作用是非常大的,整个部分被称为晶体振荡器,它结合了微控制器MCU的内部电路来产生所需的时钟频率,单片机振荡器的频率时钟越高,那么MCU的运行速度就更快速,单片机实现所有的指令都是基于振荡器时钟频率。在正常工作条件下,一个普通的晶振频率绝对精度可达百万分之五十。有的精度更高。晶振通常与锁相环电路一起使用,以提供所需的系统时钟频率。如果不同子系统需要不同频率的时钟信号,可以用同一个晶振相连的不同的锁相环来提供。根据技术手册:电容取30PF,晶振为11.0592MHz,如图6所示。图6晶振电路3.2时钟日历芯片设计DALLAS公司DS1302是一款高性能,低功耗实时时钟日历芯片,具有31字节静态RAM,三线接口,与CPU同步通信,以及突发模式下的多字节时钟信号和数据RAM。实时时钟提供秒,分,小时,天,周,月份和年份,每月不到31天可自动调整,并具有闰年补偿。2.5〜5.5V宽工作电压。双电源(主电源和备用电源)提供备用电源充电模式,并提供备份充电电流的功能。有双主用和备用电源引脚,由大电容备用电源(>1F)代替。需要强调的是DS1302需要使用32.768KHz晶振。DS1302引脚图参照图7。。图7DS1302芯片引脚图在编程过程中,应注意DS1302工作时序。DS1302是SPI总线驱动器方式。这不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。与DS1302的通信,首先需要了解它的控制字。DS1302的控制字如表7。表7DS1302的控制字寄存器名称765432101RAM/CKA4A3A2A1A0RD/W秒寄存器10000000/1分寄存器10000010/1小时寄存器10000100/1日寄存器10000110/1月寄存器10001000/1星期寄存器10001010/1年寄存器10001100/1写保护寄存器10001110/1慢充电寄存器10010000/1时钟突发寄存器10101110/1控制字是设定DS1302的工作方式、传送字节数等工作方式。数据的传输都是由控制字开始的。控制字每一位的含义和作用如表8:表8控制字每一位的含义和作用含义作用BIT7控制字的最高有效位,必须是逻辑1,如果它为0,则不能把数据写入到DS1302中BIT6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据BIT5至BIT1(A4-A0)用A4~A0表示,定义片内寄存器和RAM的地址定义如下:当位6位=0,该地址被定义时钟和其它寄存器。A4〜A0=0〜6,秒,分钟,小时,天,月,周,年寄存器的顺序。当A4〜A0=7,芯片写保护寄存器地址。当A4〜A0=8,选择为慢充电参数。当A4〜A0=31,突发模式时钟选择寄存器。当位6=1,地址的RAM中的定义,A4〜A0=0〜30,对应的RAM每个子地址,RAM地址31对应于所述多字节模式选择寄存器。BIT00(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位,具体电路如图8所示: 图8DS1302时钟芯片原理图3.3电能检测系统的设计电量计量电路,作用是检测IC卡智能电表的用电量。这里测量用电量的传感器选用ADE7755单相电能计量模块,它可以将用电量用模块输出多少个脉冲数来表示,如2.5-10A脉冲数是6400,也就是指示灯闪6400下就一度电。当电流是2.5A,电压是220V,用电一个小时的脉冲数计量如下:电量是220X2.5AX1小时等于0.55度电,脉冲数为:0.55X6400等于3520个脉冲数。本设计直接选用电能检测模块,其连接电路如图9所示:图9电能模块原理图3.4LCD显示电路显示电路采用1602字符型液晶,它是专门用于显示字母,数字,符号等的点矩阵液晶模块。它有几个字符点阵如5X7或5X11。1602的驱动电路具有11条指令,其可以方便地控制液晶的实际效果,如:显示清屏,左移右移,光标显示。此外,通过1602显示的字符不会改变,直到下一个指令到达时,即保持了可显示的字符,并在1602液晶占用更少的系统资源。显示电路图如图10所示:LCD1602的引脚功能可从表9查询图10显示电路原理图表9LCD1602的引脚功能引脚引脚名称引脚功能1Vss电源地2VDD+5V逻辑电源3VEE液晶显示偏压(调节显示对比度)4RS寄存器选择5R/W读/写操作选择6E使能信号7-14D0-D7数据总线,与单片机的数据总线相连,三态15BLA背光板电源,通常为+5V,串联1个可变电阻器,调节背光亮度,如接地,则无背光不易发热16BLK背光板电源地3.5键盘控制系统的设计按键需要4个,分别是:K1返回按键,从设定菜单返回上一级菜单,直至主界面;K2加数键,调整选中的数值,短按为加1,长按超过1秒为连加;K3减数键,调整选中的数值,短按为减1,长按超过1秒为连减;K4菜单键,进入设定菜单。其电路如图11所示:图11按键调时电路3.6继电器电路 继电器电路由三极管Q2、限流电阻R7和继电器组成。当单片机发出通电信号时,relay(P13)端输出低电平,三极管Q2导通,继电器得电吸合。如图12所示图12继电器电路3.7电源电路整个电路使用了两种电源,+5V电源为整个电路供电。而+3V电源仅作为DS1302的备用电源。当+5V电源被切断后,DS1302启用+3V电源,可以保持DS1302继续工作。当+5V电源恢复供电,LED依旧显示当前时间,而不会因为断电使系统复位到初始化时间,避免了重新校时的麻烦。4系统软件设计4.1AltiumDesigner10软件AltiumDesigner10是一款功能强大的电路设计软件:如图13所示图13电路设计软件利用AltiumDesigner10,完成电路的原理图设计,PCB设计。焊接好电路之后用外用表完成电路的调试。4.2编程软件keil除了必要的硬件外,MCU的开发也离不开软件。有两种方法可以将用户编写的汇编语言源程序更改为CPU可以执行的机器代码。一种是手动装配,另一种是机器装配。很少使用手动装配方法。机器组装是通过组装软件将源程序更改为机器代码。MCS-51单片机的组装软件有早期的A51。随着单片机开发技术的不断发展,从汇编语言的普遍使用到高级语言的逐步发展,单片机的开发软件也在不断发展。Keil软件是目前用于开发MCS-51系列单片机的最受欢迎的软件。从各种仿真机制造商近年来宣布全面支持Keil的事实可以看出这一点。Keil提供完整的开发解决方案,包括C编译器,宏组件,连接器,库管理和强大的仿真器调试器,它们通过集成开发环境(uVision)进行组合。运行Keil软件需要Pentium或以上CPU,16MB或更多RAM,20M可用硬盘空间,WIN98,NT,WIN2000,WINXP等操作系统。编程软件keil如图4.1图14编程软件keil上图是Keiluvision编辑软件的编辑界面,应用此软件完成代码的编辑,编译,生成hex文件之后烧写到单片机中。4.2.1主程序设计该控制系统的程序主要分为三部分:主程序、键盘扫描子程序、显示子程序、时钟读写子程序、电能读取子程序和各种中断子程序。主程序完成系统的地址分配、系统初始化和各子程序的调用。软件设计是本控制系统设计的核心,在完成了系统硬件的搭接之后,剩下来的主要任务接是系统软件的设计。主程序主要有定义变量、初始化程序、各种子程序调用和报警控制程序组成,其流程图如图15所示:开始开始调用显示子程序初始化读时钟芯片电量处理调用键盘扫描子程序是否按键?时间到?继电器输出调整子程序YNYN图15主程序流程图4.2.2键盘扫描程序本设计采用状态机设计方法来编写键盘扫描程序来实现单个按键复用的效果,键盘扫描子程序利用时间中断程序,每隔10MS调用一次,监控键盘的状态。T0定时中断程序主要是实现10ms的定时时间,并且对变量DS进行加一处理,其中在对T0进行赋初值时,选择为TH0=0xdc,TL0=0x00,主要是c语言在经过反汇编后,一条c语句将会编译成几条语句,这样就增加了指令执行的时间,使定时产生误差,而在经过多次调试后,选择以上数值为T0初值是最接近10ms。键盘扫描流程图如图16所示:无按键状态无按键状态返回键值1返回键值2是否抖动?是否释放?是否1秒到?YNNNY图16键盘扫描流程图4.2.3LCD1602显示子程序LCD1602显示子程序流程图如图17所示开始开始1602初始化写指令写数据写数据计数器为0?结束NY图17LCD1602显示子程序流程图4.3protues软件Protues是一款强大的软件仿真软件,可以对一些常用的进行电路的仿真,本设计主要是以实物设计为主,仿真为辅助。如图18所示Protues是英国著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设。在仿真中我将自己的设计从构想开始向现实转变,在自己的实际操作中,感到自己知识的匮乏,但同样在实际操作自己动手能力不断提高,同时也弄懂了关于仿真的知识,以及关于实物与仿真之间的联系。只有不断提高自己的动手能力,才能使自己更加进步。图18protues软件总结通过数月的努力,本次毕业设计的任务——基于单片机智能电表的设计已经完成。该系统以STC89C52作为核心成分,实现电表软件控制通过键盘控制和LCD显示器的功能,并实现该设计的基本要求。尽可能将硬件电路简单化,并且使软件编程的优点都得到充分利用,以减少所造成的部件的精度不足和环境因素的错误。由于有限的时间和我们自己的知识水平不高,我们认为仍有需要改进的系统和地方,如使用高精密部件,硬件电路的稳定性和软件算法进一步优化的。由于我们设计的LCD智能电表的重点在于软件程序的设计,利用protel99设计电路原理图,利用KEIL软件进行程序编写与调试。在程序设计时,由于对51单片机的中断寄存器不是很了解,所以出现了一些不必要的麻烦。就拿编程来说,由于没有处理好子程序的返回和时钟中断程序时间,就导致时钟运行到指定的时间后不打转而是继续走,由于没有把握好显示码表等一些细节地方,而导致显示时间不正常等一系列相当严重的问题。在经过反复检查、分析、调试之后,从中发现了定时中断时的数值设置不太适合等一系列问题,经过自己的反复修改、调试和验证,最终才得以解决达到设计的要求。在整个设计过程中,软件的调试是其中一个非常重要的环节。其中有一点是值得我们注意的:在程序设计之前一定要知道设计要求,要清楚地知道本程序所有内容以及程序的流程,据此画出本程序的流程图,然后严格根据流程图进行程序设计,这样设计的程序比较有条理,各部的程序可以分别进行调试和检查。有利于后面对程序进行修改和调试,应该值得注意的是,我们在程序的编写过程中,首先要有鲜明的思想,不能主次不分,主程序和子程序混在一起,不分哪个是主,哪个是次,要先编定出主程序,再根据设计的要求编写子程序,这样才能使整个程序严密,有条理。有利于后面的调试和修改。附录A电路主原理图附录B//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%应用程序开始%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%///***************************************************************************************函数名称:RealTime_Display()*功能:时间部分显示*入口参数:无*出口参数:无**************************************************************************************/voidRealTime_Display(void){ elec=eepromRead(0x2000)*256+eepromRead(0x2001); print(0x80,"Total:"); print2(0x86,(elec/10000)+0x30); print2(0x87,(elec%10000/1000)+0x30); print2(0x88,(elec%1000/100)+0x30); print(0x89,"."); print2(0x8a,(elec%100/10)+0x30); print2(0x8b,(elec%10)+0x30); print(0x8c,"KWh"); print2(0xc0,(read_clock(0x85)/16)+0x30);//显示时 print2(0xc1,(read_clock(0x85)%16)+0x30); print(0xc2,":");//显示: print2(0xc3,(read_clock(0x83)/16)+0x30);//显示分 print2(0xc4,(read_clock(0x83)%16)+0x30); print(0xc5,":");//显示: print2(0xc6,(read_clock(0x81)/16)+0x30);//显示秒 print2(0xc7,(read_clock(0x81)%16)+0x30); print(0xc8,""); print2(0xca,(pow%10000/1000)+0x30); print2(0xcb,(pow%1000/100)+0x30); print2(0xcc,(pow%100/10)+0x30); print2(0xcd,(pow%10)+0x30); print(0xce,"W");}/***************************************************************************************函数名称:Set_time()*功能:DS1302调时程序*入口参数:sel*出口参数:无**************************************************************************************///设定时间voidSet_time(uint8sel){//sel为调整标志 uint8address,item; uint8max,min; if(ds1>=10){ ds1=0; print(0x80,"RealTime"); print(0xc0,""); print2(0xc3,(read_clock(0x85)/16)+0x30);//显示时 print2(0xc4,(read_clock(0x85)%16)+0x30); print(0xc5,":");//显示: print2(0xc6,(read_clock(0x83)/16)+0x30);//显示分 print2(0xc7,(read_clock(0x83)%16)+0x30); print(0xc8,":");//显示: print2(0xc9,(read_clock(0x81)/16)+0x30);//显示秒 print2(0xca,(read_clock(0x81)%16)+0x30); print(0xcb,""); } LCM1602_WriteCMD(CMD_dis_gb2); if(sel==1){ print2(0xc3,(read_clock(0x85)/16)+0x30);//调整时 address=0x84; max=23; min=0; } if(sel==2){ print2(0xc6,(read_clock(0x83)/16)+0x30);//调整分 address=0x82; max=59; min=0; } if(sel==3){ print2(0xc9,(read_clock(0x81)/16)+0x30);//调整秒 address=0x80; max=59; min=0; } item=((read_clock(address+1))/16)*10+(read_clock(address+1))%16; if(out_up==1){ Beep_k();//调整加1 item++; } if(out_up==2){ while(out_up==2); item++; } if(out_dow==1){ Beep_k();//调整减1 item--; } if(out_dow==2){ while(out_dow==2); item--; } if(item>max&&item!=255) item=min;//最大值限定 if(item<min|item==255) item=max;//最小值限定 write_clock(0x8e,0x00);// write_clock(address,((item/10)*16+item%10));//写入数据到1302 write_clock(0x8e,0x80);//}/***************************************************************************************函数名称:Set_Alarm1()*功能:设定开机程序*入口参数:sel*出口参数:无**************************************************************************************///设定闹钟voidSet_Alarm1(uint8sel){//sel为调整标志 uint8address,item; uint8max,min; if(ds1>=10){ ds1=0; print(0x80,"ONTime"); print(0xc0,""); print2(0xc5,(read_clock(0xd1)/16)+0x30); print2(0xc6,(read_clock(0xd1)%16)+0x30); print(0xc7,":"); print2(0xc8,(read_clock(0xd3)/16)+0x30); print2(0xc9,(read_clock(0xd3)%16)+0x30); print(0xca,""); } LCM1602_WriteCMD(CMD_dis_gb2); if(sel==1){ print2(0xc5,(read_clock(0xd1)/16)+0x30);//设定闹钟时 address=0xd0; max=23; min=0; } if(sel==2){ print2(0xc8,(read_clock(0xd3)/16)+0x30);//设定闹钟分 address=0xd2; max=59; min=0; } item=((read_clock(address+1))/16)*10+(read_clock(address+1))%16; if(out_up==1){ Beep_k();//调整加1 item++; } if(out_up==2){ while(out_up==2); item++; } if(out_dow==1){ Beep_k();//调整减1 item--; } if(out_dow==2){ while(out_dow==2); item--; } if(item>max&&item!=255) item=min;//最大值限定 if(item<min|item==255) item=max;//最小值限定 write_clock(0x8e,0x00);// write_clock(address,(item/10)*16+item%10);//写入数据到1302 write_clock(0x8e,0x80);//}/***************************************************************************************函数名称:Set_Alarm2()*功能:设定关机程序*入口参数:sel*出口参数:无**************************************************************************************///设定闹钟voidSet_Alarm2(uint8sel){//sel为调整标志 uint8address,item; uint8max,min; if(ds1>=10){ ds1=0; print(0x80,"OFFTime"); print(0xc0,""); print2(0xc5,(read_clock(0xd5)/16)+0x30); print2(0xc6,(read_clock(0xd5)%16)+0x30); print(0xc7,":"); print2(0xc8,(read_clock(0xd7)/16)+0x30); print2(0xc9,(read_clock(0xd7)%16)+0x30); print(0xca,""); } LCM1602_WriteCMD(CMD_dis_gb2); if(sel==1){ print2(0xc5,(read_clock(0xd5)/16)+0x30);//设定闹钟时 address=0xd4; max=23; min=0; } if(sel==2){ print2(0xc8,(read_clock(0xd7)/16)+0x30);//设定闹钟分 address=0xd6; max=59; min=0; } item=((read_clock(address+1))/16)*10+(read_clock(address+1))%16; if(out_up==1){ Beep_k();//调整加1 item++; } if(out_up==2){ while(out_up==2); item++; } if(out_dow==1){ Beep_k();//调整减1 item--; } if(out_dow==2){ while(out_dow==2); item--; } if(item>max&&item!=255) item=min;//最大值限定 if(item<min|item==255) item=max;//最小值限定 write_clock(0x8e,0x00);// write_clock(address,(item/10)*16+item%10);//写入数据到1302 write_clock(0x8e,0x80);//}/*************************************************************************************//***************************************************************************************函数名称:Set_Alarm3()*功能:设定限电功率*入口参数:sel*出口参数:无**************************************************************************************///设定闹钟voidSet_Alarm3(uint8sel){//sel为调整标志 uint8address,item; uint8max,min; if(ds1>=10){ ds1=0; print(0x80,"OFFPower"); print(0xc0,""); print2(0xc5,(read_clock(0xd9)/16)+0x30); print2(0xc6,(read_clock(0xd9)%16)+0x30); print(0xc7,"00W"); } LCM1602_WriteCMD(CMD_dis_gb2); if(sel==1){ print2(0xc5,(read_clock(0xd9)/16)+0x30);//设定功率 address=0xd8; max=10; min=1; } item=((read_clock(address+1))/16)*10+(read_clock(address+1))%16; if(out_up==1){ Beep_k();//调整加1 item++; } if(out_up==2){ while(out_up==2); item++; } if(out_dow==1){ Beep_k();//调整减1 item--; } if(out_dow==2){ while(out_dow==2); item--; } if(item>max&&item!=255) item=min;//最大值限定 if(item<min|item==255) item=max;//最小值限定 write_clock(0x8e,0x00);// write_clock(address,(item/10)*16+item%10);//写入数据到1302 write_clock(0x8e,0x80);//}/*************************************************************************************/sbitLED_pow=P2^6;//sbitLED_on=P2^5;//sbitLED_off=P2^4;//sbitout_relay=P1^3;///***************************************************************************************函数名称:alarm()*功能:声光报警输出*入口参数:无*出口参数:无**************************************************************************************/voidalarm(void){ if(read_clock(0xd1)==read_clock(0x85)&&read_clock(0xd3)==read_clock(0x83)) { LED_on=0; out_relay=0;//时间等于设定时开机 } if((read_clock(0xd5)==read_clock(0x85)&&read_clock(0xd7)==read_clock(0x83))|(pow>=(((read_clock(0xd9))/16)*1000+((read_clock(0xd9))%16)*100))) { LED_on=1; out_relay=1;//时间等于设定时关机 } if(pow
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 炼油厂每日安全分享
- 糖尿病胰岛素种类
- 术后肺部感染如何预防与护理
- 厨房规划方案总结
- 4-2-2 元素周期表及元素周期律的应用 课件 高一上学期化学人教版(2019)必修第一册
- 黑客攻击解决方案
- 消化道大出血的应急流程演练
- 消防安全知识演练
- 氧化硫说课稿
- 化简比说课稿人教版
- 2024译林版英语初一上单词默写表
- XX高速JLX总监办驻地建设方案(含详细图纸)
- 垂直循环立体车库设计
- 三年级语文家长会(课堂PPT)
- 氢氧化钠标准溶液的配制和标定.
- 供货保障方案及措施两篇范文
- 八年级物理上册5_2生活中的透镜教学设计新版新人教版
- 金属构件失效分析精简版
- 雷诺尔JJR系列软起动器说明书
- 中国联通GPON设备技术规范
- 中学物理社团活动记录(共20页)
评论
0/150
提交评论