📄 rficrdwr.lst
字号:
C51 COMPILER V7.02b RFICRDWR 12/10/2005 20:06:41 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE RFICRDWR
OBJECT MODULE PLACED IN RFICRdWr.OBJ
COMPILER INVOKED BY: E:\EDATOOLS\KEILC7.0\C51\BIN\C51.EXE RFICRdWr.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************/
2 /* Copyright (c) 2005, 通信工程学院 */
3 /* All rights reserved. */
4 /* 作 者:戴 佳 */
5 /*****************************************/
6
7 #include "RFICRdWr.h"
8
9 /* 延时t毫秒函数 */
10 void delay(uint t)
11 {
12 1 uint i;
13 1 while(t--)
14 1 {
15 2 /* 对于11.0592M时钟,约延时1ms */
16 2 for (i=0;i<125;i++)
17 2 {}
18 2 }
19 1 }
20
21 /* 定时器0中断服务子程序 */
22 void timer0() interrupt 1 using 1
23 {
24 1 TR0 = 0; // 停止计数
25 1
26 1 TH0 = -5000/256; // 重设计数初值
27 1 TL0 = -5000%256;
28 1
29 1 count++;
30 1
31 1 if (count>300) // 第一次检测到卡1.5s后
32 1 {
33 2 count = 0;
34 2 if(!flagok) // 如果检测到1.5s后读写标志还是失败,则蜂鸣器报警
35 2 {
36 3 BP = 0;
37 3 delay(2000); // 报警持续2s
38 3 BP = 1;
39 3 }
40 2 }
41 1 else
42 1 TR0 = 1; // 启动T0计数
43 1 }
44
45 /* 串口发送命令函数 */
46 void sendcmd(uchar *str)
47 {
48 1 while(*str != 0)
49 1 {
50 2 TI = 0; // 清发送标志位
51 2 SBUF = *str; // 发送数据
52 2 str++;
53 2 while(!TI); // 等待发送完成
54 2 }
55 1 }
C51 COMPILER V7.02b RFICRDWR 12/10/2005 20:06:41 PAGE 2
56
57 /* 字符数组转换为16进制字符串函数,16进制字符串附接在给定字符串后,
58 参数byte为数组地址,len为数组长度,str为转换后字符串 */
59 void Byte2Hex(uchar *byte,uchar len,uchar *str)
60 {
61 1 uchar i, j;
62 1 uchar tmp;
63 1
64 1 j = strlen(str);
65 1 for(i=0; i<len; i++)
66 1 {
67 2 tmp = ((*byte)>>4)&0x0f; // 字节高位
68 2 if(tmp < 0x0a)
69 2 *(str+j) = tmp+0x30;
70 2 else
71 2 *(str+j) = tmp-0x0a+'a';
72 2 str++;
73 2 tmp = (*byte)&0x0f; // 字节低位
74 2 if(tmp < 0x0a)
75 2 *(str+j) = tmp+0x30;
76 2 else
77 2 *(str+j) = tmp-0x0a+'a';
78 2 str++;
79 2 }
80 1 *(str+j) = 0; // 字符串结束
81 1 }
82
83 /* 16进制字符串转换为字节数组函数,参数str为要转换的字符串,byte为
84 转换后数组地址,若str长度不为偶数,则转换后最后一个字节高位补0*/
85 void Hex2Byte(uchar *str, uchar *byte)
86 {
87 1 uchar tmp;
88 1
89 1 while(*str != 0)
90 1 {
91 2 tmp = ((*str)<<4)&0xf0; // 字节高位
92 2 str++;
93 2 if(*str == 0) // 若str长度为奇数,则转换后最后一个字节高位补0
94 2 {
95 3 *byte = (tmp>>4)&0x0f;
96 3 return;
97 3 }
98 2 tmp += (*str)&0x0f; // 字节低位
99 2 *byte = tmp;
100 2 byte++;
101 2 }
102 1 }
103
104 /* 串口初始化 */
105 void serial_init()
106 {
107 1 /* 9600,n,8,1,外部晶振11.0592MHz,查询方式 */
108 1 TMOD = 0x20; // T1使用工作方式2
109 1 TH1 = 250; // 设置T1初值
110 1 TL1 = 250;
111 1 TR1 = 1; // T1开始计数
112 1 PCON = 0x80; // SMOD = 1
113 1 SCON = 0x50; // 工作方式1,波特率9600bit/s,允许接收
114 1 ES = 0; // 关闭串行中断
115 1 }
116
117 /* H6152复位函数 */
C51 COMPILER V7.02b RFICRDWR 12/10/2005 20:06:41 PAGE 3
118 void H6152Rst()
119 {
120 1 strcpy(hbuf,"x");
121 1 sendcmd(hbuf); // 发送命令"x"
122 1 delay(300); // 延时300ms确保H6152复位完毕
123 1 }
124
125 /* 卡片检测函数,检测到有卡在读写器有效区域内返回 */
126 void cardcheck()
127 {
128 1 strcpy(hbuf,"c");
129 1 sendcmd(hbuf); // 发送命令"c",命令进入“连续读”模式
130 1 delay(10); // 延时10ms
131 1
132 1 /* 一旦发现串口接收到数据就立即返回,
133 1 表示检测到读写器有效区域内有卡片 */
134 1 RI = 0;
135 1 while(!RI);
136 1 delay(10); // 延时10ms,消抖
137 1 RI = 0;
138 1 while(!RI);
139 1 /* 确认工作区内有卡片,返回 */
140 1 }
141
142 /* 停止卡片检测函数,即取消“连续读"模式 */
143 void endcheck()
144 {
145 1 strcpy(hbuf," ");
146 1 sendcmd(hbuf); // 发送" "取消”连续读“模式
147 1 delay(10); // 延时10ms
148 1 }
149
150 /* 自动选卡函数,读取所有卡片,随机选中并
151 返回其序列号,主要用于第一次选卡 */
152 uchar autoselect(uchar *buf)
153 {
154 1 uchar i;
155 1 strcpy(hbuf,"m\r");
156 1 sendcmd(hbuf); // 发送"m<CR>"
157 1 for(i=0;i<8;i++) // 接收第一张卡的序列号
158 1 {
159 2 RI = 0;
160 2 while(!RI);
161 2 *(hbuf+i) = SBUF;
162 2
163 2 /* 如果接收到错误信息则返回错误代码 */
164 2 if((*(hbuf+i)>0x39)&&(*(hbuf+i)<'a'))
165 2 return *(hbuf+i);
166 2 }
167 1 *(hbuf+i) = 0;
168 1 Hex2Byte(hbuf,buf); // 第一张卡片序列号由16进制字符串转换为字节数组
169 1
170 1 strcpy(hbuf,"m");
171 1 Byte2Hex(buf,4,hbuf);
172 1 delay(10);
173 1 sendcmd(hbuf); // 发送"m<SN>",选中第一张卡片
174 1 for(i=0;i<8;i++) // 接收选中卡片的序列号
175 1 {
176 2 RI = 0;
177 2 while(!RI);
178 2 *(hbuf+i) = SBUF;
179 2 /* 如果接收到错误信息则返回错误代码 */
C51 COMPILER V7.02b RFICRDWR 12/10/2005 20:06:41 PAGE 4
180 2 if((*(hbuf+i)>0x39)&&(*(hbuf+i)<'a'))
181 2 return *(hbuf+i);
182 2 }
183 1
184 1 return 0; // 成功
185 1 }
186
187 /* 指定选卡函数,根据制定序列号选卡 */
188 uchar snselect(uchar *sn)
189 {
190 1 uchar i;
191 1
192 1 strcpy(hbuf,"m");
193 1 Byte2Hex(sn,4,hbuf); // 将序列号sn转换为16进制字符串
194 1 delay(10);
195 1 sendcmd(hbuf); // 发送"m<SN>",选中第一张卡片
196 1 for(i=0;i<8;i++) // 接收选中卡片的序列号
197 1 {
198 2 RI = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -