哈哈,不管它有没有问题了,终于把程序写完,而且测试成功!
第一次发送数据会出现问题,虽然没有解决,但是可以先发送测试的。第二次发送就没问题了
以下是我测试成功的代码,有解决方案的话,不妨说说。。。谢谢
1 /***********************************************************************
2 | |
3 | TC35 GSM模块远程控制 ver 1.0 |
4 | |
5 | CopyRight@ GDOU by Edward 2010.08 |
6 | |
7 | All Rights Reserved |
8 | |
9 | QQ:304467973 |
10 | |
11 | E-Mail:magicedward@qq.com |
12 | |
13 /************************************************************************/
14 #include<reg52.h>
15 #define uint unsigned int
16 #define uchar unsigned char
17 //sfr WDT_CONTR=0xe1; //看门狗寄存器
18 uchar i_TC35_RECE;
19
20 uchar i_receive,
21 TC35_RE[90], //储存串口返回数据
22 TC35_MAX,
23 i_TC35;
24
25
26 /* 初始化 用AT&W 写入EEPROM 一般先在电脑前设置
27 uchar code IPR[]="AT+IPR=115200"; //波特率 115200
28 uchar code CMGF[]="AT+CMGF=1"; //短信格式为 TEXT 模式
29 uchar code CSCA[]="AT+CSCA=+86"; //设置中心号码
30 uchar code CTNUM[]="13800759500"; //湛江移动中心号码 +8613800759500
31 uchar code CNMI[]="AT+CNMI=1,1,0,0,1"; //自动接收短信
32 */
33 uchar code CMGS[]="AT+CMGS="; //发短信指令
34 uchar idata SNUM[]="13659717684"; //接收方号码 //用户号码
35 uchar code CMGR[]="AT+CMGR=1"; //读第一条短信
36 uchar code CMGD[]="AT+CMGD=1"; //删除第一条短信
37 //修改用户号码及身份 先把它们存于电话本
38 //指令 AT+CPBW=1,+9952013659717684,145,######ARMERS
39 // 指令 11位用户密码 六位身份
40 uchar idata ORDER[]="ARMERS"; //默认六位用户身份
41 uchar code NEW_MSM[]="+CMTI:"; //新信息标志
42 uchar code CPBR[]="AT+CPBR=1"; //读电话本 把用户身份/主人号码储存于此
43 uchar code MSM[]="I LOVE MIRACLE. MISSING YOU!"; //要发送的信息内容
44 uchar code RFLAG1[]="+99520"; //读电话本 返回信息标志
45 uchar code RFLAG2[]="######";
46 uchar code AT[]="AT"; //AT测试指令
47 //uchar code OK[]="OK"; //成功返回信息
48
49 void delay(uint i) //延时函数
50 {uint i_delay,j_delay;
51 for(i_delay=0;i_delay<i;i_delay++)
52 {for(j_delay=0;j_delay<100;j_delay++)
53 {;}}
54 }
55
56 void init_serialcom() //本程序采用22.1184M晶振 其他自行更改
57 {
58 SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
59 //UART为模式1,8位数据,允许接收
60 TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
61 //定时器1为模式2,8位自动重装
62 PCON |= 0x80 ; //SMOD=1;
63 TH1 = 0xFF ;
64 TL1=0xFF; //Baud:115200 fosc="22.1184MHz
65 IE |= 0x90 ; //Enable Serial Interrupt
66 TR1 = 1 ; // timer 1 run
67 TI=1;
68
69 }
70
71
72
73 //向串口发送-个ASCII
74 void SendASC(uchar ASC)
75 {
76 SBUF=ASC;
77 while (TI== 0);
78 TI= 0 ;
79 }
80
81 //发送命令到TC35
82 void SendToTc35(uchar*p,uchar Len)
83 {
84 while(Len--)
85 {
86 SendASC(*p++);
87 }
88 }
89 //串口接收中断函数
90 void serial () interrupt 4 using 3
91 {
92 if (RI)
93 {
94 RI = 0 ;
95 i_receive=SBUF;
96 TC35_RE[i_TC35_RECE++]=i_receive;
97 // i_TC35_RECE++;
98 if(i_TC35_RECE>89) i_TC35_RECE=89;
99 if(i_TC35_RECE>TC35_MAX){TC35_MAX=i_TC35_RECE;}
100 }
101 }
102
103
104 /* 初始化函数 用AT&W 指令锁定后 不需再设置
105
106 void CRL_IPR() //设定波特率为 115200
107 {
108 SendToTc35(IPR,13);
109 SendASC(0x0D);
110 SendASC(0x0D);
111 SendASC(0x0A);
112 }
113
114 void CRL_TEXT() // 设定短信格式为 TEXT
115 {
116 SendToTc35(CMGF,9);
117 SendASC(0x0D);
118 SendASC(0x0D);
119 SendASC(0x0A);
120 }
121
122 void CRL_CSCA() // 设定中心号码
123 {
124 SendToTc35(CSCA,11);
125 SendToTc35(CTNUM,11); //11位中心号码
126 SendASC(0x0D);
127 SendASC(0x0D);
128 SendASC(0x0A);
129 }
130
131
132
133 void CRL_CNMI() // 设定为自动接收短信息
134 {
135 SendToTc35(CNMI,17);
136 SendASC(0x0D);
137 SendASC(0x0D);
138 SendASC(0x0A);
139 }
140 */
141
142 void AT_TEST() //AT 测试
143 {
144 SendToTc35(AT,2);
145 SendASC(0x0D);
146 SendASC(0x0D);
147 SendASC(0x0A);
148 }
149
150 void SENT_MSM() //向主人发送信息
151 {
152 SendToTc35(CMGS,8);
153 SendToTc35(SNUM,11);
154 SendASC(0x0D);
155 SendASC(0x0D);
156 SendASC(0x0A);
157 delay(2000);
158 SendToTc35(MSM,28);
159 SendASC(0x0D);
160 SendASC(0x0D);
161 SendASC(0x0A);
162 delay(2000);
163 SendASC(0x1A);
164 delay(2000);
165 }
166
167 void RE_BOOK() //读取电话本
168 {
169 SendToTc35(CPBR,9);
170 SendASC(0x0D);
171 SendASC(0x0D);
172 SendASC(0x0A);
173 }
174
175
176
177 void CRL_CMGR() // 读第一条短信息
178 {
179 SendToTc35(CMGR,9);
180 SendASC(0x0D);
181 SendASC(0x0D);
182 SendASC(0x0A);
183 }
184
185 void CRL_CMGD() // 删除第一条短信息
186 {
187 SendToTc35(CMGD,9);
188 SendASC(0x0D);
189 SendASC(0x0D);
190 SendASC(0x0A);
191 }
192
193 void CLEAR_DAT() //数据清零
194 {
195 for(i_TC35=0;i_TC35<=TC35_MAX;i_TC35++)
196 {
197 TC35_RE[i_TC35]=0;
198 }
199 i_TC35_RECE=0;
200 TC35_MAX=0;
201 }
202
203 uchar RE_BF(uchar b,uchar TC35_RE[],uchar ORDER[]) //利用BF算法 匹配用户身份
204 {
205 uchar bf1,bf2 ;
206 bf1=b; bf2=0;
207 while(bf1<TC35_MAX && bf2<6)
208 {
209 if(TC35_RE[bf1]==ORDER[bf2])
210 {
211 bf1++;
212 bf2++;
213 } else
214 {
215 bf1=bf1-bf2+1;
216 bf2=0;
217 }
218 }if(bf2>5) return bf1; //返回操作指令位置
219 else return 0;
220 }
221 void main()
222 {
223 uchar num,num1,orders;
224 init_serialcom();
225 delay(500);
226 // WDT_CONTR=0x37;
227 AT_TEST(); //AT测试 用于消除首次发送错误
228 delay(1000);
229 CLEAR_DAT();
230 RE_BOOK();//获取用户号码及身份
231 delay(6000); //确保读取身份
232
233 if(num1=RE_BF(15,TC35_RE,RFLAG1))
234 {
235 for(num=0;num<11;num++)
236 {
237 SNUM[num]=TC35_RE[num1++]; //更新用户号码
238 }
239
240 if(num1=RE_BF(30,TC35_RE,RFLAG2))
241 {
242 for(num=0;num<6;num++)
243 {
244 ORDER[num]=TC35_RE[num1++]; //更新用户身份
245 }
246 }
247
248 }
249
250 CLEAR_DAT(); //数据清零
251
252 while(1)
253 {
254
255 while(RE_BF(0,TC35_RE,NEW_MSM))
256
257 {
258 CLEAR_DAT(); //数据清零
259 CRL_CMGR() ; // 读第一条短信息
260 delay(1000);
261 CLEAR_DAT(); //数据清零
262 CRL_CMGR() ;
263 delay(1000);
264
265 orders=TC35_RE[RE_BF(60,TC35_RE,ORDER)];
266 // SendASC(orders);
267 if(orders=='8')
268 {
269 SENT_MSM();
270 delay(10000); //确保发送成功且返回
271 }
272
273 switch(orders) //远程控制 自行更改
274 {
275 case '1': P1=0x01; break;
276 case '2': P1=0x03; break;
277 case '3': P1=0x07; break;
278 case '4': P1=0x0f; break;
279 case '5': P1=0x1f; break;
280 case '6': P1=0x3f; break;
281 case '7': P1=0x7f; break;
282 case '8': P1=0xff; break;
283 default: P1=0x00;break;
284 }
285
286 orders=0;
287 CRL_CMGD() ; // 删除第一条短信息
288 delay(1000);
289 CLEAR_DAT(); //数据清零
290
291 }
292 }
293 }
294
295 [/code]
|