?? 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 + -