📄 zlg500b.lst
字号:
C51 COMPILER V7.20 ZLG500B 05/28/2007 14:55:19 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE ZLG500B
OBJECT MODULE PLACED IN zlg500B.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE zlg500B.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "main.h"
2
3 #define __SRC
4 #include "zlg500B.h"
5 #undef __SRC
6
7
8
9 void Serial_int(void) interrupt 4 using 1 //串口中断来干什么呢
10 {
11 1 uchar stx,index,BCC_sum=0,rcv_len=5;
12 1
13 1 ES0=0; //串行中断允许位,
14 1 RI0=0; //串口接收中断标志清零
15 1 stx=SBUF0; //收到的数据转到stx
16 1 /*通信协议中500B向主机发出响应信号*/
17 1 delay_50us(1); //延时:协议中没有这一延时
18 1
19 1 CON_485=1; //TXD发送时为高 即是主机有数据发出了
20 1 REN0=0; //暂时的禁止接收
21 1 SBUF0=ACK; //主机发送应答信号 主机己经准备好了接收从ZLG500B发出来的数据帧
22 1 while(TI0==0);
23 1 TI0=0;
24 1 CON_485=0; //因为串口己经发送完毕,将RS485控制信号拉低
25 1 REN0=1; //允许接收
26 1
27 1 for(index=0;index<rcv_len;index++)
28 1 {
29 2 START_T2(RCAP2_10ms); //定时器2的10MS的溢出率是自动重装方式
30 2 while(RI0==0&&TF2==0); //没有接收到什么AND定时器2没有溢出
31 2 if(RI0==1) //如果产生了接收中断
32 2 { RI0=0;
33 3 ser_buffer[index]=SBUF0; //发送数据
34 3 if(index==LENGTH) //发到最后一个数据了
35 3 rcv_len+=ser_buffer[index]; //最后一个数据与rcv_len
36 3 if(index<rcv_len-2) //当前序列号小于3
37 3 BCC_sum^=ser_buffer[index]; //异或
38 3 /* BCC校验码计算数据块中所有的INFO字节然后将结果传送到数据块的最后一个字节
39 3 如下式所示
40 3 INFO[n] = BCC = ~ INFO[0] ⊕ INFO[1] ⊕ ... ⊕ INFO[n-1] (⊕ ... XOR ~…NOT)*/
41 3 }
42 2 else break;
43 2 } //完成的数据的下行,命令模式
44 1
45 1 STOP_T2(); //停用TIMER2
46 1 ES0=1; //串行口中断允许位
47 1
48 1 if(stx!=STX) return; //如果主机收到的是错的数据
49 1 if(index==rcv_len)
50 1 {
51 2 if(BCC_sum!=~ser_buffer[rcv_len-2]) return; //BCC码又不对
52 2 if(ser_buffer[rcv_len-1]!=ETX) return; //结束标志数据又不对
53 2 }
54 1 else return;
55 1
C51 COMPILER V7.20 ZLG500B 05/28/2007 14:55:19 PAGE 2
56 1 newdata=1; //成功 当中断接收到新数据时该位置位
57 1 }
58
59
60 uchar senddata()
61 {
62 1 uchar send_cnt=3; //主机最多发3次STX信号
63 1 uchar send_len;
64 1 uchar temp;
65 1
66 1 ES0=0; //串行中断允许
67 1 do
68 1 { CON_485=1;
69 2 REN0=0;
70 2 SBUF0=STX; //主机向从机发送开始
71 2 while(TI0==0);
72 2 TI0=0;
73 2 CON_485=0; //发送完成就可以拉低
74 2
75 2 REN0=1;
76 2 START_T2(RCAP2_10ms); //自动重装方式
77 2 while(RI0==0&&TF2==0); //没有接收到什么 AND 定时器2没有溢出 //这里是查询,一定要有事发生才行
78 2 //很可能是串口收到数据(500B的应答信号)
79 2 STOP_T2();
80 2
81 2 if(RI0==1) //如果收到500B的响应
82 2 { RI0=0;
83 3 temp=SBUF0;
84 3 delay_50us(1);
85 3 if(temp==ACK) break; //收到500B的ACK信号
86 3 }
87 2 }while(--send_cnt);
88 1 if(send_cnt==0) return COMM_ERR; //退出整个发送数据
89 1
90 1
91 1 send_len=ser_buffer[LENGTH]+5; //有5个附属字节
92 1 ser_buffer[send_len-2]=0;
93 1 ser_buffer[send_len-1]=ETX; //最后发送一个终止符ETX结束本次发送
94 1
95 1 REN0=0;
96 1 CON_485=1; //表示又要发送数据了
97 1 for(send_cnt=0;send_cnt<send_len;send_cnt++)
98 1 {
99 2 SBUF0=ser_buffer[send_cnt];
100 2 if(send_cnt<(send_len-2)) //非BCC和ETX字节
101 2 ser_buffer[send_len-2]^=ser_buffer[send_cnt]; //求BCC
102 2 if(send_cnt==send_len-3)
103 2 ser_buffer[send_len-2]=~ser_buffer[send_len-2]; //最后求到BCC
104 2 while(TI0==0);
105 2 TI0=0;
106 2 }
107 1 CON_485=0; //发送完成收工
108 1 REN0=1;
109 1 ES0=1; //开中断
110 1
111 1 return COMM_OK;
112 1 }
113
114
115
116 uchar ser_comm(void) //主机等待500B发回状态和响应数据.若在300MS内未检测到响应,则退出本次传输
117 {
C51 COMPILER V7.20 ZLG500B 05/28/2007 14:55:19 PAGE 3
118 1 uchar ser_wdg=120;
119 1 if(senddata()!=COMM_OK) return COMM_ERR; //数据发送失败
120 1
121 1 START_T2(RCAP2_2ms); //定时器溢出2MS
122 1 while(newdata==0&&ser_wdg!=0)
123 1 {
124 2 if(TF2)
125 2 {
126 3 START_T2(RCAP2_2ms);
127 3 ser_wdg--;
128 3 }
129 2 }
130 1 if(newdata)
131 1 {
132 2 newdata=0;
133 2 return COMM_OK;
134 2 }
135 1 else
136 1 return COMM_ERR; //在300MS未栓测到响应
137 1 }
138
139
140
141 #if mifs_request_en
142 uchar mifs_request(uchar _Mode,uchar idata *_TagType) //发出询问命令,栓查在在效范围内是否有卡存在
143 {
144 1 ser_buffer[SEQNR]=0; //数据交换包的序号
145 1 ser_buffer[COMMAND]=0x41; //命令对应的数值
146 1 ser_buffer[LENGTH]=0x01; //数据长度
147 1 ser_buffer[DATA]=_Mode; //只有一个数据
148 1
149 1 if(ser_comm()!=COMM_OK) //主机等待500B发回状态和响应数据.若在300MS内未检测到响应,则退出本次传输
150 1 return COMM_ERR;
151 1
152 1 if(ser_buffer[STATUS]==MI_OK) //500B---主机:响应模式的状态字符
153 1 {
154 2 _TagType[0]=ser_buffer[DATA];
155 2 _TagType[1]=ser_buffer[DATA+1];
156 2 }
157 1 return ser_buffer[STATUS]; //返回状态值
158 1 }
159 #endif
160
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -