基于51单片机的电表电量采集系统程序
基于51单片机的电压采集与显示系统设计

课程设计题目:51单片机的电压采集与显示系统设计专业:电气工程及其自动化班级:学号:学生姓名:指导教师:2010 年 9 月5 日摘要随着电子科技的不断发展与进步,电压测量成为广大电子领域中必须掌握的过程,并且对测量的精度和采集功能的要求也越来越高,而电压的测量与显示系统甚为重要。
本文介绍的重点是电压数据的采集与显示系统,数据采集与通信控制采用了模块化的设计,数据采集与通信控制采用了单片机8051来实现,硬件部分是以单片机为核心,还包括模-数转换模块,显示模块,和串行接口部分,还有一些简单的外围电路。
8路被测电压通过通用ADC0809模-数转换,实现对采集到的数据进行模拟量到数字量的转换,由单片机对数据进行处理,用数码管显示模块来显示所采集的结果,由相关控制器完成数据接收和显示,VB程序编写了更加明了化数据显示界面。
本系统主要包括四大模块:数据采集模块、控制模块、显示模块、A/D转换模块。
绘制电路原理图与工作流程图,并进行调试,最终设计完成了该系统的硬件电路。
在软件编程上,采用了C语言进行编程,开发环境使用相关集成开发环境。
开发了显示模块程序、通道切换程序、A/D转换程序。
关键词:单片机, ADC0809,A/D转换,模块显示电压测量AbstractAlong with the development of electronic technology progress, voltage measurement of electronic fields become broad must grasp of the process, and the accuracy of measurement and collection function requirements, and more and more is also high voltage measurement and display system is very important. This paper focuses on voltage data acquisition and display system, data collection and communication control using modular design, data collection and communication control adopted MCU 8051, hardware part is, still include singlechip mode - several conversion module, display module, and the serial interface, and some simple outer circuit.8 and the voltage to be measured by general ADC0809 mode - and to count the collected data for analog to digital, by SCM processing of data, using a digital display module to show the tube, the related results of collecting data receiving and display controller, VB programming and the data showed that the interface. This system mainly including four modules: the data acquisition module, control module, display module, A/D conversion module. Draw circuit principle diagram and the work flow, and debugging, finally completed the system design of hardware circuit. In software programming, the C language program development environment, use the integrated development environment. Develop A display module procedures, channel switching procedures, A/D conversion program..Keywords: SCM, ADC0809, A/D conversion, module display voltage measurements.目录1引言 (6)2课程设计题目、任务及要求及方案 (7)3电路原理说明 (9)3.1ADC0809模数转换芯片 (9)3.2 AT89C51单片机 (10)3.3八段数码管和74LS47 (10)3.4 系统整体工作原理 (11)3.4.1硬件原理 (11)3.4.2软件原理分析 (12)4设计总体框图 (16)4.1硬件总体框图 (16)4.2程序总体框图 (16)4.3待测信号源单元电路 (17)4.4 AT89C51单片机 (18)4.5单片机控制单元 (19)4.5.1外部时钟电路 (19)4.5.2复位电路 (20)4.5.3数码管显示模块 (21)5调试报告 (22)6 总结及设计心得 (23)参考文献 (24)附录.............................................. 2错误!未定义书签。
基于51单片机的直流数字电压表设计

基于51单片机的直流数字电压表设计概述:直流数字电压表是一种用于测量直流电压的仪器,它通过将电压信号转换为数字形式,并显示在数码管上,实现对电压的准确测量。
本文将介绍基于51单片机的直流数字电压表的设计原理和实现方法。
一、设计原理:1.1 电压信号采集:直流数字电压表的第一步是采集待测电压信号。
常用的采集方法是使用一个分压电路将待测电压降低到合适的范围,再通过运算放大器将其放大到合适的电平。
51单片机的模拟输入引脚可以接受0-5V的模拟电压信号,因此可以直接将放大后的信号接入单片机进行采集。
1.2 模数转换:采集到的模拟电压信号需要经过模数转换(A/D转换)才能被单片机读取和处理。
51单片机内部集成了一个10位的A/D转换器,可以将输入的模拟电压转换为相应的数字量。
通过设置不同的参考电压和采样精度,可以实现对不同电压范围的准确测量。
1.3 数码管显示:经过模数转换后,得到的数字量需要通过数码管进行显示。
51单片机的IO口可以通过控制段选和位选的方式,将数字量转换为相应的数码管显示。
可以根据需要选择常用的七段数码管或者液晶显示屏进行显示。
二、设计实现:2.1 硬件设计:硬件设计包括电路原理图设计和PCB布局设计两个部分。
电路原理图设计主要包括电压采集电路、运算放大器、A/D转换器和数码管驱动电路等部分。
PCB布局设计需要考虑信号的走线和电源的分布,以保证电压信号的准确采集和显示。
在设计过程中,需要注意地线和信号线的分离,以减少干扰。
2.2 软件设计:软件设计主要包括单片机的程序编写和调试。
首先需要编写采集模拟电压信号和进行A/D转换的程序,将转换后的数字量存储在单片机的内部存储器中。
然后编写数码管驱动程序,将存储的数字量转换为相应的数码管显示。
最后,通过按键或者旋转编码器等方式,可以实现对量程和精度的选择。
三、设计优化:3.1 精度优化:为了提高直流数字电压表的测量精度,可以采用更高精度的A/D转换器,增加参考电压的精度,或者通过校准电路对测量误差进行校正。
51单片机数据采集系统

课程设计报告书设计任务书一、设计任务1一秒钟采集一次。
2把INO口采集的电压值放入30H单元中。
3做出原理图。
4画出流程图并写出所要运行的程序。
二、设计方案及工作原理方案: 1. 采用8051和ADC0809构成一个8通道数据采集系统。
2. 能够顺序采集各个通道的信号。
3. 采集信号的动态范围:0~5V。
4. 每个通道的采样速率:100 SPS。
5.在面包板上完成电路,将采样数据送入单片机20h~27h存储单元。
6.编写相应的单片机采集程序,到达规定的性能。
工作原理:通过一个A/D转换器循环采样模拟电压,每隔一定时间去采样一次,一次按顺序采样信号。
A/D转换器芯片AD0809将采样到的模拟信号转换为数字信号,转换完成后,CPU读取数据转换结果,并将结果送入外设即CRT/LED显示,显示电压路数和数据值。
目录第一章系统设计要求和解决方案第二章硬件系统第三章软件系统第四章实现的功能第五章缺点及可能的解决方法第六章心得体会附录一参考文献附录二硬件原理图附录三程序流程图第一章系统设计要求和解决方案根据系统基本要求,将本系统划分为如下几个部分:●信号调理电路●8路模拟信号的产生与A/D转换器●发送端的数据采集与传输控制器●人机通道的接口电路●数据传输接口电路数据采集与传输系统一般由信号调理电路,多路开关,采样保持电路,A/D,单片机,电平转换接口,接收端(单片机、PC或其它设备)组成。
系统框图如图1-1所示1.1 信号采集分析被测电压为0~5V 直流电压,可通过电位器调节产生。
1.1.1 信号采集多路数据采集系统多采用共享数据采集通道的结构形式。
数据采集方式选择程序控制数据采集。
程序控制数据采集,由硬件和软件两部分组成。
,据不同的采集需要,在程序存储器中,存放若干种信号采集程序,选择相应的采集程序进行采集工作,还可通过编新的程序,以满足不同采样任务的要求。
如图1-3所示。
程序控制数据采集的采样通道地址可随意选择,控制多路传输门开启的通道地址码由存储器中读出的指令确定。
基于51单片机的PCF8591芯片电压表

PCF8591芯片电压表一、功能1、用PCF8591芯片采集电压。
2、使用IIC通信协议进行通信。
3、四位数码管显示采集电压。
4、电压表有五个档位200MV、2V、20V、200V、500V。
5、四个按键进行档位切换。
6、五个LED指示灯1~5指示相应档位。
7、电压过大,继电器自动断开,保护电路。
8、滑动变阻器可以对电压表精确度进行调节,使测量更精确。
9、采用STC89RC52单片机。
10、电源供电采用USB电源头(发货中会赠送一根)供电,插到手机直充头上就可以正常使用。
二、硬件按键功能及说明档位1/2:200MV档位和2V档位切换,LED1/2亮。
档位3:切换到20V档位,LED3亮。
档位4:切换到200V档位,LED4亮。
档位5:切换到500V档位,LED5亮。
复位:对整个电路进行复位,回到初始化状态2V档位。
三、注意事项1、程序下载程序利用串口下载,首先将下载器正确连接(说明一下,板子上下载口从左到右依次接下载器的+5V、地、TX、RX,下载器上标的有),打开STC下载器如图。
选择STC89C52RC,点击“打开程序文件”选择程序文件夹中(Output-> 电压表.HEX)的温度控制.hex文件。
点击下载,当提示上电时拔下电源再插上就可以了。
2、按键使用如上图所示,档位1/2、档位3、档位4、档位5,以及复位五个按键。
具体按键功能在上边已经介绍。
3、使用说明刚开始使用是,不要测量高电压,应该先用低电压试试电压表好坏。
测量较高的电压时,要用最高档测量一下大致电压是多少,再换用合适档位进行精确测量。
因为不同型号的电源,导致单片机的工作电压和PCF8591芯片的基准电压,都不是标准的5V,所以在测量时会有误差,这时候就需要通过对电位器进行微调来调节误差,使测量更精确。
4、注意事项需要特别注意的是测量电压千万不要高于测量档位的电压,不然会因为瞬间电流过大,直接烧坏芯片,使电压表产生损坏。
因为操作不当造成的后果,我们一概不负责,一定要特别注意。
51单片机电池电量检测系统设计

51单片机电池电量检测系统设计1. 简介本文档描述了一种使用51单片机设计的电池电量检测系统。
该系统旨在监测电池的电量,并通过51单片机进行数据处理和显示。
该系统适用于需要监测电池电量的各种设备,如智能手表、无人机等。
2. 系统设计2.1 系统架构该电池电量检测系统由以下主要组件构成:•51单片机:作为系统的核心处理器,负责数据采集、处理和显示。
•电压测量模块:用于测量电池的电压。
•LCD显示模块:用于显示电池电量信息。
•按钮模块:用于系统操作和设置。
2.2 硬件设计2.2.1 电压测量模块电压测量模块主要由一个ADC转换器组成,用于将电池电压转换为数字量,以便51单片机进行处理。
2.2.2 LCD显示模块LCD显示模块用于显示电池电量信息。
可以使用基于液晶技术的LCD模块,通过51单片机控制显示电池电量的百分比或其他信息。
2.2.3 按钮模块按钮模块用于系统的操作和设置。
可以通过按钮模块实现电池电量的复位、设置电池类型等功能。
2.3 软件设计2.3.1 系统初始化系统初始化时,51单片机将初始化ADC转换器、LCD显示模块和按钮模块。
设置合适的ADC参考电压,配置LCD显示模块的参数,并对按钮模块进行初始化。
2.3.2 电池电量测量系统将定时读取ADC转换器的数值,转换为电池电压。
然后,根据电池的电压和电池类型进行电量计算,并将计算结果存储在内存中。
2.3.3 数据显示每次电池电量测量完成后,系统将更新LCD显示模块上的电量信息。
可以通过LCD显示百分比、图形等形式显示电池电量信息。
2.3.4 系统操作通过按钮模块,用户可以对系统进行操作,如复位电池电量计数、设置电池类型等。
3. 总结本文档描述了一种使用51单片机设计的电池电量检测系统。
通过ADC转换器测量电池电压,并使用LCD显示模块显示电池电量信息。
此系统可广泛应用于电池电量监测领域,提供方便和准确的电量监测功能。
基于单片机的远程智能电表抄表系统设计

基于单片机的远程智能电表抄表系统设计远程抄表技术是一个集电能表数据采集、传输、存储、共享等功能于一体,以达到为客户、电力企业的电费、计量等数据应用部门服务的自动化系统。
本文以当前电能计量与抄表系统的发展背景为依据,提出了基于单片机的远程智能抄表系统。
自动抄表改变了以往人工抄表的服务方式,实行无人查表,由物业管理公司或供给公司在控制中心集中抄收,避免了因人工抄表所造成的错抄、漏抄、估抄、抄表时间跨度大、工作效率低、存在安全隐患等弊端。
既节省了人力物力,也提高了安全性。
本文主要设计完成了以AT89C52单片机为控制核心,具有电量测量和数据通信功能的智能型电能表,为了实现智能电能表的各种功能,在硬件设计中采用了多种芯片,并提出了多种基于单片机的自动抄表系统网络结构。
硬件设计主要设计模块如下:(1)智能电能表计量模块中的单相电量计量芯片ADE7755和三相电量计量芯片ATT7026与单片机的接口电路。
(2)数据采集器、数据集中器接口电路设计。
在软件设计部分主要实现了智能电能表的主程序和部分重要功能程序流程设计。
在最后对系统的干扰进行了分析,并在硬件和软件上提出了抗干扰措施,着重分析了智能电能表误差产生的来源和误差调整的方法。
基于51单片机的多路电压采集系统的设计proteus仿真

基于51单片机的多路数据采集器一、摘要:用51单片机控制ADC0808将模拟信号(0~0.5V)转换成数值量(0~255),再控制LED数码管以十六进制实时显示出来。
ADC0808为模/数(A/D)转换器。
在Proteus软件上实现电路设计和程序设计,并进行实时交互仿真。
本设计采用了以单片机为开发平台,控制系采用AT89C52单片机,A/D转换采用ADC0808。
系统除能确保实现要求的功能外,还可以方便进行8路其它A/D转换量的测量。
万用板经过排版、布线、焊接、调试等工作后基于51单片机的简易电压表成形。
关键字:51单片机ADC0808 LED数码显示二、设计要求1、用51单片机作为控制器,来控制ADC0808将模拟信号转换成数值量(0—255);2、可准确测量0—0.5V电压,最小分辨率2mV;3、测量误差小于5%;4、用51单片机控制两位数码管显示实时测量电压的16进制数值量;5、单片机采用中断工作方式;6、在Proteus软件上实现多路电压的测量的电路和程序设计,并进行实时仿真;三、功能创新(1) 在Proteus软件上实现了8路电压的测量设计,并仿真成功,且在万用板上焊接、调试成功;(2) 设计一个外部开关通过中断方式来选择任意一路的电压测量,并用单片机控制一位数码管显示路数;(3)通过编程实现直接在LED数码管上显示测量电压值,并精确到1mV;(4) 设计一个由LED灯和蜂鸣器组成的报警电路,当被测电压超过测量范围时,报警电路实现报警;四、硬件电路设计1、系统设计框图根据设计要求与思路,在Proteus软件上设计和仿真该系统的设计方案。
硬件电路由6个部分组成,即单片机电路、复位电路、4位LED显示电路、A/D转换电路和键盘及报警电路、放大电路。
系统设计框图如下:图1 系统框图2、单片机系统电路本次设计选择Atmel公司生产的AT89C52作为控制芯片。
AT89系列与MCS-51系列单片机相比有两大优势:第一,片内程序存储器采用闪速存储器,使程序的写入更加方便;第二,提供了更小尺寸的芯片,使整个电路体积更小。
基于单片机的远程抄表系统设计

基于单片机的远程抄表系统设计作者:张召强来源:《电子世界》2012年第24期【摘要】介绍城市水表、气表及电表远程自动抄收系统的工作原理、实现电路、程序设计及部分程序代码,给出了利用单片机实现远程通讯、数据及处理采集、编码控制等的分析及处理方法,充分发挥单片机的功能与作用。
【关键词】单片机;485总线;232总线;IC卡;自动抄收单片机在消费电子、自动化仪表、工业控制等领域已得到了广泛的应用,它以灵活的设计、低廉的成本、微小的功耗在电子器件市场中占有十分重要的地位。
今天越来越多的芯片厂商在不遗余力地竞争这个应用空间。
如INTEL,MICROCHIP,NEC,ATMEL等公司都已形成了自己强大的产品线,给产品的设计带来了越来越多的选择。
1.系统功能及各部件特点描述本系统主要有以下几个部分组成:电脑、城市电话网、数据管理机、传输总线、单元转发器及可扩展单元转发器、计量表。
在这些组成中,单元转发器是整个系统的核心,它起着水、电及气表的抄收工作,并将抄收的数据通过485总线传送到与数据管理机相联的电脑上或者通过数据管理机将数据通过公共电话网传送到远程的管理电脑上。
电脑有一套与抄收系统相适应的管理软件,能实现远程抄收、设置等工作。
1.1 单元转发器单元转发器是实现数据抄收的主要设备,它主要装在小区内的楼道内,通过数据线与每一户内的水、电及气表相联,实时监控每个表的运行状态并完成数据抄收,主要有以下功能:(1)单元转发器最大数据采集量为30块计量表,内置蓄电池,断电后可连续工作240小时。
(2)单元转发器上具有大屏幕LCD显示,可实时显示每只计量表的读数、时间、状态便于人工查询。
(3)单元转发器上带有操作键盘,可直接在转发器上进行系统设定等各项操作。
(4)单元转发器有记忆卡插口、记忆卡既可以作为管理体人员的身份识别卡,又是可作为人工抄表的数据存储卡,每张记忆卡可存储16000只表的数据。
(5)单元转发器上有专线接口,连接小区和数据管理机,实现数据自动远传和管理。
基于单片机的数字电能表设计

基于单片机的数字电能表设计数字电能表是测量电能并传递数据的电气装置。
它们通常采用单片机芯片来实现计算,并将其存储在内存中。
本文将介绍单片机数字电能表的设计方案。
1. 系统结构设计数字电能表的系统结构包括传感器、信号处理电路、单片机芯片、数字显示部分和通讯接口。
传感器用于测量电压、电流等信号并将其转换为电信号。
信号处理电路将采集到的模拟信号转换为数字信号并进行滤波和放大处理。
单片机芯片负责处理信号并实现计算,测量功率、电能、电量等。
数字显示部分将计算结果以数字形式展示出来。
通讯接口用于与计算机、集中抄表系统等外部设备进行数据通讯。
2. 系统功能设计数字电能表的主要功能包括:测量电量、功率、电流、电压等参数;统计电量、功率等负荷分布;完成智能电网的控制和管理;提供数据采集和远程通讯功能等。
3. 硬件设计3.1 传感器设计传感器主要包括电压、电流互感器以及电能表表芯等,其中电压互感器和电流互感器将采集到的电信号转换为电压信号和电流信号,电能表表芯则用于计量电能。
应选择准确可靠的传感器,以保证数字电能表的精度和稳定性。
3.2 信号处理电路设计信号处理电路主要完成信号转换、滤波和放大作用。
转换模拟信号为数字信号是数字电能表工作的前置条件。
采用滤波技术可有效降噪,提高系统稳定性。
应选择具有较高增益、较低噪声、抗干扰能力强的运放等器件。
3.3 单片机设计单片机芯片是数字电能表的核心部分。
MCU通常采用单片机,具有高精度、运算速度快、易于编程、易于扩展等优势。
应根据用户需求选择不同类型的MCU,如8位单片机、16位单片机等。
3.4 数字显示部分设计数字显示部分是数字电能表中的另一个重要组成部分。
可通过数码管、液晶显示屏、LED显示等形式直观地显示电能、功率、电压等参数。
应选择可靠、耐用、能够满足用户需求的显示器件。
3.5 通讯接口设计通信接口可采用RS485通讯、光纤通讯、以太网通讯等形式。
RS485通讯是数字电能表中应用最广泛的通信方式,稳定性好、通讯距离远。
基于51单片机-PCF8591数字电压表课程设计

课程名称:微机原理课程设计题目:数字电压表ﻬ摘要单片微型计算机简称单片机,是典型的嵌入式微控制器,常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
单片机由运算器,控制器,存储器,输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。
概括的讲:一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
它最早是被用在工业控制领域。
其中我们用于学习用的最多的是STC89C52单片机,STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但也做了很多改进使得芯片具有传统51单片机不具备的功能。
STC89C52具有8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KB EE PROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构,全双工串行口。
本设计就是以单片机STC89C52为核心,附以外围电路,实现数字电压表的功能,并运用软件Proteus进行仿真来得到实验结果。
关键词:STC89C52单片机、仿真、中断、数字电压表、数码管显示ﻬ目录一、任务要求ﻩ错误!未定义书签。
1.1 设计任务ﻩ错误!未定义书签。
1.2设计要求ﻩ错误!未定义书签。
1.3发挥部分 ...................................................................................... 错误!未定义书签。
1.4 创新部分 ........................................................................................... 错误!未定义书签。
基于单片机的数字电能表设计

基于单片机的数字电能表设计1系统总体设计方案数字化电能表机是由多个硬件模块组成的,它们各自具有各自的功能,在电能表机的硬件体系中起到了重要的作用。
利用MCU将模块与模块之间统一地联系在一起,最终构成了一个具有强大功能的智能电表系统,整体设计框图具体如下:硬件模块的详细信息:1.MCU:用于数据处理,运算,显示,通讯等的中央处理单元。
2.时钟:为电能计在不同的时间段和不同的速率下,给出准确的时间信息,以进行电能计量。
3.在显示方面,利用液晶显示器对累积的电量或其他信息进行显示。
4.内存:当 MCU中的 RAM断电时,会失去即时的资料,所以在外部插入一块内存,用以储存在各个时间点上的电能。
5.供电:利用电力转换对主网络中220伏 AC进行降压和整流,使其成为5伏 DC。
在停电时,也有专门的后备电池提供电力,以保证电量计的正常工作。
6.A/D变换:其基本功能是将所述模拟电气数据变换为能够被所述 MCU读出和工作的所述数字电气数据。
将 AC高电平信号变换为可由 MCU处理的低压电平信号的电流、电压取样模块。
2 系统硬件设计2.1 AT89C51单片机系统AT89C51单片机已从最初的 MCU控制器发展成为具有强大外部扩展功能的产品,其内部的4 K字节 FLASH存储器可以进行在线的电擦除、电写入以及利用编程器对其进行重复编程[5]。
除此之外,AT89C51系列的单片机还可以实现动态下载程序代码,还可以进行反复编程,因此受到了开发商和消费者的青睐。
2.2 ADC0832芯片ADC0832是一个8比特分辨率的双通道 A/D变换器,它采用了ADC0832芯片。
它小巧、兼容度高、价格比高。
ADC0832单片机的分辨率达到了256个量级,能够实现普通的模拟信号的变换。
本发明所提供之模拟输出电压范围为0至5V,刚好满足电能表所需之供电需求。
该芯片的变换过程只有32微秒,变换速率高,稳定性好。
采用了单独的晶片支持输入方式,使得多设备的挂起及微机的控制更为便捷[7]。
基于80c51单片机的数据采集及显示系统设计

题目:数据采集及显示系统设计设计基本功能:利用TLC549做A/D转换器,外界提供模拟电压输入信号,将模拟量转化成数字量,在单片机控制下实现对外部输入信号的数据采集,并将采集数据结果在LED数码管上显示,显示结果为实际输入电压数值。
要求能够实现单次触发存储显示方式,即每按动一次“单次触发”键,能对被测信号进行一次采集与显示。
系统在不采集信号时,显示当前时间。
一、硬件设计本方案分为三个模块:单片机模块、AD模块、I2C模块,其中I2C模块有时钟、键盘和LED三部分组成。
1、单片机模块该模块设计实现单片机最小系统和与其他模块的接口。
电路图见图一。
图一2、AD模块该模块是TLC549的电路连接。
见图二。
图二 TLC5493、I2C模块本模块是由时钟芯片PCF8563和由ZLG7290连接的键盘、6位LED组成。
实现时钟设置、读取,键盘识别,以及显示功能。
电路连接见图三、四。
图三 ZLG7290 图四 PCF8563二、软件设计1、流程图见图五。
图五流程图2程序#include <REG51.h>#include <intrins.h>#include <absacc.h>#include "VIIC_C51.h"#include "ZLG7290.h"#define PCF8563 0xA2 //定义器件地址#define WRADDR 0x00 //定义写单元首地址#define RDADDR 0x02 //定义读单元首地址#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define ZLG7290 0x70 //定义器件地址//定义TLC549串行总线操作端口sbit CLK=P1^0;sbit DAT=P1^1;sbit CS=P1^2;//定义I2C总线控制端口sbit SDA=P1^7;sbit SCL=P1^6;//显示缓冲区初始化:DP-51PROunsigned char disp_buf[8]={0,0,0,0,0,0,0,0};//显示缓存uchar bdata ADCdata;sbit ADbit=ADCdata^0;sbit KEY_INT=P3^2;sbit RST=P1^0;unsigned char KEY; //保存键值/*****************************************************函数名称: TLC549ADC()**函数功能: 读取上一次A/D转换的数据,启动下一次A/D转换****************************************************/ uchar TLC549ADC(void){uchar i;CLK=0;DAT=1;CS=0;for(i=0;i<8;i++){CLK=1;_nop_();_nop_();ADCdata<<=1;ADbit=DAT;CLK=0;_nop_();}return (ADCdata);}/******************************************函数名称: delay()**函数功能: 硬件延时程序**入口参数: i****************************************/ unsigned char DelayNS(unsigned char no){unsigned char i,j; //延时参数for(; no>0; no--)for(i=0; i<100; i++)for(j=0; j<100; j++);return 0;}/*A/D数据转换处理和输出显示功能函数*//******************************************* **函数名称: display()**函数功能: 处理A/D转换后的数据并输出显示********************************************/ void display(uchar advalue){ulong ad_disp;ad_disp=((ulong)advalue)*500/255;disp_buf[2] =(uchar)(ad_disp/100%10)+0x80; disp_buf[1] =(uchar)(ad_disp/10%10);disp_buf[0] =(uchar)(ad_disp/1%10);disp_buf[3] = 31;disp_buf[4] = 31;disp_buf[5] = 31;disp_buf[6] = 31;disp_buf[7] = 31;ZLG7290_SendBuf(disp_buf,8);}unsigned char display_time(unsigned char *sd) {sd[0]=sd[0]&0x7f;//秒屏蔽保留位sd[1]=sd[1]&0x7f;//分屏蔽保留位sd[2]=sd[2]&0x3f;//时屏蔽保留位disp_buf[0] =(sd[0]%16);disp_buf[1] =(sd[0]/16);disp_buf[2] = 31;disp_buf[3] =(sd[1]%16);disp_buf[4] =(sd[1]/16);disp_buf[5] = 31;disp_buf[6] =(sd[2]%16);disp_buf[7] =(sd[2]/16);ZLG7290_SendBuf(disp_buf,8);return 0;}unsigned char display_date(unsigned char *sd){sd[0]=sd[0]&0x3f;//日屏蔽保留位sd[2]=sd[2]&0x1f;//月屏蔽保留位disp_buf[0] =(sd[0]%16);disp_buf[1] =(sd[0]/16);disp_buf[2] =(sd[2]%16)+0x80;//后面加小数点disp_buf[3] =(sd[2]/16);disp_buf[4] =(sd[3]%16)+0x80;//后面加小数点disp_buf[5] =(sd[3]/16);disp_buf[6] =0;disp_buf[7] =2;ZLG7290_SendBuf(disp_buf,8);return 0;}void main(){uchar ad_sample;uchar key1_count=0,key2_count=0,key3_count=0;unsigned char codetd[9]={0x00,0x12,0x00,0x15,0x12,0x13,0x05,0x01,0x11};//定义初始化字unsigned char rd[7]; //定义接收缓冲区RST=0;DelayNS(1);RST=1;ISendStr(PCF8563,WRADDR,td,0x5); //初始化PCF8563DelayNS(1);ISendStr(PCF8563,WRADDR+5,&td[5],0x4);//初始化PCF8563 ZLG7290_SendBuf(disp_buf,8);ZLG7290_SendData(0X15,0X02);disp_buf[7] =0x1f;disp_buf[6] =0x1f;disp_buf[5] =0x1f;disp_buf[4] =0x1f;disp_buf[3] =0x1f;DelayNS(50);IRcvStr(PCF8563,RDADDR,rd,0x7); //读现在的时、分、秒DelayNS(1);while(1){if(KEY_INT==0){KEY=ZLG7290_GetKey();if(KEY==1) //显示切换{key1_count++;if(key1_count>2)key1_count=0;}if(KEY==2) //调整日期{key2_count++;if(key2_count>3)key2_count=0;}if(KEY==3) //调整时间{key3_count++;if(key3_count>2)key3_count=0;}if(KEY==5) //采集电压{ad_sample=TLC549ADC();}/*修改日期*/if(key2_count==1) //调整年{disp_buf[5] =31;disp_buf[4] =31;ZLG7290_SendBuf(disp_buf,8);DelayNS(2);if(KEY==4){rd[6]++;if((rd[6]&0x0f)>=0x0a){rd[6]&=0xf0;rd[6]+=0x10;}}}else if(key2_count==2) //调整月{disp_buf[3] =31;disp_buf[2] =31;ZLG7290_SendBuf(disp_buf,8);DelayNS(2);if(KEY==4){rd[5]++;if((rd[5]&0x0f)>=0x0a){rd[5]&=0xf0;rd[5]+=0x10;}if(rd[5]>=0x13)rd[5]=0x01;}}else if(key2_count==3) //调整日{ disp_buf[1] =31;disp_buf[0] =31;ZLG7290_SendBuf(disp_buf,8);DelayNS(2);if(KEY==4){rd[3]++;if((rd[3]&0x0f)>=0x0a){rd[3]&=0xf0;rd[3]+=0x10;}if(rd[3]>=0x32)rd[3]=0x01;}}/*修改时间*/if(key3_count==1) //修改小时{disp_buf[6] =31;disp_buf[7] =31;ZLG7290_SendBuf(disp_buf,8);DelayNS(2);if(KEY==4){rd[2]++;if((rd[2]&0x0f)>=0x0a){rd[2]&=0xf0;rd[2]+=0x10;}if(rd[2]>=0x24)rd[2]=0x00;}}else if(key3_count==2) //修改分钟{ disp_buf[3] =31;disp_buf[4] =31;ZLG7290_SendBuf(disp_buf,8);DelayNS(2);if(KEY==4){rd[1]++;if((rd[1]&0x0f)>=0x0a){rd[1]&=0xf0;rd[1]+=0x10;}if((rd[1]&0xf0)>=0x60)rd[1]=0x00;}}}if(key1_count==0){display_date(rd+3); //调用显示日期子程序}else if(key1_count==1)display_time(rd);else{display(ad_sample);DelayNS(1);}}}。
基于51单片机红外抄表系统

摘要近年来,随着信息技术的飞速发展,无线技术正在向各个领域渗透,特别是红外线无线技术,在工业生产、家用电器、安全保卫以及人们的日常生活中得到了广泛的应用。
本文详细描述了该红外抄表系统的设计方案、硬件电路设计和软件设计,并利用keil仿真软件对所开发的C语言程序进行了验证。
在本文的第五章讨论了系统的发展趋势和改进,为系统的进一步开发奠定了基础。
本系统关键部分主要是红外通信原理。
系统在分析可行性、可靠性的基础上,参照工程设计方法,确定了模块化设计的思路。
本系统主要由控制模块、发射模块、接收模块、显示模块4个模块组成。
38kHz频率作为数据通信的载波,发射和接收模块对数字信号进行调制和解调,通过LCD液晶显示屏将收到的数据显示出来。
该系统还具备掉电保护和数据存储功能。
利用一个红外抄表器来完成琐碎的抄表工作。
从而从根本上杜绝“肉眼观察”所带来的随机误差,并大大提高了抄表的效率。
关键词:通信;红外抄表;单片机;调制;解调目录1 绪论 (4)1.1课题的背景和意义 (4)1.2课题总体设计方案 (5)2 系统硬件设计 (7)2.1 控制模块 (7)2.2发射模块 (9)2.3 接收模块 (11)2.4 显示模块 (13)3 系统软件设计 (18)3.1 38kHz频率的产生及发射程序设计 (20)3.2 数据计算程序 (22)3.3 显示模块程序设计 (23)3.3.1 数码管显示 (23)3.3.2 LCD液晶显示程序 (24)3.4 接收模块程序设计 (29)4 电路板的制作 (31)4.1 原理图的绘制 (31)4.2 PCB图的生成 (31)4.3 电路板到印制和焊接 (32)5 系统调试 (34)5.1 硬件调试 (34)5.2 软件调试 (34)总结语 (36)参考文献 (37)致谢 (38)附录一:发射原理图 (39)附录二:接收原理图 (40)附录三:源程序 (41)1 绪论1.1课题的背景和意义众所周知,电表是一种非常重要的计量仪表,它的计量准确与否直接关系到千家万户的利益。
基于51单片机的电压、频率采集系统

图1 是系统 的硬件结 构框图 。
盟 : L D 小 或撤警 E
了 55 .%和 58 .%。
图 2T 中断服 务子程序 流程 图 ,1
4结束 语 本设计 是 双 电源切换 装 置 的一 小部分 , 有 C U利 用率 高 、 行 具 P 执 速度快、 简单易行等特点 , 同时可 以在外围进行电路扩展 , 故具有推广 价值。 由于该系统差 要 但 是电压和频率的采集和实时监控, 没有涉及到 电压 和频率 的控 制设计 , 以在控制: 面 所 有待进一步 研究 。 另外基 于系 统本身及器件转换中存 在误差的缺点, 该设计还需要进一步提高精度 、 减小误差, 从而提高系统的整体性能 ,
A C89 D 00 转换结束后.O . C发出中断信号通知单片机进行中断。它的 E 中断服务子程序所需要完成的工作是读入被转换了的 8 位数字量 , 再 将这个 8 位的十六进制数转换成待 显 示的七段显示码存入缓冲器中。 另一 —个中断 为系统 内部 的定时 器 T 中断 。它有两个 功能 : 是对 1 一 外部矩形 脉冲信 号进行 定时计 数 ,s 1 内所得 到 的计 数值 即使频率值 ; 二 是用 于中断 显示 , 时间 到一次 , 示—位 , 计数 就显 由于定 时 时间很短 , 人 眼看起 来各位 数码显 示管就 像“ 同时 ” 示一样 。该 中断服务 子程序 的 显
流程 图如图 2 所示 。
Hale Waihona Puke 被测电溺 } 瞄
片
电子测量大作业(基于C51单片机的简单数字电压表)

电⼦测量⼤作业(基于C51单⽚机的简单数字电压表)基于单⽚机的简易数字电压表的设计⼀、概述本课题设计是⼀种基于单⽚机的简易数字电压表的设计。
该设计主要由三个模块组成:A/D转换模块,数据处理模块及显⽰模块。
A/D转换主要由芯⽚ADC0808来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。
数据处理则由芯⽚AT89C51来完成,其负责把ADC0808传送来的数字量经过⼀定的数据处理,产⽣相应的显⽰码送到显⽰模块进⾏显⽰;此外,它还控制着ADC0808芯⽚⼯作。
⼆、主要芯⽚1、ADC0808 主要特性ADC0808是CMOS单⽚型逐次逼近式A/D转换器,带有使能控制端,与微机直接接⼝,⽚内带有锁存功能的8路模拟多路开关,可以对8路0-5V输⼊模拟电压信号分时进⾏转换,由于ADC0808设计时考虑到若⼲种模/数变换技术的长处,所以该芯⽚⾮常适应于过程控制,微控制器输⼊通道的接⼝电路,智能仪器和机床控制等领域。
ADC0808主要特性:8路8位A/D转换器,即分辨率8位;具有锁存控制的8路模拟开关;易与各种微控制器接⼝;可锁存三态输出,输出与TTL兼容;转换时间:128µs;转换精度:0.2%;单个+5V电源供电;模拟输⼊电压范围0- +5V,⽆需外部零点和满度调整;低功耗,约15mW。
ADC0808芯⽚有28条引脚,采⽤双列直插式封装,其引脚图如图3所⽰。
图1 ADC0808引脚图下⾯说明各个引脚功能:IN0-IN7(8条):8路模拟量输⼊线,⽤于输⼊和控制被转换的模拟电压。
地址输⼊控制(4条):ALE: 地址锁存允许输⼊线,⾼电平有效,当ALE为⾼电平时,为地址输⼊线,⽤于选择IN0-IN7上那⼀条模拟电压送给⽐较器进⾏A/D转换。
ADDA,ADDB,ADDC: 3位地址输⼊线,⽤于选择8路模拟输⼊中的⼀路,其对应关系如表1所⽰:表1 ADC0808通道选择表START:START为“启动脉冲”输⼊法,该线上正脉冲由CPU送来,宽度应⼤于100ns,上升沿清零SAR,下降沿启动ADC⼯作。
基于51单片机的电子式单相智能电表设计

山东农业大学毕 业 论 文 基于51单片机的电子式单相智能电表设计 院系: 机械与电子工程学院 专业班级: 电气工程及其自动化专业三班 届次:20**届 学生姓名: 学号: 指导教师: 二0**年六月六日……………………. ………………. …………………装订线……………….……. …………. …………. ………目录引言 (3)1传统电能表 (3)1.1电能表的发展 (3)1.2 电能表的发展前景 (3)2 智能电能表 (4)2.1智能电表的概念 (4)2.2 智能电能表的典型结构 (4)2.3智能电表的主要特点 (4)3系统设计的基本思路和具体设计任务以及结构框图 (4)3.1系统设计的基本思路 (4)3.2具体设计任务 (5)3.3 系统结构框图 (5)4系统硬件电路设计 (6)4.1 计量芯片ADE7757 (6)4.1.1 ADE7757功能及特点概述 (6)4.1.2 ADE7757计量芯片的内部结构和各引脚功能 (6)4.1.3 ADE7757的原理特性 (7)4.1.4 ADE7757与单片机的接口 (8)4.2电能计量电路设计 (8)4.2.1电压采集通道设计 (9)4.2.2电流采集通道设计 (10)4.2.3计量芯片与单片机之间连线 (11)4.3单片机外围电路设计及器件选择 (11)4.3.1 单片机STC89C52概述、引脚配置及功能概述 (11)4.3.2 单片机控制电路最小系统 (13)4.3.3 LCD显示器模块设计 (14)4.3.3.1 LCD显示器工作原理简介 (14)4.3.3.2 芯片1602简介 (14)4.3.3.3 显示电路设计 (16)4.3.4 数据存储模块设计 (16)4.3.4.1芯片24C02简介 (16)4.3.4.2 存储模块电路设计图 (17)4.3.5时钟模块设计 (18)4.3.5.1 DS1302简介 (18)4.3.5.2 时钟电路设计 (19)4.3.6 通信模块设计 (19)4.3.6.1单片机串行通信基础 (19)4.3.6.2 RS232串行口标准简介 (20)4.3.6.3 MAX232简介 (20)4.3.6.4 接口电路设计 (21)4.3.7 电源模块设计 (21)5 系统软件程序流程图以及上位机设计 (23)5.1主程序设计框图 (23)5.2 功率计量流程图 (23)5.3 按键查询流程图 (25)5.4上位机设计 (25)6 总结 (26)参考文献 (27)致谢 (28)附录 (29)ContentsAbstracts (1)Introduction (1)1Traditional meters (1)1.1 The development of meters (1)1.2 The prospects of meters (2)2 Smart meters (2)2.1The concept of smart meters (2)2.2 The typical structure of smart meters (2)2.3The main features of smart meters (3)3The basic idea of system design and detailed design tasks and structure diagram (3)3.1The basic idea of system design (3)3.2The detailed design tasks (3)3.3 System structure diagram (4)4System hardware circuit design (4)4.1 Metering chip ADE7757 (4)4.1.1 ADE7757 functions and features Overview (5)4.1.2 ADE7757 chip's internal structure and function of each pin (6)4.1.3 The principle of ADE7757 (6)4.1.4ADE7757 and microcontroller interface (6)4.2 Energy Metering Circuit Design (7)4.2.1Design of voltage acquisition channels (8)4.2.2Design of the current acquisition channel (9)4.2.3Metering connection between the chip and the microcontroller (9)4.3 Single-chip peripheral circuit design and component selection (9)4.3.1 SCM STC89C52 overview, pin configuration and function overview .. 124.3.2 Minimum System of MCU control circuit (13)4.3.3 LCD display module design (13)4.3.3.1 LCD monitor works Introduction (13)4.3.3.2 Chip 1602 Introduction (14)4.3.3.3 Display circuit design (15)4.3.4 Design Data storage module (15)4.3.4.1 Chip 24C02 Introduction (16)4.3.4.2 The memory module circuit design (16)4.3.5Clock Module Design (16)4.3.5.1 DS1302 Introduction (17)4.3.5.2 Clock circuit design (18)4.3.6 Communication Module (18)4.3.6.1Serial communication infrastructure (18)4.3.6.2 RS232 serial port standard profiles (19)4.3.6.3 MAX232 Introduction.................................. 错误!未定义书签。
基于51单片机的电压表的设计

引言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。
而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。
数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。
由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用[1]。
传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。
采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。
数字电压表是诸多数字化仪表的核心与基础[2]。
以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。
目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。
最近的几十年来,随着半导体技术、集成电路(IC)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型[3]。
数字电压表从1952年问世以来,经历了不断改进的过程,从最早采用继电器、电子管和形式发展到了现在的全固态化、集成化(IC化),另一方面,精度也从0.01%-0.005%。
目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面[4]。
本文是以简易数字直流电压表的设计为研究内容,本系统主要包括三大模块:转换模块、数据处理模块及显示模块。
其中,A/D转换采用ADC0808对输入的模拟信号进行转换,控制核心AT89C51再对转换的结果进行运算处理,最后驱动输出装置LED显示数字电压信号[5]。
1 设计总体方案1.1设计要求:完成系统的硬件电路设计与软件设计; 采用汇编或C 语言编程;采用Proteus 、KeilC 等软件实现系统的仿真调试。
基于单片机的智能电表设计

基于单片机的智能电表设计发布时间:2023-03-23T02:58:46.032Z 来源:《中国科技信息》2023年第1期作者:樊延鹏[导读] 基于单片机的多功能智能电表的设计用STC89C51单片机作为主要控制核心,由以稳压器控制整个系统电压稳定的电源电路、电流互感器和电压互感器和电能计量芯片对被测数据的采集与计算、LCD12864进行相关要求的显示、时钟芯片、外部寄存器、蜂鸣器,矩阵键盘等共同组成。
樊延鹏哈尔滨剑桥学院 150060基于单片机的多功能智能电表的设计用STC89C51单片机作为主要控制核心,由以稳压器控制整个系统电压稳定的电源电路、电流互感器和电压互感器和电能计量芯片对被测数据的采集与计算、LCD12864进行相关要求的显示、时钟芯片、外部寄存器、蜂鸣器,矩阵键盘等共同组成。
具有对被测电能的实时采集与处理,并对超过上下限的电流与电压进行报警提示,拥有实时电能的显示,并具有存储电能的相关数据等功能。
一、总体方案设计1、电能测量计量模块在生活中,如果主控系统作为智能电表的心脏,电能测量计量可以说是智能电表的灵魂。
根据现今电表基本的电能计量的功能,本次设计也将对这一模块着重处理,本模块的设计将会影响测量计量的精度,效率。
因此在本模块的设计中,我们将采取外围电路过滤采集,芯片作为主要数据处理的方式进行设计。
2、外部扩展存储模块对于传统的普通用户电能表,只进行了单一得数据显示,基本不对过往数据进行存储,因此在本次设计中,我们改变传统的缺点,将每次的用电量记录保存起来,方便用户查看过往电能数据,为用户提供便利,这一模块设计我们可以直接将数据存储与89C51的EEPROM 中,或可以外部扩展存储器对数据进行存储。
3、外部时钟模块外部时钟模块的设计,主要的用途在于提供一个实时性,外部时钟的建立可以提供我们生活中的正常年月日时间,方便用户通过时间性了解电能数据情况,外部时钟的设计,在主控系统掉电后,其依然可以继续运行对时间的更新。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <reg51.h>//AD7135直接与单片机相连采用查询的方法多路#include <absacc.h> #include <intrins.h>#define ucharunsigned char#define uintunsigned int#define ulongunsigned long#define ADP2#define ADP0#define CD4051P1#define fosc12//晶振频率#define time02000//定时2000us#define jishu1000//假设AD输入电压与对应瞬时功率的基数//1V对应1000w uint idata jisuandu;//临时变量,用于计算电度数uint idata time0_0;//临时变量,用于计算定时sbit STAT7135= P1^7;// 7135的启动端sbit busy= P2^6;// 7135的忙端sbit st= P2^5;// 7135的选通端sbit CS7221= P1^5;// 7221的片选sbit DIN7221 = P1^4;// 7221的数据端sbit CLK7221 = P1^6;// 7221的时钟端sbit SDA=P3^1;//2416的数据端sbit SCL=P3^0;//2416的时钟端//sbit en_24c16=P3^4;uchar DISPBUF[8]={0,1,2,3,4,5,6,7};//显示缓冲区uchar ADBUF[40]=0;//AD缓冲区(万千百十个)*8uchar TIME[2]=0;//用于定时uchar BUF[5]=0;//数据处理缓冲区void delay(uint n);//延时子程序void Initial7221(void);//MAX7221初始化void WR7221(uchar addr,uchar Data);//MAX7221写程序void Max7221Display(uchar *buffer);//MAX7221显示程序void time2ms(void);//定时器0初始化程序void time0_int(void);//定时器0中断服务程序void ICL7135(void);//ICL7135 8路信号AD转换程序void SAVE(void);//电量存储转电度程序void start_bit(void);//IIC开始条件void stop_bit(void);//IIC停止条件void mast_ack(void);//IIC应答bit write_8bit(uchar ch);//IIC写8位数据uchar read24c16(uint address,uchar *shu);//IIC读字节数据uchar write24c16(uint address,uchar ddata);//IIC写字节数据uchar page_wr(uint firstw_ad,uint counter,uchar *firstr_ad);//IIC页写uchar page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad);//IIC页读main(){//while(page_wr(0,120,0)==0);Initial7221();Max7221Display(&DISPBUF[0]);delay(40);time2ms();while(1){if(TIME[1]%10==0){ICL7135();SAVE();}}}void WR7221(uchar addr,uchar Data){uchar i;CS7221= 0;for (i=0;i<8;i++){CLK7221 = 0;DIN7221 = (addr&(0x80>>i)) ? 1:0;_nop_();_nop_();CLK7221 = 1;_nop_();_nop_();}for (i=0;i<8;i++){CLK7221 = 0;DIN7221 = (Data&(0x80>>i)) ? 1:0;_nop_();_nop_();CLK7221 = 1;_nop_();_nop_();//初次使用时清电量数//初始化7221//开机默认显示0~7//xx//启动定时器//5秒时间到//启动8路AD转换//存储电能//MAX7221的写子程序//片选有效//写8位地址//时钟低//先发高位依次到低位//时钟高上升沿锁数据//写8位数据//时钟低//先发高位依次到低位//时钟高上升沿锁数据}CS7221= 1;//片选无效}voidInitial7221(void)//MAX7221初始化{WR7221(0x0A,0x0A);//亮度地址0AH,0x00~0x0F,0x0F最亮WR7221(0x0B,0x07);//扫描LED个数地址0BH,0x00~0x07,最多扫描8个数码管WR7221(0x0C,0x01);//工作模式地址0x0C. 0x00:关断;0x01:正常WR7221(0x09,0xFF);//编码模式地址0x09. 0x00~0xFF:哪一位为1,哪一位就支持编码}void Max7221Display(uchar *buffer)//MAX7221显示子程序{uchar i;for (i=0;i<8;i++)//MAX7221的8个数码管显示{WR7221(i+1,*(buffer+i));//调MAX7221的写子程序}}void delay(uint n)//延时程序{uint i,j;for (i=0;i<n;i++)for (j=0;j<1140;j++);}void time2ms(void)//T0定时器初始化{TMOD=0x01;// T0工作方式1/* 2ms定时设置*/time0_0 = 65536-time0*fosc/12;//计算初值//装定时器0初值TL0=(time0_0%256);TR0=1;//启动定时器0ET0=1;//打开定时器0xxEA=1;//打开总中断}/*定时器0中断服务子程序,定时用于AD转换1s约转换3次,8路信号约3s时间为了时间充裕5s采集一次电能信号*/void time0_int(void) interrupt 1{//重装定时器0初值TL0=(time0_0%256);TIME[0]++;if (TIME[0]==250)//250*2ms=500ms=0.5s时间到{TIME[0]=0;//到0.5s时TIME[0]清0TIME[1]++;//TIME[1]加1内存的0.5秒的整数倍}}void ICL7135(void)//启动8路AD转换{uchar i,j;STAT7135=1;//7135启动端使能启动AD转换CD4051=CD4051&0xf0;//设置CD4051的第一路信号输入ADfor (j=0;j<=7;j++)//8路循环测量{i=CD4051&0xf0;//读P1口的状态保护高位CD4051=j|i;//通过j调节多路开关的转换STAT7135=1;//7135启动端使能启动AD 转换i=busy;//读7135的正在转换忙端do{i=busy;}while(busy==0);//忙端为0时等待直到开始转换do{i=busy;}while(busy==1);//忙端为1时正在转换等待STAT7135=0;//7135禁止AD转换do{i=ADP2;}while((ADP2&0x010)!=0x010);//读7135的D5,直到D5为1if ((ADP2&0x010)==0x010)//D5为1开始读AD转换结果{//STAT7135=0;ADBUF[j*5]=ADP0&0x0f;//读7135的万位do{i=ADP2;}while((ADP2&0x08)!=0x08);//读7135的D4,直到D4为1ADBUF[1+j*5]=ADP0&0x0f;//读7135的千位do{i=ADP2;}while((ADP2&0x04)!=0x04);//读7135的D3,直到D3为1ADBUF[2+j*5]=ADP0&0x0f;//读7135的百位do{i=ADP2;}while((ADP2&0x02)!=0x02);//读7135的D2,直到D2为1ADBUF[3+j*5]=ADP0&0x0f;//读7135的十位do{i=ADP2;}while((ADP2&0x01)!=0x01);//读7135的D1,直到D1为1ADBUF[4+j*5]=ADP0&0x0f;//读7135的个位//ADBUF[0]=j+1;//路号//Max7221Display(&ADBUF[j*5]);//当频率慢时可以显示AD转换的结果}}}void SAVE(void)//电能处理保存{uchar k,i;ulong kk,kk1,kk2;if (TIME[1]<120)//小于1分钟时120*0.5=60s简单加{for (k=0;k<=7;k++)//8路电能循环存储{while(page_rd(k*5,5,&BUF[0])==0);//读原来的电能各路5位数字for(i=0;i<=4;i++){BUF[i]=BUF[i]+ADBUF[i+k*5];//本次的电能和原来的电能求和}while (page_wr(k*5,5,&BUF[0])==0);//存新的总电能}}if (TIME[1]==120)//等于1分钟时做电度数的处理{TIME[1]=0;for (k=0;k<=7;k++)//8路电能循环转换成电度数存储{while (page_rd(k*5,5,&BUF[0])==0);//读原来的电能各路5位数字for(i=0;i<=4;i++){BUF[i]=BUF[i]+ADBUF[i+k*5];//本次的电能和原来的电能求和}while (page_wr(k*5,5,0)==0);//清寄存的电能kk=(ulong)BUF[0]*100+(ulong)BUF[1]*1000+(ulong)BUF[2]*100+(ulong)BUF[3]* 10+(ulong)BUF[4];//把电能转化为千瓦时即度while(page_rd(100+k*2,2,&BUF[0])==0);//读上次余数kk=kk*jishu+(ulong)BUF[0]*100+(ulong)BUF[1];//(jishu*1000)/(100*12*60)=jishu/7200kk1=kk/7200;//取电度数kk2=kk%7200;//kk1为电度数kk2余数//分两部分存储电度的余数100为界BUF[1]=(uchar)(kk2%100);while(page_wr(100+k*2,2,&BUF[0])==0);//电度的存余数while (page_rd(50+k*5,5,&BUF[0])==0);//读原来电度数kk1=kk1+(ulong)BUF[0]*100+(ulong)BUF[1]*1000+(ulong)BUF[2]*100+(ulong)B UF[3]*10+(ulong)BUF[4];//原来的电度和新的电度数相加//万BUF[1]=(uchar)((kk1%100)/1000);//千BUF[2]=(uchar)(((kk1%100)%1000)/100); //百BUF[3]=(uchar)((kk1%100)/10);//十BUF[4]=(uchar)((kk1%100)%10);//个while(page_wr(50+k*5,5,&BUF[0])==0);//存新电度数DISPBUF[0]=k+1;//显示户号DISPBUF[1]=0xf;//显示2个FDISPBUF[2]=0xf;DISPBUF[3]=BUF[0];//显示此时电度数DISPBUF[4]=BUF[1];DISPBUF[5]=BUF[2];DISPBUF[6]=BUF[3];DISPBUF[7]=BUF[4];Max7221Display(&DISPBUF[0]);//送显示delay(20);//延时}}}/*----------------------------------------------- 调用方式:void start_bit(void)函数说明:开始位-----------------------------------------------*/void start_bit(void){SCL=1;_nop_();SDA=1;_nop_();SDA=0;_nop_();SCL=0;_nop_();}/*----------------------------------------------- 调用方式:void stop_bit(void)函数说明:停止位-----------------------------------------------*/void stop_bit(void){SDA=0;_nop_();SCL=1;_nop_();SDA=1;_nop_();}/*----------------------------------------------- 调用方式:void mast_ack(void)函数说明:主答函数-----------------------------------------------*/void mast_ack(void){SCL=0;_nop_();SDA=0;_nop_();SCL=1;_nop_();SCL=0;_nop_();SDA=1;_nop_();}/*----------------------------------------------- 调用方式:write_8bit(uchar ch)函数说明:写一个字节(8位)数据-----------------------------------------------*/bit write_8bit(uchar ch){uchar i=8;bit fan_w;SCL=0;_nop_();while (i--){SDA=(bit)(ch&0x80);_nop_();ch<<=1;SCL=1;_nop_();SCL=0;_nop_();}SDA=1;_nop_();SCL=1;_nop_();fan_w=SDA;SCL=0;_nop_();return(fan_w);}/*----------------------------------------------调用方式:uchar read24c16(uint address,uchar *shu)函数说明:读24c16指定地址数据(字节读)-----------------------------------------------*/uchar read24c16(uint address,uchar *shu){uchar data rdata; uchar i=8;EA=0;//避免与串口通讯等xx冲突start_bit();if (write_8bit(0xA0)!=0){stop_bit();EA=1;return(0);}if (write_8bit(address)!=0){stop_bit();EA=1;return(0);}start_bit();if (write_8bit(0xA1)!=0){(0);}while (i--){rdata<<=1;SCL=1;_nop_();if (SDA) rdata|=0x01;SCL=0;_nop_();}stop_bit();EA=1;*shu=rdata;return(1);}/*-----------------------------------------------调用方式:void write24c16(uint address,uchar ddata)函数说明:写数据到24c16的指定地址(字节写)-----------------------------------------------*/uchar write24c16(uint address,uchar ddata){EA=0;//避免与串口通讯等中断冲突start_bit();if (write_8bit(0xA0)!=0){stop_bit();EA=1;return(0);}if (write_8bit(address)!=0){stop_bit();EA=1;return(0);}if (write_8bit(ddata)!=0){(0);}stop_bit();EA=1;return(1);}/*-----------------------------------------------调用方式:void page_wr(uint firstw_ad,uint counter,uint data *firstr_ad)函数说明:页面写函数,firstw_ad为写入字节单元的首地址,*firstr-ad为被写入数据所在首地址指针counter为写入数据字节数-----------------------------------------------*/uchar page_wr(uint firstw_ad,uint counter,uchar *firstr_ad){uchar data *ufirstr_ad;ufirstr_ad=firstr_ad;start_bit();if (write_8bit(0xA0)!=0){stop_bit();return(0);}if (write_8bit(firstw_ad)!=0){stop_bit();return(0);}while (counter--){if (write_8bit(*ufirstr_ad)!=0){stop_bit();return(0);}ufirstr_ad++;}stop_bit();return(1);}/*-----------------------------------------------调用方式:void page_rd(uint firstrd_ad,uint count,uint firstwr_ad)函数说明:页面读函数,firstrd-ad为所读字节首地址,count为读字节数*ufirstwr-ad为读出数据存储首地址指针-----------------------------------------------*/uchar page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad){uchar j=8; uchar data *ufirstwr_ad;ufirstwr_ad=firstwr_ad;start_bit();if (write_8bit(0xA0)!=0){stop_bit();return(0);}if (write_8bit(firstrd_ad)!=0){stop_bit();return(0);}start_bit();if (write_8bit(0xA1)!=0){stop_bit();return(0);}while (count--){uchar i=8;while (i--){(*ufirstwr_ad)<<=1;SCL=1;_nop_();if (SDA) (*ufirstwr_ad)|=0x01;SCL=0; _nop_();}ufirstwr_ad++;mast_ack();}while (j--){(*ufirstwr_ad)<<=1; SCL=0;_nop_();_nop_();SCL=1;if (SDA) (*ufirstwr_ad)|=0x01;}stop_bit(); return(1);}。