附录水表源程序.docx
- 文档编号:10029528
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:24
- 大小:19.28KB
附录水表源程序.docx
《附录水表源程序.docx》由会员分享,可在线阅读,更多相关《附录水表源程序.docx(24页珍藏版)》请在冰豆网上搜索。
附录水表源程序
附录源程序
系统所用CPU:
AT89C51。
外接晶振方式:
时钟频率约6MHz,机器周期约2us。
各口线作用定义如下:
FAMEQUP1.1;阀门控制,高电平有效
E_SCLEQUP1.2;EEPROM时钟线
E_SDAEQUP1.3;EEPROM串行数据线(双向)
SPKEQUP1.4;蜂鸣器控制,高电平蜂鸣
SW_TEQUP1.5;IC卡插卡检测线。
=0表明IC卡已插入
IC_SCLEQUP1.6;IC卡时钟线
IC_SDAEQUP1.7;IC卡串行数据线(双向)
RXDEQUP3.0;串行数据输出
TXDEQUP3.1;串行时钟输出,正跳变有效
V_MONIEQUP3.2;电池电压检测线。
=1说明电池电压正常,否则
;说明过低
OPEN_DEQUP3.3;按钮按下,调用显示
W_INEQUP3.4;0.1m3脉冲输入线(负跳变有效)
T_FEQUP3.5;时钟方式进入中断的检测线(低电平有效)
F_KEYEQUP3.7;作为防拆表输入线
片内标志字节定义如下:
F_VLEQU31H;电池电压过低标志位。
=1说明过低
F_OPENEQU32H;阀门已开否标志。
=1说明阀门已开
C_LOWEQU33H;剩余水量过低标志位。
=1说明过低要报警,且先
;关闭阀门,10s后开阀
C_NULEQU34H;已无剩水标志位。
=1说明已无剩水
C_GAIEQU35H;拆卸标志
片内文件寄存器定义如下:
WQT_HEQU36H;总用水量存储单元,此为高字节
WQT_MEQU37H;总用水量存储单元,此为中字节
WQT_LEQU38H;总用水量存储单元,此为低字节
C_DE1EQU39H;暂存片外EEPROM中用户信息,用户码3字节,此
;为高字节
C_DE2EQU3AH;用户码3字节,此为中字节
C_DE3EQU3BH;用户码3字节,此为低字节
C_RDEQU3CH;读卡条件
IC_DE1EQU3DH;暂存IC卡用户信息,用户码3字节,此为高字节
IC_DE2EQU3EH;用户码3字节,此为中字节
IC_DE3EQU3FH;用户码3字节,此为低字节
IC_RDEQU40H;读卡条件
W_HIEQU41H;剩余水量存储单元,此为高字节
W_LOWEQU42H;剩余水量存储单元,此为低字节
B_HIEQU43H;本次暂存购买水量存储单元,此为高字节
B_LOWEQU44H;本次暂存购买水量存储单元,此为低字节
MEQU45H;测得脉冲数存储单元
NEQU46H;设定的转数值
显示存储单元定义如下:
SFWEQU47H;十分位
GWEQU48H;个位
SWEQU49H;十位
BWEQU4AH;百位
QWEQU4BH;千位
WWEQU4CH;万位
片外EEPROM分配如下:
EE1Q_LEQU01H;第一剩余水量存储单元,此为低字节
EE1Q_HEQU02H;第一剩余水量存储单元,此为高字节
EE_W_HEQU03H;总用水量存储单元,此为高字节
EE_W_MEQU04H;总用水量存储单元,此为中字节
EE_W_LEQU05H;总用水量存储单元,此为低字节
C_0DE1EQU06H;用户码3字节,此为高字节
C_0DE2EQU07H;用户码3字节,此为中字节
C_0DE3EQU08H;用户码3字节,此为低字节
EEC_RDEQU09H;原读卡条件标志单元
EE2Q_LEQU10H;第二剩余水量存储单元,此为低字节
EE2Q_HEQU11H;第二剩余水量存储单元,此为高字节
E_MEQU12H;测得脉冲数存储单元
E_NEQU13H;设定的转数值
C_0GAIEQU14H;拆盖标志
下列各信息读自IC卡:
READ_FEQU01H;读IC卡标志,如不等于0,则说明IC卡未被
;读过
USER1EQU02H;用户码3字节,此为高字节
USER2EQU03H;用户码3字节,此为中字节
USER3EQU04H;用户码3字节,此为低字节
USER_RDEQU05H;原读卡条件
WQ_HEQU06H;购水总量,此为高字节
WQ_LEQU07H;购水总量,此为低字节
函数名:
主程序
功能:
主要完成系统的初始化,水量判断及关阀操作,进入睡眠状态处理。
ORG0003H;INT0中断入口
AJMPDO_INT0
ORG0013H;INT1中断入口
AJMPDO_INT1
ORG0000H
AJMPSTART
ORG0030H
START:
MOVSCON,#10H;串行口初始化(方式0)
MOVIP,#01H;定义中断优先级
MOVTCON,#04H;一个为跳变触发,一个为电平触发
SETBP3.2;置P3.2,P3.3为输入状态
SETBP3.3
ACALLR_EEP;调用子程序,从EEPROM中读有关信息
JZF_KEY,DO_F;防拆卸
JZV_MONI,DO_V;电池电压检测线
JZOPEN_D,DIS_P;按钮按下,调用显示
JZSW_T,DO_KA;有卡插入
JZW_IN,DO_INT0;有流量传感器信号
MOVA,W_HI;剩余水量高字节赋给A
JNZSLEEP;不等于0,则进入睡眠状态
MOVA,W_LOW;剩余水量低字节赋给A
JZG_FA;剩余水量,关闭阀门
CLRC
SUBBA,#50
JNCSLEEP;剩余水量大于5吨,则进入睡眠状态
SETBC_LOW;剩余水量过低标志
ACALLALARM;调用报警子程序
MOVIE,#85H;允许外部中断0和外部中断1
SLEEP:
MOVPCOM,#01H;进入待机方式
函数名:
INT0中断子程序
功能:
用于处理0.1m3传感脉冲。
处理的事务有:
(1)剩水总数减1,并写入EEPROM相应单元;
(2)用水总数加1,并写入EEPROM相应单元;
(3)根据条件设置剩水不多了等标志位C_LOW;
(4)适当时候产生报警。
DO_INT0:
PUSHPSW;有关单元内容进栈
PUSHACC
PUSHB
INCM
DJNZM,N,RETI;脉冲数与设定转数不相等则中断返回
DECW_LOW;剩余水量减1
MOVA,W_HI
SUBBA,#0
MOVW_HI,A
CLCC
INCWQT_L;总用水量加1
MOVA,WQT_M
ADDCA,#0
MOVWQT_M,A
CLCC
MOVA,WQT_H
ADDCA,#0
MOVWQT_H,A
CLCC
AJMPW_EEP1;保存剩余水量
AJMPW_EEP2;保存总用水量
MOVA,W_HI;剩余水量高字节赋给A
JNZSLEEP;不等于0,则进入睡眠状态
MOVA,W_LOW;剩余水量低字节赋给A
JZG_FA;剩余水量,关闭阀门
CLRC
SUBBA,#50
JNZSLEEP;剩余水量等于5m3,则报警提示
SETBC_LOW;剩余水量过低标志
ACALLALARM;调用报警子程序
POPPSW;有关单元内容出栈
POPACC
POPB
SETBET0;开中断
SETBEA
RETI
函数名:
INT1中断子程序
功能:
根据4种不同的情况进行相应的中断处理。
处理的事务有:
(1)当水表被拆卸时,报警并保存必要数据,并关阀门;
(2)当电池欠压或取出电池时,保存必要数据并关阀门;
(3)当按钮按下时,调用显示;
(4)当有IC卡插入时,进入IC卡处理子程序。
DO_INT1:
PUSHPSW;有关单元内容进栈
PUSHACC
PUSHB
JZF_KEY,DO_F;防拆卸
JZV_MONI,DO_V;电池电压检测线
JZOPEN_D,DIS_P;按钮按下,调用显示
JZSW_T,DO_KA;有卡插入
SETBET1;开中断
SETBEA
POPPSW;有关单元内容出栈
POPACC
POPB
RETI
DO_V:
ACALLW_EEP;保存必要数据到EEPROM
ACALLG_FA
RET
DO_F:
ACALLR_EEP1;保存必要数据到EEPROM
SETBC_GAI;将拆卸标志置1
SETBP1.4;P1.4置1.蜂鸣器产生报警
ACALLDELAY_10S;延时10秒
CLRP1.4;关报警
ACALLG_FA
RET
G_FA:
MOVA,F_OPEN
JZRET
CLRP1.1
SETBP1.1
ACALLDELAY_2S;延时2秒
CLRP1.1;P1.1输出一个高电平脉冲,关闭阀门
CLRF_OPEN;阀门关闭标志
RET
函数名:
EEPROM读写子程序
功能:
读写剩余水量、总用水量、用户信息与密码等。
R_EEP:
;读有关信息
ACALLR_EEP1;读剩余水量
ACALLR_EEP2;读总用水量
ACALLR_EEP3;读用户信息和密码
ACALLR_EEP4;读测得脉冲数与设定的转速值
RET
W_EEP:
;保存有关信息
ACALLW_EEP1;写剩余水量
ACALLW_EEP2;写总用水量
ACALLW_EEP3;写标志位
ACALLW_EEP4;写测得脉冲数
RET
R_EEP1:
;读剩余水量
MOVSP,#60H;设置堆栈
SCLBITE_SCL
SDABITE_SDA
MOVR4,W_HI;片内地址,剩余水量高字节
MOVR1,EE1Q_L;欲读数据存放地址指针,剩余水量高字
;节
MOVR7,2;连续读字节数
MOVAddress,R1
MOVI2CData,R4
CALLI2C_READ;读入数据
RET
R_EEP2:
;读总用水量
MOVSP,#60H;设置堆栈
SCLBITE_SCL
SDABITE_SDA
MOVR4,WQT_H;片内地址,总用水量高字节
MOVR1,EE_W_H;欲读数据存放地址指针,总用水量高字
;节
MOVR7,3;连续读字节数
MOVAddress,R1
MOVI2CData,R4
CALLI2C_READ;读入数据
RET
R_EEP3:
;读片内用户信息和密码
MOVSP,#60H;设置堆栈
SCLBITE_SCL
SDABITE_SDA
MOVR4,C_DE1;片内地址,用户信息高字节
MOVR1,C_ODE1;欲读数据存放地址指针,用户信息高字
;节
MOVR7,4;连续读字节数
MOVAddress,R1
MOVI2CData,R4
CALLI2C_READ;读入数据
RET
R_EEP4:
;读测得脉冲数和设定的转速值
MOVSP,#60H;设置堆栈
SCLBITE_SCL
SDABITE_SDA
MOVR4,M;片内地址,测得脉冲数
MOVR1,E_M;欲读数据存放地址指针,测得脉冲数
MOVR7,2;连续读字节数
MOVAddress,R1
MOVI2CData,R4
CALLI2C_READ;读入数据
RET
W_EEP1:
;写剩余水量
MOVSP,#60H;设置堆栈
SCLBITE_SCL
SDABITE_SDA
MOVR4,W_HI;片内地址,剩余水量高字节
MOVR1,EE1Q_L;欲写数据存放地址指针,剩余水量高字
;节
MOVR7,2;连续写字节数
MOVAddress,R1
MOVI2CData,R4
CALLI2C_WRITE;写入数据
RET
W_EEP2:
;写总用水量
MOVSP,#60H;设置堆栈
SCLBITE_SCL
SDABITE_SDA
MOVR4,WQT_H;片内地址,总用水量高字节
MOVR1,EE_W_H;欲写数据存放地址指针,总用水量高字
;节
MOVR7,3;连续写字节数
MOVAddress,R1
MOVI2CData,R4
CALLI2C_WRITE;写入数据
RET
W_EEP3:
;写标志位
MOVSP,#60H;设置堆栈
SCLBITE_SCL
SDABITE_SDA
MOVR4,C_GAI;片内地址,标志位地址
MOVR1,C_OGAI;欲写数据存放地址指针,标志位地址
MOVR7,1;连续写字节数
MOVAddress,R1
MOVI2CData,R1
MOVI2C_WRITE;写入数据
RET
W_EEP4:
;写测得脉冲数
MOVSP,#60H;设置堆栈
SCLBITE_SCL
SDABITE_SDA
MOVR4,M;片内地址,测得脉冲数地址
MOVR1,E_M;欲写数据存放地址指针,测得脉冲数
;地址
MOVR7,1;连续写字节数
MOVAddress,R1
MOVI2CData,R4
CALLI2C_WRITE;写入数据
RET
I2C_WRITE:
;写子程序
I2C_WRITE_A:
LCALLI2C_START
MOVA,#10100000B
LCALLI2C_SEND8BIT
LCALLI2C_ACK
JCI2C_WRITE_A;=1表示无确认,再次发送
MOVA,Address
LCALLI2C_SEND8BIT
LCALLI2C_ACK
MOVA,I2CData
LCALLI2C_SEND8BIT
INCR1
DJNZR7,I2C_WRITE_A;连续写n个字节
LCALLI2C_ACK
LCALLI2C_STOP
RET
I2C_READ:
;读子程序
I2C_READ_A:
LCALLI2C_START
MOVA,#10100000B
LCALLI2C_SEND8BIT
LCALLI2C_ACK
JCI2C_READ_A;=1表示无确认,再次发送
MOVA,Address
LCALLI2C_SEND8BIT
LCALLI2C_ACK
I2C_READ_B:
LCALLI2C_START
MOVA,#10100001B
LCALLI2C_SEND8BIT
LCALLI2C_ACK
JCI2C_READ_B
LCALLI2C_RECEIVE8BIT
MOVI2CData,A
INCR1
DJNZR7,I2C_WRITE_A;连续读n个字节
LCALLI2C_ACK
LCALLI2C_STOP
RET
I2C_START:
;发送开始信号
SETBSCL
SETBSDA
NOP
NOP
CLRSDA
NOP
NOP
CLRSCL
RET
I2C_STOP:
;发送结束信号
CLRSDA
NOP
NOP
SETBSCL
NOP
NOP
SETBSDA
RET
I2C_ACK:
;发送接收确认信号
SETBSDA
SETBSCL
NOP
NOP
JBSDA,I2C_ACK0
CLRC
SJMPI2C_ACK_END
I2C_ACK0:
SETBC
I2C_ACK_END:
CLRSCL
RET
I2C_SEND8BIT:
;送八位数据
MOVB,#08H
I2C_SEND8BIT_A:
RLCA
MOVSDA,C
SETBSCL
NOP
NOP
CLRSCL
DJNZB,I2C_SEND8BIT_A
RET
I2C_RECEIVE8BIT:
;接收八位数据
MOVB,#08H
CLRA
SETBSDA
I2C_RECEIVE8BIT_A:
SETBSCL
NOP
NOP
MOVC,SDA
RLCA
CLRSCL
DJNZB,I2C_RECEIVE8BIT_A
RET
函数名:
IC卡插卡处理子程序
功能:
进行IC卡类型判断、有效性判断和IC卡读写等。
DO_KA:
JBMG_CARD,DO_MG;管理卡?
MOVR2,#4
JBUS_CARD,DO_US;用户卡?
RET
DO_MG:
CLCC_GAI;清拆盖标志
RET
DO_US:
DJNZR2,ERROR;核对用户信息和密码三次有误跳出
LCALLR_US;调出用户信息
MOVR5,#4
US_LOOP:
CJNEC_0DE1,IC_DE1,DO_US;用户信息不相等则再次核对
INCC_0DE1
INCIC_DE1
DJNZR5,US_LOOP
DJNZREAD_F,ERROR;READ_F为1则该卡已读,跳出
ACALLG_CHU;有效性判断合格,调用本次购买处
;理程序
RET
G_CHU:
;本次购买处理程序
ACALLR_IC;读本次购买水量
ACALLJIA;本次购买水量与剩余水量相加
ACALLW_IC;写已读标志位
RET
JIA:
;相加子程序
PUSHACC;将A中内容进栈保护
MOVR0,W_HI;将剩余水量存储单元高字节送R0
MOVR1,B_HI;将本次暂存购买水量存储单元高字
;节送R1
MOVA,@R0;被加数低字节内容送给A
MOVA,@R1;低字节
MOV@R0,A;低字节和存W_HI
INCR0;指向被加数高位字节
INCR1;指向加数高位字节
MOVA,@R0;被加数高位字节送给A
ADDCA,@R1;高字节数相加
MOV@R0,A;高字节数和存W_LOW
POPACC
RET
R_US:
;读用户信息
MOVSP,#60H;设置堆栈
SCLBITIC_SCL
SDABITIC_SDA
MOVR4,IC_DE1;片内地址,存放用户信息
MOVR1,USER1;欲读数据存放地址指针,用户信息
MOVR7,#4;连续读字节数
MOVAddress,R1
MOVI2CData,R4
CALLI2C_READ;读入数据
RET
R_IC:
;读本次购买水量
MOVSP,#60H;设置堆栈
SCLBITIC_SCL
SDABITIC_SDA
MOVR4,B_HI;片内地址,购买水量高字节
MOVR1,WQ_H;欲读数据存放地址指针,购买水量
;高字节
MOVR7,#2;连续读字节数
MOVAddress,R1
MOVI2CData,R4
CALLI2C_READ;读入数据
RET
W_IC:
;写已读标志位
MOVSP,#60H;设置堆栈
SCLBITIC_SCL
SDABITIC_SDA
MOVR4,READ_F;片内地址,标志位
MOVR1,#01H;欲写数据
MOVR7,#1;连续写字节数
MOVAddress,R1
MOVI2CData,R4
CALLI2C_WRITE;写入数据
RET
ERROR:
LJMPSLEEP
RET
函数名:
显示子程序
功能:
实现对剩余水量和总用水量的显示。
DIS_P:
;显示子程序
ACALLDELAY_10MS;延时,确认
JNZOPEN_D,RET;确认按钮按下则调用显示
ACALLDIS_1P;调用显示剩余水量子程序
RET
DIS_1P:
;显示剩余水量
MOVDMbuffer,W_LOW
MOVR1,#4
LOOP_1P:
;循环扫描显示
ACALLDIS_3P
JNZOPEN_D,LOOP_1P;有按钮按下则显示总用水量
ACALLDELAY_10MS;延时,确认
JZOPEN_D,DIS_2P;确认按钮按下则调用显示总用水量
ACALLLOOP_1P
RET
DIS_2P:
;显示总用水量
MOVDMbuffer,WQT_L
MOVR1,#6
LOOP_2P:
;循环扫描显示
ACALLDIS_3P
JNZOPEN_D,LOOP_2P;有按钮按下则关闭显示
ACALLDELAY_10MS;延时,确认
JZOPEN_D,RET;确认按钮按下则关闭显示
ACALLLOOP_2P
RET
DIS_3P:
MOVSCON,#00H;初始化
CLRES
CLRIE
MOVR0,#DMbuffer
MOVWMbuffer,#0FEH
MOVDPTR,#TABLE
DLOOP:
MOVA,WMbuffer;送位码
MOVSBUF,A
JNBTI,S
CLRTI
MOVA,@R0;送段码
ACALLH_BCD;16进制转化为BCD码
MOVCA,@A+DPTR
CPLA;将共阳极的段码取反
MOVSBUF,A
JNBTI,$
CLRTI
ACALLDELAY_10MS;延时10MS
MOVA,WMbuffer
RLA
MOVWMbuffer,A
INCR0
DJNZR1,DLOOP;显示下一位
RET
H_BCD:
;16进制转化为BCD码子程序
MOVB,#100;分离出百位,存放在R3中
DIVAB
MOVR3,A
MOVA,#10;余数继续分离十位和个位
XCHA,B
DIVAB
SWAPA
ORLA,B;将十位和个位拼装成BCD码
RET
TABLE:
;共阳
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 附录 水表源程序 水表 源程序