多用户电子式电能表的设计程序
- 格式:doc
- 大小:53.50 KB
- 文档页数:11
$NOMOD51$include (c8051f360.inc)CLK EQU P1^1;//LED 时钟DA TE EQU P1^0;//LED 数据PB0 EQU P2.0PB1 EQU P2.1PB2 EQU P2.2PB3 EQU P2.3PB4 EQU P2.4PB5 EQU P2.5PB6 EQU P2.6PB7 EQU P2.7ORG 00HLJMP MAINORG 0BHLJMP T0_INTORG 0100H////////主程序///MAIN:LCALL CHUSHILCALL RD01MAIN1: MOV 20H,P2 ; 读取外部P2口状态MOV TMOD,#01HMOV TH0,#0D5HMOV TL0,#0A0H ; 利用计数器T0读取外部脉冲SETB ET0SETB EASETB TR0BEGIN:MOV R0, #60HMOV R7, #1HLOOP:MOV A,@R0MOV B,#10DIV ABPUSH ACCMOV A,BLCALL XS;显示个位POP ACCMOV B,#10DIV ABPUSH ACCMOV A,BLCALL XS;显示十位POP ACCMOV B,#10DIV ABPUSH ACCMOV A,BLCALL XS;显示百位POP ACCMOV B,#10DIV ABPUSH ACCMOV A,BLCALL XS;显示千位MOV A,#10LCALL XS;显示—MOV A,R7LCALL XS;显示户名LCALL XSLCALL XSINC R0INC R7LCALL DELAYCJNE R7, #9, LOOPLCALL WR01LJMP BEGIN////////初始化程序//////CHUSHI: //MOV SFRPGEN,#01HMOV SFRPAGE,#0FHMOV P1MDIN,#0FFHMOV P1MDOUT,#0EFH ;推挽输出MOV XBR1,#40H ;交叉开关使能MOV PCA0MD,#00H ;关闭看门狗clear Watchdog Enablei//MOV FLKEY,#0a5HMOV PSCTL,#13HMOV OSCICN,#83H ;内部振荡器允许,不分频RET/////////中断子程序///////T0_INT: MOV TH0, #0D5HMOV TL0, #0A0HPUSH ACCMOV A, 20HMOV 20H, P2JNB ACC.0, BJ1NEXT1: JNB ACC.1, BJ2 ;判断外部脉冲的状态NEXT2: JNB ACC.2, BJ3 ;判断外部脉冲的状态NEXT3: JNB ACC.3, BJ4 ;判断外部脉冲的状态NEXT4: JNB ACC.4, BJ5 ;判断外部脉冲的状态NEXT5: JNB ACC.5, BJ6 ;判断外部脉冲的状态NEXT6: JNB ACC.6, BJ7 ;判断外部脉冲的状态NEXT7: JNB ACC.7, BJ8 ;判断外部脉冲的状态JMP DONEBJ1: JB PB0,ADD1 ;与原来外部的状态进行比较JMP NEXT1 ;若相等则继续读外部状态BJ2: JB PB1,ADD2 ;若不等则相应的用户的脉冲数加一JMP NEXT2BJ3: JB PB2,ADD3JMP NEXT3BJ4: JB PB3,ADD4JMP NEXT4BJ5: JB PB4,ADD5JMP NEXT5BJ6: JB PB5,ADD6JMP NEXT6BJ7: JB PB6,ADD7JMP NEXT7BJ8: JB PB7,ADD8JMP DONEADD1: INC 60HJMP NEXT1ADD2: INC 61HJMP NEXT2ADD3: INC 62HJMP NEXT3ADD4: INC 63HJMP NEXT4ADD5: INC 64HJMP NEXT5ADD6: INC 65HJMP NEXT6ADD7: INC 66HJMP NEXT7ADD8: INC 67HDONE:POP ACCRETI////////显示子程序////////////----------显示子程序----------------------XS: PUSH ACCMOV DPTR,#TABMOVC A,@A+DPTRMOV R4,#08hRR1: RRC AJC SET1JNC SET0SET1: CLR CLKSETB DATESETB CLKDJNZ r4,RR1JMP RETURN SET0: CLR CLKCLR DATESETB CLKDJNZ R4,RR1 RETURN: POP ACCRET///////延时子程序///////DELAY: MOV R2,#0ffHMOV R3,#0ffHMOV R5,#07H LOOP0001 : NOPDJNZ R2,CC01LJMP CC1CC01:LJMP LOOP0001CC1:DJNZ R3,CC02LJMP CC2CC02:LJMP LOOP0001CC2:DJNZ R5,CC03LJMP CC3CC03:LJMP LOOP0001CC3:RET////////往XRAM写数据子程序////////WR01: MOV EMI0CF ,#20HMOV DPTR,#0100HMOV R0,#60HMOV R7,#00HLOOP2:MOV A,@R0MOVX @DPTR , AINC DPTRINC R0INC R7CJNE R7,#08,LOOP2RET///////读XRAM的数据//////RD01: MOV EMI0CF , #00HMOV DPTR , #0100HMOV R7 , #00HMOV R0 , #60HLOOP3 :MOVX A,@DPTRMOV @R0 , AINC R0INC DPTRINC R7CJNE R7 , #08H , LOOP3RET///////TAB 数据列表////TAB:DB 88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,08H,09H,7FH END。
DTSD1277型DSSD1277-B型三相电子式多功能电能表使用说明书安装、使用产品前请阅读使用说明书石家庄科林自动化有限公司目录1概述 ....................................................................................................................................错误!未定义书签。
2工作原理 ............................................................................................................................错误!未定义书签。
3技术参数 ............................................................................................................................错误!未定义书签。
3.1主要型号 ...............................................................................................................................错误!未定义书签。
3.2主要技术参数 .......................................................................................................................错误!未定义书签。
3.3抄表及全失压电池 ...............................................................................................................错误!未定义书签。
多用户电表更多关注公....众....号民熔电气集团回复电气获取更多电气行业资料关于商场、写字楼类多用户电能表应用的探讨摘要:随着我国经济的发展,能源瓶颈问题将更加突出。
其中电力能源存在着极大的浪费与安全控制问题。
针对目前情况,多用户电能表应运而生,它在传统电表的计量基础上,又增加了一系列功能,使得多用户电表在人们的生活中起着越来越重要的节能监测作用。
同时,多用户电表的使用,也为经济的可持续发展做出了一定的贡献。
关键字:多用户电表;节能;体积小;防窃电;安全1、(1)每户电能计量单元:主要由电压、电流采样和专用电能表芯片(如BL0932B、 ADE7755等)构成。
它的任务是完成每个用户的用电量累积、存储,并同时将电量转换成相应的脉冲分别输出或送入单片机处理。
户电能计量单元,集中安装在一个印刷电路板上,其面积比一个纸烟盒还小,每户一块,每户单独计量,互不影响。
多用户电能表的概念多用户电能表即多用户全电子式电能表,也叫集群电表符合我国国情我国居民住宅或公寓多以楼房为主。
一座楼一般含几个单元,而每个单元少者一般近十户、十几户,多者几十户。
针对上述情况,为了便于抄表和用电管理,目前一些物业管理部门将多个单块表集中安装在楼梯间。
这样简单的组合造成体积庞大、不美观又不经济。
设计一种体积小、功能全又经济的集中式多用户全电子式电能表十分必要。
(2)单片机系统:它是一个智能数据采集处理和控制单元。
整个系统安装在一个见方约200*80mm2的印刷电路板上。
它的任务是接收并存储各用户电量,经处理后控制公用显示器,定时、轮流显示各户用(或剩余)电量,控制对外通信,完成抄表或远控等工作。
(3)输出部分:主要包括公用显示器和对外通信、控制接口等。
2、我国普通电能表占用空间大普通电能表,由于是一块表控制一户,所以每一户都必须单独配置一块电能表。
可想而知,在一栋大楼里,会有若干房间,那就意味着需要若干块电能表,若把这些电能表放在一起计算,需要占去很大的空间。
毕业论文(设计)题目名称:用单片机C语言实现多功能电能表通信协议(电能表端)题目类型:毕业设计学生姓名:院(系):电子信息学院专业班级:指导教师:辅导教师:时间:20GG年2月21日至20GG年06月10目录长江大学毕业论文(设计)任务书 (I)长江大学毕业论文(设计)开题报告....................................................................................... I II 长江大学毕业论文(设计)指导教师评审意见 ..................................................................... IG 长江大学毕业论文(设计)评阅教师评语............................................................................... G 长江大学毕业论文(设计)答辩记录及成绩评定 ................................................................. GI 摘要.......................................................................................................................................... G II Abstract ................................................................................................................................. G III 第一章前言 .. (1)第二章选题背景 (2)2.1行业现状及发展趋势 (2)2.2选题任务 (3)第三章方案论证 (5)3.1DL/T645-20GG《多功能电能表通信协议》介绍 (5)3.2整体设计思想 (8)3.3单片机的串行口简介 (8)3.4单片机多机通信系统相关理论 (14)3.5通信接口的选择 (15)3.6微控制器的选择 (19)3.7软件环境 (20)第四章设计论述 (22)4.1硬件原理图设计 (22)4.2软件设计 (22)第五章结果分析 (37)第六章设计总结 (38)6.1工作总结 (38)6.2存在的不足 (38)6.3设计展望 (39)参考文献 (39)致谢 (41)附录 (42)长江大学毕业论文(设计)任务书学院(系)电子信息学院专业电气工程及其自动化班级学生姓名指导教师/职称1.毕业论文(设计)题目:用单片机C语言实现多功能电表通信协议(电能表端)2.毕业论文(设计)起止时间:20GG年12月18日~20GG年6月10日3.毕业论文(设计)所需资料及原始数据(指导教师选定部分)1)DL/T645协议4.毕业论文(设计)应完成的主要内容1)学习单片机汇编和C语言编程2)熟悉单片机串口通信相关知识3)编程实现DL/T645多功能表通信协议(电能表端)5.毕业论文(设计)的目标及具体要求1)学习单片机汇编和C语言编程2)熟悉单片机串口通信相关知识3)编程实现DL/T645多功能表通信协议(电能表端)6、完成毕业论文(设计)所需的条件及上机时数要求120学时任务书批准日期20GG 年12月日教研室(系)主任(签字)任务书下达日期20GG 年12月18日指导教师(签字)完成任务日期20GG 年6 月10日学生(签名)长江大学毕业设计开题报告题目名称用单片机C语言实现多功能电能表通信协议(电能表端)题目类别毕业设计院(系)电子信息学院专业班级电气10703学生姓名指导教师辅导教师开题报告日期20GG年3月14 日用单片机C语言实现多功能电表通信协议(电能表端)学生:电子信息学院指导教师:电子信息学院1题目来源题目来源:生产/社会实际2研究目的和意义电能是最重要的能源,它的应用在生产技术上曾引起划时代的变革。
多用户电能表的应用设计课程设计报告专业:电气工程及其自动化摘要电子式电能表是通过对用户供电电压和电流实时采样,采用专用的电能表集成电路,对采样电压电流信号进行处理并相乘转换成与电能成正比的脉冲输出,通过计度器或数字显示器显示用户使用的电量。
本文将设计一个以C8051F360芯片为核心,配有电能转换模块、LED显示模块、掉电存储模块等功能模块,实现对八户的用电状况进行采集检测。
本次设计用户数为八户,即实现八位用户循环显示电能量。
同时,基于E2PROM 24C16芯片实现单片机的掉电数据保护,基于74HC165芯片实现单片机的清零。
基于AD7755芯片实现电能脉冲的发生;应用单片机C8051F360编制程序完成脉冲的读取、计数、计算、存储、送显示等功能;应用74HC164及八段译码显示器完成数据的显示;应用74HC165及键盘控制对脉冲清零;应用E2PROM 24C16完成数据的定时写入以防停电时数据丢失。
关键词:8用户电能表;AD7755;24C16;C8051F360ABSTRACTElectrical meter is through user power supply voltage and current real-time sampling, using special integrated circuit of electric energy meter, the sampling voltage current signal processing and multiplication convert to electric proportional to the pulse output, through the JiDuQi or digital display shows users with the use of the power. This paper will design a C8051F360 chips as the core, equipped with electric energy conversion module, LED display module, power lost storage module function module, realizes to eight of the power consumption and the collection detection.The design for the eight users at home, which realize the eight users cyclic display electric energy. At the same time, based on the single chip microcomputer chip realize 24 y E2PROM chips was the power lost data protection, based on the 74 HC165 chip microcontroller cleared of realization.Based on AD7755 chip realize the energy pulsing occur; C8051F360 single chip microcomputer application program to complete pulse to read, counting, computation, storage, send display function; Application HC164 and eight section 74 decoding display finish data display; 74 HC165 keyboard control and application of pulse reset; Application E2PROM chips was complete data of the timing 24 y write in case of power data is lost.Keywords:electric energy meter;8 the user watt-hour meter;AD7755;24C16;C8051F360目录1 设计目的及要求 (1)1.1设计目的 (1)1.2设计要求 (1)2 设计容 (1)2.1设计系统方案 (1)2.2设计系统框图 (2)3 硬件电路设计 (2)3.124C16功能介绍 (2)3.2六段数码管显示电路 (3)3.3C8051F360功能介绍 (4)3.45V稳压电源的设计 (5)3.5光电隔离电路 (5)3.6AD7755电路设计 (6)4 软件电路设计 (12)4.1主程序流程图设计 (12)4.2显示用户及相应电能子程序框图 (13)4.3读24C16子程序框图 (14)4.4写24C16子程序流程图 (15)4.5查询键盘流程图 (16)4.6中断子程序流程图 (17)5 结束语 (18)致: (18)参考文献 (19)附录 (20)1 设计目的及要求1.1设计目的设计多用户电能表,掌握单片机在电力系统中的应用,并且可以通过计算机的编程实现对户的用电状况进行显示,进一步熟练单片机编程,了解24C16的功能实用。
多用户电子式单相电能表设计【摘要】多用户电子式单相电能表采用单片机作为中央处理器,每块电能表可对多达24 户的用电情况进行集中检测、循环显示。
各户的用电量可以就地读取。
多用户电子式电能表采用了“分户用电、集中检测”的方式,与传统感应式电能表相比,有效地提高了电能计量的准确性,而且整机体积小、质量轻、安装方便。
【关键词】多用户;电子式;单相电能表一、AD7755设计方案AD7755是美国模拟器件公司生产的用于功率测量或电能计量的专用集成电路,是目前电子式电子表的核心芯片之一。
1.主要特性●高精度●具有平均有功功率脉冲输出口(F1、F2)●具有瞬时有功功率脉冲输出口(CF)●负向有功功率指示●在电流通道中具有可编程增益放大器(PGA)●电源监控功能●内置2.5V的电压基准值(典型值:55ppm/℃)●单电源工作,低功耗●CMOS工艺2.内部结构和工作原理内部结构框图如图1所示:图1AD7755是一个24脚的芯片,内部结构框图如图1所示。
从图中可以看出,AD7755由模数转换电路(ADC)和信号处理电路两部分组成。
ADC二部分包括电流采样通道和电压采样通道。
电流采样通道有可编程增益放大器(PGA),它分为xl、x2、x8、X16四档。
电压监控单元和基准电压源单元电路也在此部分。
两个通道的16位ADC分别对负载电流和电压信号进行模数转换。
信号处理部分包括相位补偿网络、HPF、乘法器、LPF及数字一频率转换器等。
由于AD7755对采样的两路模拟信号先进行模数转换,然后再相乘,故在外界环境恶劣的条件下仍可保证良好的性能指标和长期的稳定性。
AD7755的各项指标均满足IEC1036或GB/T 17215-1998标准要求。
二、+5V稳压电源电源是电能表设计的重要部分,其设计的好坏对整个系统的性能有较大影响。
本设计使用的稳压电源是由MC7805实现的,输入电压220V,输出电压+5V 。
集成三端稳压器稳压精度高、工作稳定可靠、外围电路简单、容易设计和制作、体积小、重量轻、成本低、维修简单。
结课报告课程名称:智能仪器及仪表技术项目名称:电子式电能表电路的设计与实现专业:12级电气工程班级:一班学号:姓名:姚翔任课教师:魏颖备注:完成日期:年月日电子式电能表电路的设计与实现1、方案叙述1.1 设计功能要求设计制作一只交流电能表表,设计的主要要求如下:(1)该交流电能表能实现对单相交流电能的测量;(2)电表参数:额定电压220V,额定电流5A,最大电流10A,最大计度容量:99999.99Kw.h;(3)能测量并显示当前的功率、电压和电流的有效值;(4)显示当前日期和时间,具有分时计量功能;(5)可以与PC机进行串行通信,并可用键盘控制,便于操作;(6)电量脉冲输出;(7)停电不丢失电能数据;1.2系统的基本方案该系统主要由显示模块、通讯模块、键盘控制模块、MCU模块、电能表芯片CS5460模块、时钟模块、存储器模块和前端电路调理模块部分组成。
前端电路调理模块采用变比1:1 的电流型电压互感器,电流模块采用变比2000:1 的电流互感器,利用取样电阻采样信号,经变换后的信号以差模电压的形式接到由CIRRUS LOGIC 公司生产的电能表芯片CS5460A,取样电阻的阻值由被测信号的最大值决定,然后经CS5460A转换后将电压、电流、功率、电能等信号传给单片机AT89S52,AT89S52组成的MCU模块控制所有芯片的工作、截止及计算和模块的显示,显示模块采用OCMJ4X8CM液晶模块,液晶正常显示当前测量的电能值、日期、时间,可通过键盘控制显示电压、电流有效值、功率等;通讯模块采用Max232芯片实现电能表与PC机之间的通信。
并接受PC上位机同步控制并与其通信,时钟模块采用DLS1302芯片,为电能表提供时间基准,为实现多费率打下基础,存储模块采用AT24C16,为系统提供数据存储,可以做到掉电不丢失数据,还可以实现电力系统参数的实时记录,该系统可以实现对电能等电参量测量、显示及采集处理的目的。
一、设计任务1、设计目的:通过计算机编程实现多用户电子式数码显示电能表的功能。
本次设计用户数为八户,即实现八位用户循环显示电能量。
同时,基于E2PROM 24C16芯片实现单片机的掉电数据保护。
2、设计要求:基于AD7755芯片实现电能脉冲的发生;应用单片机C8051F360编制程序完成脉冲的读取、计数、计算、存储、送显示等功能;应用74HC164及八段译码显示器完成数据的显示;应用E2PROM 24C16完成数据的定时写入以防停电时数据丢失。
二、设计内容1、硬件设计:(1)设计总体框图:(2)设计参数:基准电压:220V×±10%基准电流:Ib=5A最大电流:Imax=4Ib=20A计量精度:1%最小电流:Imin=2%Ib=0.1脉冲数:3200/kw.h(3)参数计算:①以AD7755设计的电能表的相关参数计算配合C8051F360芯片的16进制算法与课程设计的参数要求,参考基本电流与脉冲的建议数,选定基准电流Ib=5A,每kw.h计度需要的脉冲数为3200,即CF的输出为3200imp/ kw.h。
线路电压220V,基本电流Ib为5A,动态范围400(规定准确度的电流范围为2%Ib~Imax,即100mA~40A);计度器的电表常数C为3200imp/ kw.h,即AD7755发3200个脉冲,单片机记录1 kw.h电。
为满足电流通道的动态范围且留有充分的余量,选用350μΩ的分流器;以其将负载电流转换为电压,接V1P和V1N。
线路电压经电压分压器分压,也降到允许的最大电压范围之内,接V2P和V2N。
负载电流为基本电流(5A)时,线路的功耗为P=220×5=1.1 kw。
选择f1-4=3.4Hz,SCF=0,S1=0,=S0=1,此时CF频率为f1的32倍,所要求的频率恰为f1,f2段的脉冲计数标准为100imp/ kw.h。
乘以此常数得Ib情况下的输出频率:fF1=P×C=1.1×3200/3600=0.9777778Hz查AD7755数据表,所选择f1-4=3.4Hz,满足最大电流为40A 和再留有足够余量的要求。
#include<c8051f360.h>#include <intrins.h>#include <stdio.h>#define AT24C16 0xa0 //AT24C16 地址sbit DIN=P1^0; /*定义P1口*/sbit CLK=P1^1;sbit YH1=P2^0; /*定义P2口*/sbit YH2=P2^1;sbit YH3=P2^2;sbit YH4=P2^3;sbit YH5=P2^4;sbit YH6=P2^5;sbit YH7=P2^6;sbit YH8=P2^7;unsigned char a,b,c,d,e,f,g,h,m,i,j,k,n,z;unsigned char zf[]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x08,0x09,0xff,0x7f}; unsigned char yh[8][8]={{0x00,0x00,0x00,0x00,0x00,0x00,0xb,0x1},{0x00,0x00,0x00,0x00,0x00,0x00,0xb,0x2},{0x00,0x00,0x00,0x00,0x00,0x00,0xb,0x3},{0x00,0x00,0x00,0x00,0x00,0x00,0xb,0x4},{0x00,0x00,0x00,0x00,0x00,0x00,0xb,0x5},{0x00,0x00,0x00,0x00,0x00,0x00,0xb,0x6},{0x00,0x00,0x00,0x00,0x00,0x00,0xb,0x7},{0x00,0x00,0x00,0x00,0x00,0x00,0xb,0x8}};#define NOP() _nop_() /* 定义空指令 */#define _Nop() _nop_() /* 定义空指令 */sbit SCL=P1^6; //I2C 时钟sbit SDA=P1^3; //I2C 数据bit ack; /*应答标志位*//*******************************************************起动总线函数函数原型: void Start_I2c();功能: 启动I2C总线,即发送I2C起始条件.*******************************************************/void Start_I2c(){SDA=1; /*发送起始条件的数据信号*/_Nop();SCL=1;_Nop(); /*起始条件建立时间大于4.7us,延时*/_Nop();_Nop();_Nop();_Nop();SDA=0; /*发送起始信号*/_Nop(); /* 起始条件锁定时间大于4μs*/_Nop();_Nop();_Nop();_Nop();SCL=0; /*锁住I2C总线,准备发送或接收数据 */_Nop();_Nop();}/*******************************************************结束总线函数函数原型: void Stop_I2c();功能: 结束I2C总线,即发送I2C结束条件.*******************************************************/void Stop_I2c(){SDA=0; /*发送结束条件的数据信号*/_Nop(); /*发送结束条件的时钟信号*/SCL=1;_Nop();_Nop(); /*结束条件建立时间大于4μs*/_Nop();_Nop();_Nop();SDA=1; /*发送I2C总线结束信号*/_Nop();_Nop();_Nop();_Nop();}/*******************************************************字节数据发送函数函数原型: void SendByte(UCHAR c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0)发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
*******************************************************/void SendByte(unsigned char c){unsigned char BitCnt;for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/{if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/else SDA=0;_Nop();SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/_Nop();_Nop(); /*保证时钟高电平周期大于4μs*/_Nop();_Nop();_Nop();SCL=0;}_Nop();_Nop();SDA=1; /*8位发送完后释放数据线,准备接收应答位*/_Nop();_Nop();SCL=1;_Nop();_Nop();_Nop();if(SDA==1)ack=0;else ack=1; /*判断是否接收到应答信号*/SCL=0;_Nop();_Nop();}/*******************************************************字节数据接收函数函数原型: UCHAR RcvByte();功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数应答从机。
*******************************************************/ unsigned char RcvByte(){unsigned char retc;unsigned char BitCnt;retc=0;SDA=1; /*置数据线为输入方式*/for(BitCnt=0;BitCnt<8;BitCnt++){_Nop();SCL=0; /*置时钟线为低,准备接收数据位*/_Nop();_Nop(); /*时钟低电平周期大于4.7μs*/_Nop();_Nop();_Nop();SCL=1; /*置时钟线为高使数据线上数据有效*/_Nop();_Nop();retc=retc<<1;if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */ _Nop();_Nop();}SCL=0;_Nop();_Nop();return(retc);}/*******************************************************应答子函数函数原型: void Ack_I2c(bit a);功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) *******************************************************/void Ack_I2c(bit a){if(a==0)SDA=0; /*在此发出应答或非应答信号 */else SDA=1;_Nop();_Nop();_Nop();SCL=1;_Nop();_Nop(); /*时钟低电平周期大于4μs*/_Nop();_Nop();_Nop();SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/_Nop();_Nop();}/*******************************************************向有子地址器件发送多字节数据函数函数原型: bit ISendStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
如果返回1表示操作成功,否则操作有误。
*******************************************************/bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no){unsigned char i;Start_I2c(); /*启动总线*/SendByte(sla); /*发送器件地址*/if(ack==0)return(0);SendByte(suba); /*发送器件子地址*/if(ack==0)return(0);for(i=0;i<no;i++){SendByte(*s); /*发送数据*/if(ack==0)return(0);s++;}Stop_I2c(); /*结束总线*/return(1);}/*******************************************************向有子地址器件读取多字节数据函数函数原型: bit RecndStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
如果返回1表示操作成功,否则操作有误。
*******************************************************/bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no){unsigned char i;Start_I2c(); /*启动总线*/SendByte(sla); /*发送器件地址*/if(ack==0)return(0);SendByte(suba); /*发送器件子地址*/if(ack==0)return(0);Start_I2c(); /*重新启动总线*/SendByte(sla+1);if(ack==0)return(0);for(i=0;i<no-1;i++){*s=RcvByte(); /*发送数据*/Ack_I2c(0); /*发送就答位*/s++;}*s=RcvByte();Ack_I2c(1); /*发送非应位*/Stop_I2c(); /*结束总线*/return(1);}/*******************************************************延时函数函数原型: delay();功能: 延时3ms.*******************************************************/delay(){unsigned m,n;for(m=300;m>0;m--)for(n=512;n>0;n--);}/*******************************************************读函数函数原型: void Read24();功能: 多字节读取数据.*******************************************************/void Read24(){IRcvStr(AT24C16, 0 , &yh[0][0], 6);delay();IRcvStr(AT24C16, 10 , &yh[1][0], 6);delay();IRcvStr(AT24C16, 20 , &yh[2][0], 6);delay();IRcvStr(AT24C16, 30 , &yh[3][0], 6);delay();IRcvStr(AT24C16, 40 , &yh[4][0], 6);delay();IRcvStr(AT24C16, 50 , &yh[5][0], 6);delay();IRcvStr(AT24C16, 60 , &yh[6][0], 6);delay();IRcvStr(AT24C16, 70 , &yh[7][0], 6);delay();}/******************************************************* 写函数函数原型: void Write24();功能: 多字节写取数据.*******************************************************/ void Write24(){ISendStr(AT24C16, 0 , &yh[0][0], 6);delay();ISendStr(AT24C16, 10 , &yh[1][0], 6);delay();ISendStr(AT24C16, 20 , &yh[2][0], 6);delay();ISendStr(AT24C16, 30 , &yh[3][0], 6);delay();ISendStr(AT24C16, 40 , &yh[4][0], 6);delay();ISendStr(AT24C16, 50 , &yh[5][0], 6);delay();ISendStr(AT24C16, 60 , &yh[6][0], 6);delay();ISendStr(AT24C16, 70 , &yh[7][0], 6);delay();}/******************************************************* 计数及进位函数函数原型: void jinwei ();功能: 对相应用户产生的脉冲进行加1计数并进位.*******************************************************/ void jinwei (unsigned char z){yh[z][0]++;if(yh[z][0]==0xa){yh[z][0]=0x0;yh[z][1]++;}if (yh[z][1]==0xa){yh[z][1]=0x0;yh[z][2]++;}if (yh[z][2]==0xa){yh[z][2]=0x0;yh[z][3]++;}if (yh[z][3]==0xa){yh[z][3]=0x0;yh[z][4]++;}if (yh[z][4]==0xa){yh[z][4]=0x0;yh[z][5]++;}if(yh[z][5]==0xa){yh[z][0]=0x0;yh[z][1]=0x0;yh[z][2]=0x0;yh[z][3]=0x0;yh[z][4]=0x0;yh[z][5]=0x0;}}/******************************************************* 用户扫描函数函数原型: void saomiao();功能: 对各用户口进行扫描,判断是否有脉冲产生.*******************************************************/ void saomiao(){if(YH1==0){if(a==1){a=0;z=0;jinwei(z);}}elsea=1;if(YH2==0){if(b==1){b=0;z=1;jinwei(z);}}elseb=1;if(YH3==0){if(c==1)c=0;z=2;jinwei(z);}}elsec=1;if(YH4==0){if(d==1){d=0;z=3;jinwei(z);}}elsed=1;if(YH5==0){if(e==1){e=0;z=4;jinwei(z);}}elsee=1;if(YH6==0){if(f==1){f=0;z=5;jinwei(z);}}elsef=1;if(YH7==0){if(g==1)g=0;z=6;jinwei(z);}}elseg=1;if(YH8==0){if(h==1){h=0;z=7;jinwei(z);}}elseh=1;}/*******************************************************主函数函数原型: void main();功能: 实现读写函数、计数及进位函数、数码管显示等函数的调用,初始化相应功能.*******************************************************/void main(){SFRPAGE=0x0F;P1MDIN=0XFF; //P1口初始化P1MDOUT=0XEF; //推挽输出P2MDIN=0xFF;P2MDOUT=0xfF;XBR1=0x40; //交叉开关使能PCA0MD=0x00; //关闭看门狗clear WatchdogPSCTL=0x03; //写FLESH允许OSCXCN=0x67; //用外晶振OSCICN=0x0; //内部振荡器使能,8分频CLKSEL=0x01; //系统时钟选内部高频振荡器,不预分频Read24();TMOD=0x01; //设置定时器0为工作方式1TH0=0x28;TL0=0x00;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0while(1){a=b=c=d=e=f=g=h=1;saomiao();Write24();}}/*******************************************************定时器中断及显示函数函数原型: void DS() interrupt 1;功能: 对定时器写入初值,定时约3s,数码管显示各用户的用电情况. *******************************************************/void DS() interrupt 1{TH0=0x28;TL0=0x00;if(++n==50){ n=0;for(k=0;k<8;k++){m=zf[yh[j][k]];if(k==2){m=m&0xf7;}for(i=0;i<8;i++){ CLK=0;DIN=m&0x01;CLK=1;m>>=1;}}j=(j+1)%8;}}。