📄 main.lst
字号:
C51 COMPILER V7.10 MAIN 05/03/2007 10:20:04 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN MAIN.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE MAIN.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /* IO 口模拟232通讯程序
2 使用两种方式的C程序 占用定时器0
3 **********************************************/
4 #include <ctype.h>
5 #include <reg51.h>
6 #include <stdio.h>
7 #include <string.h>
8 #define DEBUG_SMS
9
10 #define byte unsigned char
11 extern void sector_erase(unsigned short int dataAddr);
12 extern void byte_program(unsigned short int dataAddr, unsigned char dataByte);
13 extern unsigned char byte_verify(unsigned short int dataAddr);
14 extern bit sendSMS(byte *telnum, byte *STRING);
15 extern bit getAck(byte Len,byte *getData);
16 extern void deleSMS(byte *POINT);
17 byte gsmDecode7bit(unsigned char* pSrc, char* pDst, byte nSrcLength);
18 pdata byte pData[256];
19 sbit BT_SND =P1^7;
20 sbit BT_REC =P1^6;
21
22 //sbit BT_SND =P3^1;
23 //sbit BT_REC =P3^0;
24 //sbit LED_RED =P1^1;
25
26
27
28 typedef struct{
29 byte Index[4]; //短消息索引
30 byte TelNum[16];
31 byte Ref[20];
32 byte SMS_text[100];
33
34 }SMS_INFO;
35
36
37
38
39 byte RxFlag=0;
40 byte RecTimeOut=0;
41 byte RecStatus=0;
42 byte RxCount=0;
43 bit SMS_TYPE;
44 // 设置接收短信的手机号
45 //6
46 //code byte Owner[]="Owner";
47
48 // 更改密码
49 //code byte Password[]="Password";
50
51 //取信息
52 //code byte GetMessage[]="Get Message";
53
54 code byte ACK_OK[]={'O','K',0X0D,0X0A,0X00};
55 //code byte CharZ[]={'>',0X00};
C51 COMPILER V7.10 MAIN 05/03/2007 10:20:04 PAGE 2
56 //code byte CMG[]={'+','C','M','G',0};
57
58 bit LongDataFlag;
59
60 #ifdef DEBUG_SMS
61 extern void putch(byte ch);
62 #endif
63
64 #define F_TM F0
65
66 #define TIMER0_ENABLE TL0=TH0; TR0=1;
67 #define TIMER0_DISABLE TR0=0;
68
69 sbit ACC0= ACC^0;
70 sbit ACC1= ACC^1;
71 sbit ACC2= ACC^2;
72 sbit ACC3= ACC^3;
73 sbit ACC4= ACC^4;
74 sbit ACC5= ACC^5;
75 sbit ACC6= ACC^6;
76 sbit ACC7= ACC^7;
77
78
79 // 在 S 串中找 串 T ,算法如下。 从第一个数开始比较之前,先求出各串的长度。
80 // 当比较的字符数都小于各自的串长度时,进行比较 当取出的数据比较相等时,设量i,j 都加 1.
81 // 不相等时, i=i-j+2,j=1;
82 // 退出比较,当j> t 串的长度时,比较成功。即在 i- t 长处发现相待。
83
84 unsigned char cmp(unsigned char *array1,unsigned char *array2)
85 {
86 1 unsigned char i;
87 1
88 1 unsigned char m=strlen (array2);
89 1
90 1 for(i=0;i<256-m;i++)
91 1 {
92 2 if(memcmp(&array1[i],array2,m)==0)
93 2 return(i);
94 2 }
95 1 return(0xff);
96 1
97 1
98 1 }
99
100
101 //用IO模拟串口收,发数据占用定时器0
102 void IntTimer0() interrupt 1
103 {
104 1 F_TM=1;
105 1 }
106
107 //模拟串口,发送一个字符
108 void PSendChar(unsigned char inch)
109 {
110 1 ACC=inch;
111 1 F_TM=0;
112 1 BT_SND=0; //start bit
113 1 TIMER0_ENABLE; //启动
114 1 while(!F_TM);
115 1
116 1 BT_SND=ACC0; //先送出低位
117 1 F_TM=0;
C51 COMPILER V7.10 MAIN 05/03/2007 10:20:04 PAGE 3
118 1 while(!F_TM);
119 1
120 1 BT_SND=ACC1;
121 1 F_TM=0;
122 1 while(!F_TM);
123 1
124 1 BT_SND=ACC2;
125 1 F_TM=0;
126 1 while(!F_TM);
127 1
128 1 BT_SND=ACC3;
129 1 F_TM=0;
130 1 while(!F_TM);
131 1
132 1 BT_SND=ACC4;
133 1 F_TM=0;
134 1 while(!F_TM);
135 1
136 1 BT_SND=ACC5;
137 1 F_TM=0;
138 1 while(!F_TM);
139 1
140 1 BT_SND=ACC6;
141 1 F_TM=0;
142 1 while(!F_TM);
143 1
144 1 BT_SND=ACC7;
145 1 F_TM=0;
146 1 while(!F_TM);
147 1
148 1 BT_SND=1;
149 1 F_TM=0;
150 1 while(!F_TM);
151 1 F_TM=0;
152 1
153 1 TIMER0_DISABLE; //停止timer
154 1 }
155
156 //模拟串口,接收一个字符
157 unsigned char PGetChar()
158 {
159 1 TIMER0_ENABLE;
160 1 F_TM=0;
161 1 while(!F_TM); //等过起始位
162 1 ACC0=BT_REC;
163 1
164 1 TL0=TH0;
165 1
166 1 F_TM=0;
167 1 while(!F_TM);
168 1 ACC1=BT_REC;
169 1
170 1 F_TM=0;
171 1 while(!F_TM);
172 1 ACC2=BT_REC;
173 1
174 1 F_TM=0;
175 1 while(!F_TM);
176 1 ACC3=BT_REC;
177 1
178 1 F_TM=0;
179 1 while(!F_TM);
C51 COMPILER V7.10 MAIN 05/03/2007 10:20:04 PAGE 4
180 1 ACC4=BT_REC;
181 1
182 1 F_TM=0;
183 1 while(!F_TM);
184 1 ACC5=BT_REC;
185 1
186 1 F_TM=0;
187 1 while(!F_TM);
188 1 ACC6=BT_REC;
189 1
190 1 F_TM=0;
191 1 while(!F_TM);
192 1 ACC7=BT_REC;
193 1
194 1 F_TM=0;
195 1
196 1 while(!F_TM)
197 1 {
198 2 if(BT_REC)
199 2 {
200 3 break;
201 3 }
202 2 }
203 1 TIMER0_DISABLE; //停止timer
204 1 return ACC;
205 1
206 1 }
207
208
209 //发送字符串
210 unsigned char send_str(unsigned char *str)
211 {
212 1 unsigned char i;
213 1 i=0;
214 1 while( str[i] != 0 ){
215 2 PSendChar(str[i]);
216 2 i++;
217 2 }
218 1
219 1 return(0);
220 1 }
221
222
223 unsigned char SendAT(unsigned char *command,unsigned char * Cmp_Data,unsigned char *ACK)
224 {
225 1 unsigned char i=0;
226 1 unsigned char ACK_LEN;
227 1 unsigned long m;
228 1
229 1 if(strlen(command) > 0)
230 1 {
231 2 while(1)
232 2 {
233 3
234 3 if(command[i] == 0 || command[i] == '\n' || command[i] == '\r' )
235 3 {
236 4 PSendChar(0x0D);
237 4 break;
238 4 }
239 3
240 3 else
241 3 {
C51 COMPILER V7.10 MAIN 05/03/2007 10:20:04 PAGE 5
242 4 PSendChar(command[i]);
243 4
244 4 }
245 3
246 3 i++;
247 3 }
248 2 }
249 1
250 1 ACK_LEN = strlen(Cmp_Data);
251 1
252 1 /*
253 1 三秒钟内无回复,认为超时退出.
254 1 */
255 1 m = 500000L;
256 1 i = 0;
257 1 while(m--)
258 1 {
259 2
260 2 if(BT_REC==0)
261 2 {
262 3
263 3 ACK[i] =PGetChar();
264 3 m = 200000L;
265 3 if(i<0xff)
266 3 i+=1;
267 3 if(i>=ACK_LEN)
268 3 {
269 4 if(memcmp(&ACK[i-ACK_LEN],Cmp_Data,ACK_LEN)==0)
270 4 {
271 5 if(i>=0x80) LongDataFlag = 1; //收到的数据确实很长
272 5 return(i+0x80);
273 5 }
274 4
275 4 }
276 3 }
277 2
278 2 }
279 1
280 1 return(i); //回复收到的数据长度.
281 1
282 1 }
283
284
285 unsigned long delay;
286
287 void Delay100mS(byte Cnt)
288 {
289 1 unsigned int m_100MS;
290 1 m_100MS = 0;
291 1 while(--Cnt)
292 1 {
293 2 for(m_100MS=0;m_100MS<60000;m_100MS++);
294 2 }
295 1
296 1 }
297
298 bit CPL;
299 void main()
300 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -