📄 rs485.lst
字号:
C51 COMPILER V6.02 RS485 03/10/2006 14:34:52 PAGE 1
C51 COMPILER V6.02, COMPILATION OF MODULE RS485
OBJECT MODULE PLACED IN RS485.OBJ
COMPILER INVOKED BY: C:\COMP51\C51.EXE RS485.C DB OE SMALL ROM(LARGE)
stmt level source
1 /*
2 串口通讯程序,分与分机通讯程序和与管理机通讯程序,其中:发送数据用同一个串口,接收分机数据由FPGA完成
3 接收管理机数据由51完成
4 mainFcommon(uchar txcommand)为发数据到分机,只要填好数据调用此函数即可
5 Doorcommon(void)为发数据到主机,填好数据调此函数,返回YES表示数据通讯正常
6 */
7
8
9 #include "defineh.h"
10 #include "externh.h"
11
12 uchar haveDOORWORKDATA; //对方忙
13
14 extern void nop(void);
15 extern void watchdog(void);
16 extern void delays100ms(void);
17 extern void roomalarmdatawork(void);//报警数据缓存
18
19 void datatosamedoor(uchar commandone,uchar commandtwo); //发送数据给分机或从主从门口机 而不需要应答的
20 void copystoretotemp(void); //把缓冲区的数据临时保存起来
21 void copystoretotxf(void); //把缓冲区的数据临时保存的数据送到发送缓冲区
22
23 sbit mRxd=P3^0;
24 sbit mFRxd=P3^3;
25 sbit mRs485F=P1^2;
26 sbit mRs485G=P1^3;
27
28
29 /**********************************************/
30
31 /*
32 void delays1ms(void)
33 {
34 uchar i;
35 for(i=0;i<=150;i++);
36 }
37 */
38 void copystoretotemp(void) //把缓冲区的数据临时保存起来
39 {
40 1 uchar xdata i;
41 1 for(i=0;i<14;i++)
42 1 TempTx_buffer[i]=TxF_buffer[i];
43 1 }
44 void copystoretotxf(void) //把缓冲区的数据临时保存的数据送到发送缓冲区
45 {
46 1 uchar xdata i;
47 1 for(i=0;i<14;i++)
48 1 TxF_buffer[i]=TempTx_buffer[i];
49 1 }
50 void delays3ms(void)
51 {
52 1 uint i;
53 1 for(i=0;i<=500;i++);
54 1 }
55
C51 COMPILER V6.02 RS485 03/10/2006 14:34:52 PAGE 2
56 void RSdelays10ms(void)
57 {
58 1 uint i;
59 1 for(i=0;i<=2000;i++);
60 1 }
61
62 void delays60ms(void)
63 {
64 1 uchar j;
65 1 uint i;
66 1 for(j=0;j<3;j++)
67 1 for(i=0;i<=4000;i++);
68 1 }
69
70 /**********************************************/
71 void testrx(void) /*检测到RX变低延时后发*/
72 {
73 1 if(!mRxd)
74 1 {
75 2 delays60ms();
76 2 Rxlowtime=0;
77 2 Rxlow_bit=1;
78 2 }
79 1 }
80 void detectbusSTA() //检测总线状态
81 {
82 1 uchar m,n=0;
83 1
84 1 for(n=0;n<=50;n++) //第一次检测
85 1 {
86 2 watchdog();
87 2 testrx();
88 2 }
89 1 if(secdooraddr==0x0a)
90 1 m=0;
91 1 else
92 1 m=secdooraddr;
93 1 for(;m>0;m--) //根据门口机的地址进行延时
94 1 //delays1ms();
95 1 delays3ms();
96 1
97 1 for(n=0;n<=50;n++) //第二次检测
98 1 {
99 2 watchdog();
100 2 testrx();
101 2 }
102 1
103 1
104 1
105 1 }
106 /**********************************************/
107 void testFrx(void) /*检测到RX变低延时后发*/
108 {
109 1 if((RxFrun_bit==1)||(RxF_count!=0))
110 1 {
111 2 delays60ms();
112 2 Rxlowtime=0;
113 2 Rxlow_bit=1;
114 2 }
115 1
116 1 }
117
C51 COMPILER V6.02 RS485 03/10/2006 14:34:52 PAGE 3
118 void detectFbusSTA() //检测分机总线状态
119 {
120 1
121 1 uchar m,n=0;
122 1 for(;n<60;n++)
123 1 {
124 2 watchdog();
125 2 testFrx();
126 2 }
127 1
128 1 if(secdooraddr==0x0a)
129 1 m=0;
130 1 else
131 1 m=secdooraddr;
132 1 for(;m>0;m--) //根据门口机的地址进行延时
133 1 //delays1ms();
134 1 delays3ms();
135 1
136 1 for(n=0;n<=50;n++) //第二次检测
137 1 {
138 2 watchdog();
139 2 testFrx();
140 2 }
141 1
142 1
143 1 }
144 /**********************************************/
145 void Ftxstart(void)
146 {
147 1 #if SENDISHIGH //1 RS485 SEND ENABLE IS HIGH
{
mRs485F=1;
mRs485G=0;
}
#else //0为11.0592, RS485enable is high(receive)
153 1 {
154 2 mRs485F=0;
155 2 mRs485G=1;
156 2 }
157 1 #endif
158 1
159 1 TxF_bit=1;
160 1 TxF_count=0;
161 1 txselect_bit=1;
162 1 SBUF=SENDSTART;
163 1 TxF_sum=SENDSTART;
164 1 }
165 /**********************************************/
166 void Gtxstart(void)
167 {
168 1 #if SENDISHIGH //1 RS485 SEND ENABLE IS HIGH
{
mRs485F=0;
mRs485G=1;
}
#else //0为11.0592, RS485enable is high(receive)
174 1 {
175 2 mRs485F=1;
176 2 mRs485G=0;
177 2 }
178 1 #endif
179 1
C51 COMPILER V6.02 RS485 03/10/2006 14:34:52 PAGE 4
180 1 Tx_bit=1;
181 1 Tx_count=0;
182 1 txselect_bit=0;
183 1 SBUF=DSENDSTART;
184 1 Tx_sum=DSENDSTART;
185 1 }
186 /***********************************************/
187 bit Frsprogarm(uchar txdata) /*有数据要求发到分机,填好数据,*/
188 {
189 1 uchar i;
190 1 uchar j;
191 1 //delays60ms();
192 1 // detectFbusSTA(); //检测分机总线状态
193 1 j=randdata; /*随机数,以便和其它机通讯错开时间*/
194 1 txdata=txdata;
195 1 innersendwaitBIT=1; //发送数据计时
196 1 innersendwaitTimeCnt=0;
197 1 haveDOORWORKDATA=0;
198 1 for(;;)
199 1 {
200 2
201 2 if(RxFrun_bit==1)
202 2 {
203 3 delays60ms();
204 3 watchdog();
205 3 }
206 2
207 2 if((innercallDATA==1)&&(((TxF_buffer[0]==MAINCALL)|(TxF_buffer[0]==CENCALL)|(TxF_buffer[0]==DDOORCALL))
-))
208 2 {
209 3 for(i=0;i<15;i++)
210 3 {
211 4 delays60ms();
212 4 watchdog();
213 4 if(EnWork_bit==1)
214 4 break;
215 4 }
216 3 }
217 2 if(EnWork_bit==1)
218 2 {
219 3
220 3 if(TxF_buffer[0]==NEEDTOUSELINE)
221 3 {
222 4 if(lineuseNUM!=secdooraddr)
223 4 break;
224 4
225 4 }
226 3 }
227 2 if(innersendwaitTimeCnt>SENDWAITTIMEOUT)
228 2 return NO;
229 2
230 2 if((!Tx_bit)&&(!TxF_bit)&&(!RxFrun_bit)&&(j==0))
231 2 {
232 3 Ftxstart();
233 3 return YES;
234 3
235 3 }
236 2 if(j==0)
237 2 j=30;
238 2 j--;
239 2 nop();
240 2 watchdog();
C51 COMPILER V6.02 RS485 03/10/2006 14:34:52 PAGE 5
241 2 }
242 1 return NO;
243 1 }
244 /***********************************************/
245 bit Grsprogarm(uchar txgcommand) /*有数据要求发到管理机,填好数据,*/
246 {
247 1 uchar i,j;
248 1
249 1 j=randdata; /*随机数,以便和其它机通讯错开时间*/
250 1
251 1 //delays60ms();
252 1 //detectbusSTA();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -