基于单片机的IC卡智能水表源代码

上传人:痛*** 文档编号:60574750 上传时间:2022-03-08 格式:DOC 页数:15 大小:97KB
收藏 版权申诉 举报 下载
基于单片机的IC卡智能水表源代码_第1页
第1页 / 共15页
基于单片机的IC卡智能水表源代码_第2页
第2页 / 共15页
基于单片机的IC卡智能水表源代码_第3页
第3页 / 共15页
资源描述:

《基于单片机的IC卡智能水表源代码》由会员分享,可在线阅读,更多相关《基于单片机的IC卡智能水表源代码(15页珍藏版)》请在装配图网上搜索。

1、基于单片机的IC卡智能水表源代码作者:清华大学 杨家沛;*;本系统所用CPU:PIC16F84;采用外接RC经济阻容振荡方式:R=100K C=100P; 时钟频率约72KHz; 机器周期约56us;*INCLUDE “PIC 84.H” ;PIC84头文件;*;液晶显示命令字定义;*SYSDIS EQU B00000000 ;关闭液晶系统振荡和偏振命令字SYSEN EQU B00000001 ;打开液晶系统振荡LCD ON EQU B00000011 ;打开液晶偏振发生器BIAS 1 EQU B00100000 ;液晶显示方式命令字;*;PIC I/O口线 输入输出方式定义字;*O RB E

2、QU B01000110 ;RB口输出状态定义字;输出状态:RB0,RB3,RB4,RB5,RB7均为输出,RB1,RB2,RB6为输入;I RB EQU B01100110 ;RB口输入状态定义字;输入状态:RB0,RB3,RB4,RB7为输出,RB1,RB2,RB5,RB6为输入;0 RA EQU B11110000 ;RA口定义字;RA4为输入,低4位均为输出;*;各口线作用定义;*SWCH1 EQU RA2 ;开阀控制,低电平有效SWCH2 EQU RB0 ;关阀控制,低电平有效S VOLT EQU RB7 ;IC卡电源地控制(即控制IC卡座电源),低电平有效SDA EQU RA4 ;

3、IC卡串行数据线(双向)SCL EQU RB4 ;IC卡时钟线S T EQU RB6 ;IC卡插卡检测线.=1 表明IC卡已插入SPK EQU RB3 ;蜂鸣器控制,高电平蜂鸣V_MONI EQU RB2 ;电池电压检测线.=1,说明电池电压正常,否则说明过低WR EQU RA1 ;液晶显示时钟输出,正跳变有效DATA EQU RA0 ;液晶串行数据输出,=1,为0;=0,为1CS EQU RA3 ;液晶片选控制,高电平有效(同时控制水脉冲,和IC卡)W IN EQU RB1 ;0.1m3脉冲输入线(负跳变有效)F KEY EQU RB5 ;作为防拆表输入线;*;IC84通用寄存器定义(共有6

4、8个):地址为0CH4FH;*XDATA EQU 0CH;通用数据暂存单元CON1 EQU 0DH;循环条件暂存单元CON2 EQU 0EH;循环条件暂存单元CON3 EQU 0FH;循环条件暂存单元CON4 EQU 10H;循环条件暂存单元FLAG EQU 11H;通用标志字节(各位意义见后)DFLG EQU 12H;液晶显示标志字节(各位意义见后)DA1 DSP EQU 13H;液晶显示高2位(BCD码)DA2 DSP EQU 14H;液晶显示低2位(BCD码)L CON EQU 15H;循环控制,如果=10 则读卡SW DL EQU 16H;关阀延时数T CON EQU 17H;FUNC

5、TION KEY TEST COUNT(NO USE)ST FLG EQU 18H;W CRC EQU 18HS0 EQU 2FH;十六进制-十进制(BCD)中十六进制数暂存S1 EQU 2EH;R0 EQU 13H;转换后的BCD(4位)暂存R1 EQU 14H XDATA1 EQU 1AH XDATA2 EQU 1BHCON5 EQU 19HXDAT EQU 1CHF ST1 EQU 35H;机器开始标志单元(正确的开始标志值为55HF ST2 EQU 36H; 以及0AAH)RANDHI EQU 4AH;加密用随机数高字节RANDL0 EQU 4BH;加密用随机数低字节;*;下列文件寄存

6、器用来比较用户码及M1码;*F VAL EQU 37H;电磁阀开关标志WQT H EQU 27H;以下3单元为用水总量存储单元,此为高字节WQT M EQU 38H;中字节WQT L EQU 39H;低字节C RD EQU 3AH;读卡条件W HI EQU 3BH;以下2单元是剩水总量存储单元,此为高字节W LOW EQU 3CH;低字节EFLG EQU 3DH;写片内EEPROM剩水单元选择标志. 0选EEQ1,;否则选EEQ2;*;读IC卡标志;*READ F EQU 3EH;如不等于0,则说明IC卡未被读过;*;下列各信息读自IC卡;*USER1 EQU 3FH;用户码3字节, 高USE

7、R2 EQU 40H; 中USER3 EQU 41H ; 低M1 H EQU 42H ;M1码3字节 高M1 M EQU 43H ; 中M1 L EQU 44H ; 低C RD0 EQU 45H ;原读卡条件YEAR EQU 46H ;年MON EQU 47H ;月DAY EQU 48H ;日HOUR EQU 49H ;时M2 H EQU 4AH ;M2码3字节M2 M EQU 4BH ;M2 L EQU 4CH ;WQ H EQU 4DH ;购水总量,高字节WQ L EQU 4EH ; 低字节R CRC EQU 4FH ;校验码;*;液晶显示标志字节(12H),各位定义如下;*F WQF E

8、QU 0H ;传感脉冲处理否标志位. =1,说明已被处理;否则,未处理READED EQU 1H ;读卡标志位. =1,说明IC卡已读F T C EQU 2H ;是工厂测试用IC卡否标志位.=1,说明是测试用IC卡F S T EQU 3H ;暂时未用AN KEY EQU 4H ;暂时未用F OFF EQU 5H ;暂时未用C LOW 2 EQU 6H ;暂时未用S OPEN EQU 7H;显示开阀标志位.=1,说明开阀;=0,则显示关阀;*;标志字节(11H),各位定义如下;*F T EQU 0H ;小数点闪烁标志位.=1,则点亮小数点;=0则不显示CARD ON EQU 1H ;插卡标志位.

9、=1,说明有IC卡F WQ EQU 2H ;干簧传感开关闭合标志位(即用水).=1,说明闭合F VL EQU 3H ;电池电压过低标志位.=1,说明过低SW OPEN EQU 4H ;阀门已开否标志.=1说明阀已开 ;关C LOW EQU 5H ;剩水总量过低标志位.=1,说明过低C NUL EQU 6H ;已无剩水标志位。=1,说明已无剩水C LOW 1 EQU 7H ;剩水已到关阀警告点标志.=1,说明要告警;即:先关阀10秒后开阀;*;PIC84片内EEPROM分配(64字节,地址为00H3FH);*EEPR EQU 1H ;选择片内剩水总量存储单元.=00,选EE1Q;否则,选EE2Q

10、EE1Q L EQU 2H ;第一剩水总量存储单元,此为低字节EE1Q H EQU 3H ;高字节EE W H EQU 4H ;用水(购水)总量存储单元. 高字节EE W M EQU 5H ; 中字节EE W L EQU 6H ;低字节EE VAL EQU 7H ;SAVE VALVE NO CLOSE FLAG(ERROR VALUE 0CCH)EE TEST EQU 8H ;使用工厂测试卡标志.=01,说明可使用测试卡C 0DE EQU 9H ;用户码(三字节)EM1 EQU 0CH ;M1码(三字节)EEC RD EQU 0FH ;原读卡条件标志单元EE2Q L EQU 10H ;第二剩

11、水总量存储单元(两字节)EE2Q H EQU 11H ;*;所用IC卡单元定义;*E2400 EQU 00H ;VALVE ERROR FLAGE2401 EQU 01H ;用水总量存储单元,这里只有中单元,低单元E2403 EQU 03H ;CONT READ CARDE2404 EQU 04H ;L,H WQ DATA FOR USE,EFLGE2407 EQU 07H ;此IC卡已读标志.=00,说明此卡上数据已读走,否则未读E2408 EQU 08H ;用户码存储单元(三字节)E240B EQU 0BH ;M1码存储单元(三字节)E240E EQU 0EH ;原读卡条件存储单元E240

12、F EQU 0FH ;年,月,日,时(各一字节)E2413 EQU 13H ;M2码存储单元(三字节)E2416 EQU 16H ;剩水(购水)总量存储单元,高字节在先,低字节在后E2418 EQU 18H ;CRC校验字节存储单元 LIST F=INHX8M,P=16F84,R=HEX 0RG 0 B START ;复位后从START处开始执行程序;*;以下程序:用于处理0.1m3传感脉冲。处理的事务有:1) 剩水总数减1,并写入EEPROM;2) 用水总数加1,并写入EEPROM相应单元;3) 根据条件设置剩水不多了等标志位C LOW;4) 设置阀门状态正确与否标志单元:EEPROM内的E

13、E VAL,RAM内的F VAL; 0CCH表示出错。;*WQ 11 BSF FLAG,SW OPEN;置位阀已开标志位SW OPEN(-将剩水总数W HI,W LOW(十六进制)转换成BCD码WQ 13 BCF DFLG,F WQF ;清处理过传感脉冲标志位F WQF B WQ ED ;转-将剩水总数W HI,W LOW(十六进制)转换成BCD码;以下处理0.1m3脉冲过程。注:负跳变有效,其他忽略。WQ 1 BTFSS FLAG,F WQ ;由F WQ判干簧传感开关闭合否? B WQ 13 ;NO(=0),说明没有闭合,则转WQ 13 BTFSC DFLG,F WQF ;YES,则继续由F

14、 WQF判(从开-闭的下跳变)次脉;冲已被处理否? B WQ ED ;YES(=1),说明此脉冲已处理过。 BSF DFLG,F WQF ;NO,则首先置位脉冲已处理标志位F WQF CALL RD WQ ;读取EEPROM中剩水总数到W HI,W LOW单元 MOVF W HI,W I0RWF W LOW,W ;判剩水为0否? SKPNZ ;NO,则继续 B WQ 11 YES,则出错处理(WQ 11) DECF W LOW,SAME ;从W HI,W LOW中减1(即用掉了0.1m3) INCF W LOW,W ; SKPZ B WQ 14 DECF W HI,SAME;以下程序首先读取E

15、EPROM中用水总量单元EE W L,EE W M,EE W H,;加1后回存,并存入RAM中用水总量单元WQF L,WQF M,WQF HWQ 14 MOVLW EE W L CALL EE RD MOVWF WQT L INCF WQT L,SAME SKPZ B WQ 12 MOVLW EE W M CALL EE RD MOVWF WQT M INCF WQT M,SAME SKPZ B WQ 12 MOVLW EE W H CALL EE RD MOVWF WQT H INCF WQT H,SAMEWQ 12 MOVLW EE W H MOVWF EEADR MOVF WQT H,W

16、 CALL EE WR INCF EEADR,SAME MOVF WQT M,W CALL EE WR INCF EEADR,SAME MOVF WQT L,W CALL EE WR CALL WR WQ;将用水总量回存EEPROM BTFSS FLAG,C LOW;由C LOW判剩水总量过低否? B WQ ED ;NO转-将剩水处于W HI,W LOW(十六进制)转换成BCD码 MOVF W LOW,W ;YES,则判剩水处于哪个告警档(3m3,2m3,1m3) XORLW 1EH ;1EH=30(因3/0.1=30,即3m3) SKPNZ ;不是3m3档,转判是2m3档否 BSF FLAG

17、,C LOW 1 ;是3m3档,则设置关阀告警标志C LOW 1 MOVF W LOW,W X0RLW 14H ;14H=20(2/0.1=20) SKPNZ BSF FLAG,C LOW 1 MOVF W LOW,W X0RLW 0AH ;0AH=10(1/0.1=10) SKPNZ BSF FLAG,C LOW 1WQ ED MOVF W HI,W;将剩水总数W HI,W LOW(十六进制)转换成BCD码, MOVWF S0 ;以便显示剩水总量。 MOVF W LOW MOVWF S1 CALL BCD RETURN;*;IC卡插卡处理子程序(包括IC卡有效性判断、IC卡读写、数据解加密处

18、理等);*EEIN BTFSC FLAG,CARD ON;由CARD ON标志位判有卡否? B EEI1 ;YES(=1),则继续 BCF DFLG,READED ;NO,则清卡已读标志位READED.因为无卡,当然如此 SETC ;置位C ,说明未读卡 RETURN ;返回EEI1 SETC ;C初始化为1 BTFSC DFLG,READED ;由READED判此卡已读否? RETURN ;YES(=1),则C=1返回 BSF DFLG,READED ;NO,先置位READED标志位,接下去进行读卡处理 BSF FLAG,C LOW 1 ;设置告警标志位C LOW 1(以关阀10秒) BSF

19、 FLAG,SW OPEN ;置位阀已开标志位SW 0PEN(1,说明阀已开) BCF F B,S VOLT ;IC卡上电 MOVLW .70 ; MOVWF CON1 CALL LOP1 ;延时9MS,以等待电源稳定 MOVLW READ F ;间接寻址,读取IC卡18单元的内容存入READ F;开始的相应单元 MOVWF FSR MOVLW .18 ;18字节 MOVWF CON2 CALL BSTA ;发IC卡开始命令 MOVLW 0A0H ;写IC卡地址(写方式),0A0H=B10100000 MOVWF XDATA CALL TXB BC EEND ;C=1,说明写卡出错,执行IC卡

20、操作结束命令 MOVLW E2407 ;C=0,则继续读出IC卡已读卡标志单元E2407 MOVWF XDATA CALL TXB ;写单元地址 BC EEND ;C=1,说明写卡出错 CALL BSTA ;C=0,则继续发IC卡开始命令 MOVLW 0A1H ; MOVWF XDATA CALL TXB ;写读卡方式及IC卡地址(0A1H=B10100001) BC EEND ;C=1,说明写卡出错ELP CALL RXB ;C=0,则读出E2407单元,内容在XDATA中 MOVF XDATA,W MOVWF 0 ;间接存储 INCF FSR,SAME ;指针下移 MOVLW 0 RB T

21、RIS P B BCF P B,SDA ;每读一字节,发一个确认信号(即SDA=0期间,;SCL从高到低) BSF P B,SCL BCF P B,SCL DECFSZ CON2,SAME ;18字节操作完否? B ELP ;NO,继续 CALL BSTOP ;YES,发IC卡结束命令 BSF P B,S VOLT ;IC卡下电 BSF P B,SDA ;置SDA,SCL位为高电平,以降低功耗 BSF P B,SCL ; CALL JM ;对已读信息进行解密处理 MOVF READ F,W ;由READ F判此卡已读否? SKPNZ ;NO,说明未读 B ELP1 ;YES,说明已读,则转 C

22、ALL CRC ;未读,进行累加和校验.Z=1:说明校验正确;否则错误 SKPZ ;校验正确,直接返回ELP1 SETC ;校验不正确,则置位C(C -1) RETURN ;返回;*;START主程序:是这个程序的入口 首先判断低功耗状态位(/PD)与WDT溢出位(/TO), 只有其中一个有效,则转热启动初始化; 否则,说明是上电复位的冷启动,则进行相应初始化;*START BTFSS STATUS,PD ;由PD判是否处于低功耗状态? B STAR ;YES,说明是SLEEP被唤醒,则转热启动初始化 BTFSS STATUS,TO ;NO,继续由TO判是否是WDT溢出复位? B STAR ;

23、YES,说明是WDT被唤醒,则转热启动初始化START 1 CALL DL1S ;延时3秒 CALL DL1S CALL DL1S MOVLW OCH ;对从0CH开始的文件寄存器进行清零初始化 MOVWF FSRCL RAM CLRF INDF ;清F0,实际上清FSR中寄存器 INCF FSR,SAME BTFSS FSR,6 ;判FSR的B6位是否为1(RAM:OCH-4FH,4FH=01001111B) B CL RAM ;NO,继续清0 BTFSS FSR,4 ;YES,则判FSR的B4是否为1? B CL RAM ;NO,说明初始化还未完成,继续;否则,结束RAM初;始化(实际上只

24、清除了0C-48H) CALL STCLR ;初始化RA,RB端口,WDT,LCD等 CLRF DFLG ;清除显示标志字节DFLG,及通用标志字节FLAG CLRF FLAG MOVLW 55H ;对开始标志单元F ST1,F ST2设置正确的开始标志;55H,OAAH MOVWF F ST1 MOVLW OAAH MOVWF F ST2 BSF DFLG,F WQF;传感脉冲已被处理标志位F WQF初始化(=1,;因为此时还未脉冲) CALL SW OF 1 ;强制关阀 CALL DL1S ;延时3秒 CALL DL1S ; CALL DL1S ; BCF EEADR,6 ;将EEADR置

25、位00,以降低功耗 BCF EEADR,7 ; CALL RD WQ ;读出片内EEPROM中剩水总量到片内RAM的;剩水单元W HI,W LOW;以下为热启动复位初始化STAR MOVF F ST1,W ;首先判启动标志正常F ST1,F ST2否?;(即:等于55AAH否)? XORLW 55H SKPZ B START 1 MOVF F ST2,W XORLW 0AAH SKPZ B START 1;NO,则说明程序可能“跑飞”过,为了正确运行,;必须转冷启动初始化 CALL STCLR ;YES,则只对RA,RB,WDT,LCD等初始化 CALL T STAT ;检测I/O口线的状态,

26、并据此设置插卡否, ;电池电压低否,有传感脉冲否等标志位 CALL WQ IO ;读IC卡操作ST2 CALL WQ 1 ;采样干簧传感开关并进行剩水总量等处理 CALL WQ TEST ;剩水总量判断,以设置剩水为空等标志 MOVF SW DL,SAME ;判关阀延时数SW DL为0否? SKPNZ ;NO,则转延时数减1等操作 B ST5 ;YES,则进行开阀操作 DECF SW DL,SAME ;延时数减1 B ST6 ;转有条件关阀ST5 CALL SW ON ;根据相应条件,打开水阀门ST6 CALL SW OFF ;根据相应条件,关闭水阀门 BTFSC FLAG,F T ;判小数点

27、点亮否?(一亮一灭,产生闪烁效果) B ST3 ;YES,则转 BSF FLAG,F T ;NO,则设置小数点点亮标志F T(-1,;下个循环点亮) B ST4ST3 BCF FLAG,F T ;清小数点点亮标志位F T(下一个循环不点亮)ST4 CALL S DP ;液晶(LCD)显示相应信息 SLEEP ;进入低功耗睡眠状态(由WDT溢出唤醒) NOP ;此NOP是为了CPU被唤醒后不执行下面程序 MOVLW 0F8H OPTIONREST NOP B REST FILL (GOTO $),(400H-$);宏指令,以将余下的程序空间用 ;GOTO $原地踏步指令填充,是软件;陷阱以捕获程序“跑飞”。 ;*;最后说明:看门狗WDT的溢出时间为 18*64=1152ms.;* END

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!