附录水表源程序Word文档下载推荐.docx
《附录水表源程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《附录水表源程序Word文档下载推荐.docx(24页珍藏版)》请在冰点文库上搜索。
![附录水表源程序Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/7b9ce47e-6ac6-4e82-8655-70a07ff460db/7b9ce47e-6ac6-4e82-8655-70a07ff460db1.gif)
WQT_HEQU36H;
总用水量存储单元,此为高字节
WQT_MEQU37H;
总用水量存储单元,此为中字节
WQT_LEQU38H;
总用水量存储单元,此为低字节
C_DE1EQU39H;
暂存片外EEPROM中用户信息,用户码3字节,此
为高字节
C_DE2EQU3AH;
用户码3字节,此为中字节
C_DE3EQU3BH;
用户码3字节,此为低字节
C_RDEQU3CH;
读卡条件
IC_DE1EQU3DH;
暂存IC卡用户信息,用户码3字节,此为高字节
IC_DE2EQU3EH;
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;
C_0DE3EQU08H;
EEC_RDEQU09H;
原读卡条件标志单元
EE2Q_LEQU10H;
第二剩余水量存储单元,此为低字节
EE2Q_HEQU11H;
第二剩余水量存储单元,此为高字节
E_MEQU12H;
E_NEQU13H;
C_0GAIEQU14H;
拆盖标志
下列各信息读自IC卡:
READ_FEQU01H;
读IC卡标志,如不等于0,则说明IC卡未被
读过
USER1EQU02H;
USER2EQU03H;
USER3EQU04H;
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
MOVA,WQT_H
MOVWQT_H,A
AJMPW_EEP1;
保存剩余水量
AJMPW_EEP2;
保存总用水量
剩余水量等于5m3,则报警提示
POPPSW;
有关单元内容出栈
POPACC
POPB
SETBET0;
开中断
SETBEA
RETI
INT1中断子程序
根据4种不同的情况进行相应的中断处理。
(1)当水表被拆卸时,报警并保存必要数据,并关阀门;
(2)当电池欠压或取出电池时,保存必要数据并关阀门;
(3)当按钮按下时,调用显示;
(4)当有IC卡插入时,进入IC卡处理子程序。
DO_INT1:
PUSHB
SETBET1;
SETBEA
POPACC
POPB
DO_V:
ACALLW_EEP;
保存必要数据到EEPROM
ACALLG_FA
RET
DO_F:
ACALLR_EEP1;
SETBC_GAI;
将拆卸标志置1
SETBP1.4;
P1.4置1.蜂鸣器产生报警
ACALLDELAY_10S;
延时10秒
CLRP1.4;
关报警
ACALLG_FA
G_FA:
MOVA,F_OPEN
JZRET
CLRP1.1
SETBP1.1
ACALLDELAY_2S;
延时2秒
CLRP1.1;
P1.1输出一个高电平脉冲,关闭阀门
CLRF_OPEN;
阀门关闭标志
EEPROM读写子程序
读写剩余水量、总用水量、用户信息与密码等。
R_EEP:
读有关信息
读剩余水量
ACALLR_EEP2;
读总用水量
ACALLR_EEP3;
读用户信息和密码
ACALLR_EEP4;
读测得脉冲数与设定的转速值
W_EEP:
保存有关信息
ACALLW_EEP1;
写剩余水量
ACALLW_EEP2;
写总用水量
ACALLW_EEP3;
写标志位
ACALLW_EEP4;
写测得脉冲数
R_EEP1:
MOVSP,#60H;
设置堆栈
SCLBITE_SCL
SDABITE_SDA
MOVR4,W_HI;
片内地址,剩余水量高字节
MOVR1,EE1Q_L;
欲读数据存放地址指针,剩余水量高字
节
MOVR7,2;
连续读字节数
MOVAddress,R1
MOVI2CData,R4
CALLI2C_READ;
读入数据
R_EEP2:
MOVR4,WQT_H;
片内地址,总用水量高字节
MOVR1,EE_W_H;
欲读数据存放地址指针,总用水量高字
MOVR7,3;
R_EEP3:
读片内用户信息和密码
MOVR4,C_DE1;
片内地址,用户信息高字节
MOVR1,C_ODE1;
欲读数据存放地址指针,用户信息高字
MOVR7,4;
R_EEP4:
读测得脉冲数和设定的转速值
SDABITE_SDA
MOVR4,M;
片内地址,测得脉冲数
MOVR1,E_M;
欲读数据存放地址指针,测得脉冲数
W_EEP1:
欲写数据存放地址指针,剩余水量高字
连续写字节数
CALLI2C_WRITE;
写入数据
W_EEP2:
欲写数据存放地址指针,总用水量高字
W_EEP3:
MOVR4,C_GAI;
片内地址,标志位地址
MOVR1,C_OGAI;
欲写数据存放地址指针,标志位地址
MOVR7,1;
MOVI2CData,R1
MOVI2C_WRITE;
RET
W_EEP4:
片内地址,测得脉冲数地址
欲写数据存放地址指针,测得脉冲数
地址
I2C_WRITE:
写子程序
I2C_WRITE_A:
LCALLI2C_START
MOVA,#10100000B
LCALLI2C_SEND8BIT
LCALLI2C_ACK
JCI2C_WRITE_A;
=1表示无确认,再次发送
MOVA,Address
MOVA,I2CData
INCR1
DJNZR7,I2C_WRITE_A;
连续写n个字节
LCALLI2C_STOP
I2C_READ:
读子程序
I2C_READ_A:
JCI2C_READ_A;
I2C_READ_B:
MOVA,#10100001B
JCI2C_READ_B
LCALLI2C_RECEIVE8BIT
MOVI2CData,A
连续读n个字节
I2C_START:
发送开始信号
SETBSCL
SETBSDA
NOP
NOP
CLRSDA
CLRSCL
I2C_STOP:
发送结束信号
I2C_ACK:
发送接收确认信号
JBSDA,I2C_ACK0
SJMPI2C_ACK_END
I2C_ACK0:
SETBC
I2C_ACK_END:
I2C_SEND8BIT:
送八位数据
MOVB,#08H
I2C_SEND8BIT_A:
RLCA
MOVSDA,C
DJNZB,I2C_SEND8BIT_A
I2C_RECEIVE8BIT:
接收八位数据
CLRA
I2C_RECEIVE8BIT_A:
MOVC,SDA
DJNZB,I2C_RECEIVE8BIT_A
IC卡插卡处理子程序
进行IC卡类型判断、有效性判断和IC卡读写等。
DO_KA:
JBMG_CARD,DO_MG;
管理卡?
MOVR2,#4
JBUS_CARD,DO_US;
用户卡?
DO_MG:
CLCC_GAI;
清拆盖标志
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;
有效性判断合格,调用本次购买处
理程序
G_CHU:
本次购买处理程序
ACALLR_IC;
读本次购买水量
ACALLJIA;
本次购买水量与剩余水量相加
ACALLW_IC;
写已读标志位
JIA:
相加子程序
PUSHACC;
将A中内容进栈保护
MOVR0,W_HI;
将剩余水量存储单元高字节送R0
MOVR1,B_HI;
将本次暂存购买水量存储单元高字
节送R1
MOVA,@R0;
被加数低字节内容送给A
MOVA,@R1;
低字节
MOV@R0,A;
低字节和存W_HI
INCR0;
指向被加数高位字节
INCR1;
指向加数高位字节
被加数高位字节送给A
ADDCA,@R1;
高字节数相加
高字节数和存W_LOW
R_US:
读用户信息
SCLBITIC_SCL
SDABITIC_SDA
MOVR4,IC_DE1;
片内地址,存放用户信息
MOVR1,USER1;
欲读数据存放地址指针,用户信息
MOVR7,#4;
R_IC:
MOVR4,B_HI;
片内地址,购买水量高字节
MOVR1,WQ_H;
欲读数据存放地址指针,购买水量
高字节
MOVR7,#2;
W_IC:
MOVR4,READ_F;
片内地址,标志位
MOVR1,#01H;
欲写数据
MOVR7,#1;
ERROR:
LJMPSLEEP
显示子程序
实现对剩余水量和总用水量的显示。
DIS_P:
ACALLDELAY_10MS;
延时,确认
JNZOPEN_D,RET;
确认按钮按下则调用显示
ACALLDIS_1P;
调用显示剩余水量子程序
DIS_1P:
显示剩余水量
MOVDMbuffer,W_LOW
MOVR1,#4
LOOP_1P:
循环扫描显示
ACALLDIS_3P
JNZOPEN_D,LOOP_1P;
有按钮按下则显示总用水量
JZOPEN_D,DIS_2P;
确认按钮按下则调用显示总用水量
ACALLLOOP_1P
DIS_2P:
显示总用水量
MOVDMbuffer,WQT_L
MOVR1,#6
LOOP_2P:
JNZOPEN_D,LOOP_2P;
有按钮按下则关闭显示
JZOPEN_D,RET;
确认按钮按下则关闭显示
ACALLLOOP_2P
DIS_3P:
MOVSCON,#00H;
初始化
CLRES
CLRIE
MOVR0,#DMbuffer
MOVWMbuffer,#0FEH
MOVDPTR,#TABLE
DLOOP:
MOVA,WMbuffer;
送位码
MOVSBUF,A
JNBTI,S
CLRTI
送段码
ACALLH_BCD;
16进制转化为BCD码
MOVCA,@A+DPTR
CPLA;
将共阳极的段码取反
JNBTI,$
延时10MS
MOVA,WMbuffer
RLA
MOVWMbuffer,A
INCR0
DJNZR1,DLOOP;
显示下一位
H_BCD:
16进制转化为BCD码子程序
MOVB,#100;
分离出百位,存放在R3中
DIVAB
MOVR3,A
MOVA,#10;
余数继续分离十位和个位
XCHA,B
SWAPA
ORLA,B;
将十位和个位拼装成BCD码
TABLE:
共阳