📄 cpu_com.lst
字号:
C51 COMPILER V7.50 CPU_COM 05/16/2006 17:45:20 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE CPU_COM
OBJECT MODULE PLACED IN CPU_COM.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE CPU_COM.c LARGE BROWSE INCDIR(G:\生产许可证北京\朱胜春\WORK\a
-pdu_ok\小机器\Cpu_22.1184\;G:\生产许可证北京\朱胜春\WORK\apdu_ok\小机器\Cpu_22.1184\;G:\生产许可证北京\朱胜春\WORK\apdu_
-ok\小机器\Cpu_22.1184\) DEBUG OBJECTEXTEND
line level source
1 //#include "type.h"
2 #include "reg51.h"
3 #include "stdio.h"
4 #include "stdlib.h"
5 #include "string.h"
6 #include "INTRINS.H"
7 #include "CPU_COM.h"
8 unsigned char xdata OutData[255] _at_ 0x0200;
9 void main()
10 {
11 1 unsigned char idata pATR[1],InData[32]={0x05,0xAA,0x55,0x00,0x00,0x08};
12 1 unsigned char ndata[2] = {0xAA,0x55};
13 1 //unsigned char idata OutData[64];
14 1
15 1 PLY_APDU();
16 1 Inttime0(); //定时器0初始化
17 1 com_Open(); //打开串口
18 1 // SendCom()
19 1 //cpu_Open(); //CPU卡上电并读ATR并把ATR通过串口发送,如果读ATR错误则输出FF
20 1 // ICC_INS(&InData[1],OutData,*InData);
21 1 // SendChar(0x36);
22 1 //ICC_INS:输入数据指针*InData,输入数据长度lnin,输出数据指针*OutData,输出数据长度为*OutData
23 1 // if (ICC_INS(&InData[1],OutData,*InData)!=TRUE)
24 1 // {
25 1 // OutData[0] = 1;
26 1 // OutData[1] = 0xff;
27 1 // }
28 1 while(1)
29 1 {
30 2 //SendCom(2,&InData[1]);
31 2 if(readCom(InData) == TRUE)
32 2 {
33 3 if(!memcmp(ndata,InData+1,2))
34 3 {
35 4 SendCom(2,"OK");
36 4 break;
37 4 }
38 3 else
39 3 SendCom(2,"ER");
40 3 }
41 2 else
42 2 SendCom(2,"ER");
43 2 }
44 1 ndata[0]=0xaa;
45 1 while(1)
46 1 {
47 2 if(readCom(InData) == TRUE)
48 2 {
49 3 if(*InData == 1)
50 3 continue;
51 3 else
52 3 {
53 4 if (ICC_INS(&InData[1],*InData)!=TRUE)
C51 COMPILER V7.50 CPU_COM 05/16/2006 17:45:20 PAGE 2
54 4 {
55 5 OutData[0] = 1;
56 5 OutData[1]=0xff;
57 5 }
58 4 // Extra_guardtime_N = Extra_guardtime_N_bak;
59 4 //if(OutData[0]<=64)
60 4 SendCom(OutData[0],&OutData[1]);
61 4 //else
62 4 //SendCom((OutData[0]-64),OutData1);
63 4 }
64 3 }
65 2 else
66 2 {
67 3 OutData[0] = 1;
68 3 OutData[1]=0xff;
69 3 SendCom(OutData[0],&OutData[1]);
70 3 }
71 2
72 2 }
73 1
74 1 }
*** WARNING C280 IN LINE 11 OF CPU_COM.C: 'pATR': unreferenced local variable
75 //=============初始化定时器================================
76 void Inttime0()
77 {
78 1 TMOD|=0x02; /*定时器0为模式2(8位自动重装) */
79 1 TR0=0; //在发送或接收才开始使用
80 1 TF0=0; //清定时器溢出标志
81 1 TH0=0XA0; //9600是1000000/9600=104.167微秒104.167*11.0592/12=96 (256-96=0XA0)
82 1 TL0=TH0;
83 1 ET0=1; //开定时器中断
84 1 EA=1; //开CPU中断
85 1 }
86 //=========================================================
87 //=============定时器中断子程序============================
88 void IntTimer0() interrupt 1
89 {
90 1 F_TM=1; //定时器溢出引起中断,置标志位
91 1 }
92 //=========================================================
93 //=============发送一个字符传入发送数据返回是否发送正确====
94 //=============返回错误时则启用释放终端====================
95 unsigned char SendChar(unsigned char ch)
96 {
97 1 unsigned char i = 0,bak; //p为1的个数
98 1 unsigned char idata b=0;
99 1 bit a = 0;
100 1 //bak = ch;
101 1 if(CPUCD_Format != 0)
102 1 ch = ~ch;
103 1 bak = ch;
104 1 if(CPUCD_Format == 0)
105 1 {
106 2 F_TM=0; //关中断标志
107 2 start:
108 2 BT_SND = 0; //发送起始位
109 2 TH0 = 0xB6;
110 2 TL0 = 0xB6;
111 2 TR0 = 1;
112 2 //TIMER0_ENABLE; //启动定时器
113 2 while(!F_TM); //检测到中断标志后开始发送一个字符(8位)
114 2 while(i<8)
C51 COMPILER V7.50 CPU_COM 05/16/2006 17:45:20 PAGE 3
115 2 {
116 3 if(ch&1)
117 3 {
118 4 BT_SND = 1;
119 4 a=(~a);
120 4 }
121 3 else
122 3 {
123 4 BT_SND = 0;
124 4 a = a;
125 4 }
126 3 TH0 = 0xBF;
127 3 TIMER0_ENABLE;
128 3 F_TM=0; //发送一位之后关标志准备发送下一位
129 3 while(!F_TM);
130 3 i++;
131 3 ch>>=1;
132 3 } //结束位(9+0.268)etu~(10+0.098)etu
133 2 if(a)
134 2 {
135 3 BT_SND = 1; //数据位1的个数为偶数则发送0保证数据位和效验1的个数为偶数
136 3 }
137 2 else
138 2 {
139 3 BT_SND = 0; //数据位1的个数为奇数则发送1保证数据位和效验1的个数为偶数
140 3 }
141 2 TH0 = 0xAD;
142 2 TIMER0_ENABLE;
143 2 F_TM=0;
144 2 while(!F_TM);
145 2 //上面是起始+8位数据+1位校验 //(10+0.098)etu
146 2 BT_SND = 1;
147 2 TH0 = 0xB2;
148 2 TIMER0_ENABLE;
149 2 F_TM=0;
150 2 while(!F_TM);
151 2
152 2 TH0 = 0xA5;
153 2 TIMER0_ENABLE; //(11+0.135)etu 11etu处检测
154 2 if(BT_SND == 0) //如果IC卡有误
155 2 {
156 3 if(b == 4)
157 3 return FALSE;
158 3 F_TM=0;
159 3 while(!F_TM);
160 3 // BT_SND = 1;
161 3 F_TM=0;
162 3 while(!F_TM);
163 3 F_TM=0;
164 3 // TH0 = 0xFF;
165 3 // TIMER0_ENABLE; //(11+0.135)etu 11etu处检测
166 3 i = 0;
167 3 b++;
168 3 ch = bak;
169 3 goto start;
170 3 }
171 2 TH0 = 0xB4;
172 2 TIMER0_ENABLE;
173 2 F_TM=0;
174 2 while(!F_TM);
175 2 for(i=0;i<Extra_guardtime_N;i++)
176 2 {
C51 COMPILER V7.50 CPU_COM 05/16/2006 17:45:20 PAGE 4
177 3 TH0 = 0xB6;
178 3 TIMER0_ENABLE;
179 3 F_TM=0;
180 3 while(!F_TM);
181 3 }
182 2 TIMER0_DISABLE; //停止定时器
183 2 return TRUE;
184 2 }
185 1 else
186 1 {
187 2 F_TM=0; //关中断标志
188 2 start1:
189 2 BT_SND = 0; //发送起始位
190 2 TH0 = 0x54;
191 2 TL0 = 0x54;
192 2 TR0 = 1;
193 2 //TIMER0_ENABLE; //启动定时器
194 2 while(!F_TM); //检测到中断标志后开始发送一个字符(8位)
195 2 while(i<8)
196 2 {
197 3 if(ch&0x80)
198 3 {
199 4 BT_SND = 1;
200 4 a=(~a);
201 4 }
202 3 else
203 3 {
204 4 BT_SND = 0;
205 4 a = a;
206 4 }
207 3 TH0 = 0x5F;
208 3 TIMER0_ENABLE;
209 3 F_TM=0; //发送一位之后关标志准备发送下一位
210 3 while(!F_TM);
211 3 i++;
212 3 ch<<=1;
213 3 } //结束位(9+0.268)etu~(10+0.098)etu
214 2 if(a)
215 2 {
216 3 BT_SND = 0; //数据位1的个数为偶数则发送0保证数据位和效验1的个数为偶数
217 3 }
218 2 else
219 2 {
220 3 BT_SND = 1; //数据位1的个数为奇数则发送1保证数据位和效验1的个数为偶数
221 3 }
222 2 TH0 = 0x4E;
223 2 TIMER0_ENABLE;
224 2 F_TM=0;
225 2 while(!F_TM);
226 2 //(10+0.098)etu
227 2 BT_SND = 1;
228 2 TH0 = 0x51;
229 2 TIMER0_ENABLE;
230 2 F_TM=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -