📄 main.lst
字号:
C51 COMPILER V6.23a MAIN 08/14/2006 14:40:24 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND CODE
stmt level source
1 /****************************************************************************
2 * File : main.c *
3 * COPYRIGHT BY HUOYAN LTD.COMPANY *
4 * Version: V5.2 *
5 * Created: 18.11.2002 *
6 * Last Change: 8.Jan.2005 *
7 * Author: NIL *
8 * Compiler: KEIL C51 V7.10 *
9 * Description: AT89S52-Firmware for MFRC500 Demo Serial Reader *
10 * *
11 ****************************************************************************/
12 #define __SRC
13 #include "main.h"
14 #undef __SRC
15
16 #include <string.h>
17 #include <stdio.h>
18 #include <absacc.h>
19 #include <intrins.h>
20 #include "AT89S52.h"
21 #include "Mfreg500.h"
22 #include "M500a.h"
23
24
25 #define uchar unsigned char
26 #define uint unsigned int
27 //#define DataPort P0 // 数据端口
28
29
30 //pin define mcu控制管脚定义
31
32 sbit RC500RST = P1^0; //由高变低时复位RC500
33 sbit RC500CS=P1^1;
34 sbit CARD_LED=P1^2;
35 sbit SPEAKER = P1^3;
36
37 bit bcard;
38
39 ///////////////////////////////////////////////////////////////////////
40 // 主函数
41 ///////////////////////////////////////////////////////////////////////
42 void main(void)
43 { //设置变量
44 1 uchar baud;
45 1
46 1
47 1 InitSystem(); //初始化系统
48 1 // bcard=0;
49 1
50 1 delay_10ms(5);
51 1 while (1)
52 1 {
53 2
54 2 // KeyPress(); 处理按键
55 2 delay_10ms(5);
C51 COMPILER V6.23a MAIN 08/14/2006 14:40:24 PAGE 2
56 2 //检查串口命令标志
57 2 if (bCmd)
58 2 {
59 3
60 3 bCmd = FALSE; //清零命令标志以便接收下一个命令
61 3 if(RevBuffer[0]==0x10) //测试蜂鸣器
62 3 {
63 4 RevBuffer[2]=RevBuffer[1]; //蜂鸣时间存到RevBuffer[2]
64 4 cmd_ok(); //发送测试结果01 00给上位机
65 4 TI=1; //准备发给上位机数据
66 4 SPEAKER=1; //开蜂鸣器和指示灯
67 4 CARD_LED=ON;
68 4 delay_10ms(RevBuffer[2]); //延时
69 4 SPEAKER=0;
70 4 CARD_LED=OFF;
71 4
72 4 }
73 3 else if(RevBuffer[0]==0x11) //串口参数设置,设置通讯波特率
74 3 {
75 4 switch(RevBuffer[1])
76 4 {
77 5 case 0:
78 5 baud=BAUD_9600;
79 5 break;
80 5 case 1:
81 5 baud=BAUD_14400;
82 5 break;
83 5 case 2:
84 5 baud=BAUD_19200;
85 5 break;
86 5 case 3:
87 5 baud=BAUD_28800;
88 5 break;
89 5 case 4:
90 5 baud=BAUD_38400;
91 5 break;
92 5 case 5:
93 5 baud=BAUD_57600;
94 5 break;
95 5 case 6:
96 5 baud=BAUD_115200;
97 5 break;
98 5 default:
99 5 baud=BAUD_19200;
100 5 break;
101 5 }
102 4 cmd_ok(); //发送测试结果01 00给上位机
103 4 TI=1;
104 4 delay_10ms(5); //延时设置波特率
105 4 TR1 = 0;
106 4 TH1 = baud;
107 4 TL1 = TH1;
108 4 delay_10ms(2);
109 4 TR1 = TRUE;
110 4 }
111 3
112 3 else
113 3 {
114 4 uart_process(); // 进入串口处理程序
115 4 TI=1; //处理完准备发送结果给上位机
116 4 }
117 3
C51 COMPILER V6.23a MAIN 08/14/2006 14:40:24 PAGE 3
118 3
119 3
120 3 }
121 2
122 2 }
123 1 }
124
125 ///////////////////////////////////////////////////////////////////////
126 // 系统初始化
127 ///////////////////////////////////////////////////////////////////////
128 void InitSystem(void)
129 {
130 1 RC500CS=0; //选中RC500
131 1 RC500RST=0; //复位
132 1
133 1 ET2 = FALSE; // T/C2关中断
134 1 T2CON = 0x04; //TR2=1,设为TIMER2,auto reload
135 1 PCON = 0x80;
136 1 SCON = 0x70; // SMOD = 1;
137 1 TMOD = 0x21; //TMOD = 0x22;
138 1
139 1 TH1 = BAUD_19200; //默认波特率
140 1 TL1 = TH1;
141 1 TR1 = TRUE; // 以T1作为波特率发生器
142 1
143 1 ET1=FALSE;
144 1 IT0 =TRUE; // Config ext0 as edge trigger for RC500
145 1 EX0 =TRUE; // Enable ext0 interrupt for RC500
146 1 EA = TRUE; // Enable all interrupts
147 1 TR2=FALSE; //Close T2
148 1 IP=0x10; // 设串口中断高优先级
149 1 ES = TRUE; //打开串口
150 1
151 1 bCmd=FALSE; //初始化为0,没有收到命令
152 1
153 1 beep(1); //开机喇叭和指示灯测试
154 1 splash(1);
155 1 MfConfig(); //配置RC500
156 1
157 1
158 1 }
159
160 ///////////////////////////////////////////////////////////////////////
161 // 串口接收和发送中断
162 //数据包格式:数据包长度L(1byte)+命令字C(1byte)+数据包D(L-1 bytes)
163 //其中数据包长度是从命令字开始算起的。
164 ///////////////////////////////////////////////////////////////////////
165 void Uart_Int(void) interrupt 4 using 1
166 {
167 1 uchar len, i;
168 1 uint j=0;
169 1
170 1 if(RI) //收到数据
171 1 {
172 2 len=SBUF; //第一个字节是数据包的长度
173 2 RI=0; //清零RI以便接收下一个
174 2 for(i=0;i<len;i++)
175 2 {
176 3 while(!RI)
177 3 {
178 4 j++;
179 4 if(j>1000)
C51 COMPILER V6.23a MAIN 08/14/2006 14:40:24 PAGE 4
180 4 {
181 5 break;
182 5 }
183 4 }
184 3 if(j<1000)
185 3 {
186 4 RevBuffer[i]=SBUF;
187 4 RI=0;
188 4 j=0;
189 4 }
190 3 else
191 3 {
192 4 break;
193 4 }
194 3 }
195 2 if(i==len)
196 2 {
197 3 REN=0; // 清零接收位
198 3 bCmd=TRUE; //接收完毕,收到命令有效,置位1
199 3 }
200 2 }
201 1 else if(!RI && TI) //发送-RI=0,TI=1
202 1 {
203 2 TI=0;
204 2 len=RevBuffer[0]; //发送的第一个字节是包的长度
205 2 for(i=0;i<len+1;i++)
206 2 {
207 3 SBUF=RevBuffer[i];
208 3 while(!TI);
209 3 TI=0;
210 3 }
211 2 REN=1;
212 2 }
213 1 }
214 ///////////////////////////////////////////////////////////////////////
215 // IC卡命令处理函数
216 ///////////////////////////////////////////////////////////////////////
217 void uart_process(void)
218 {
219 1 uchar cmd;
220 1 uchar status;
221 1
222 1 cmd = RevBuffer[0];
223 1 switch(cmd)
224 1 {
225 2
226 2 case 0x20: // Request ,寻卡
227 2 status=M500PiccCommonRequest(RevBuffer[1],&RevBuffer[2]);
228 2 if(status!=0)
229 2 {
230 3 status=M500PiccCommonRequest(RevBuffer[1],&RevBuffer[2]);
231 3 if(status!=0)
232 3 {
233 4 RevBuffer[0]=1;
234 4 RevBuffer[1]=status;
235 4 break;
236 4 }
237 3 }
238 2 if(RevBuffer[2]==2)
239 2 cardtype=mifare1S70; // Mifare1 S70 卡
240 2 else if(RevBuffer[2]==4)
241 2 cardtype=mifare1S50; // Mifare1 S50 卡
C51 COMPILER V6.23a MAIN 08/14/2006 14:40:24 PAGE 5
242 2 else if(RevBuffer[2]==16)
243 2 cardtype=mifarelight; // Mifare Light 卡
244 2 else
245 2 cardtype=unknowncard;
246 2 RevBuffer[0]=3; // 返回3个字节:状态(1字节)+卡类型(2字节)
247 2 RevBuffer[1]=status;
248 2 break;
249 2
250 2 case 0x21: // 防冲突 读卡的系列号 CardSnr
251 2 status = M500PiccCascAnticoll(0,&RevBuffer[2]);
252 2 if(status!=0) //失败
253 2 {
254 3 RevBuffer[0]=1;
255 3 RevBuffer[1]=status;
256 3 break;
257 3 }
258 2 memcpy(CardSnr,&RevBuffer[2],4); //读出4字节序列号
259 2 RevBuffer[0]=5; // 返回5个字节:状态(1字节)+序列号(4字节)
260 2 RevBuffer[1]=status;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -