📄 sms.lst
字号:
C51 COMPILER V7.07 SMS 03/17/2004 17:22:20 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE SMS
OBJECT MODULE PLACED IN sms.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE sms.c BROWSE DEBUG OBJECTEXTEND TABS(3)
stmt level source
1 #include <intrins.h> // 外部函数头文件,只用到了其中的空操作函数_nop_();
2 #include <At89x52.h> // AT89C52管脚定义头文件
3 /////////////////////////////////////
4 /*采用P1口作控制
5 // 11.0592的晶体
6 // RST=20K*/
7 ////////////////////////////////////
8
9 // 函数声明
10 void setup_t1(void); // 设置波特率
11 void receive(void); // 串口接收中断响应函数
12 void setup_ck(void); // 设置串口
13 void show(void); // 在数码管上显示DATA1,DATA2,DATA3,DATA4的值,调试用
14
15 // 下列四个值分别用来显示在数码管上,调试用
16 // DATA4变化:串口在接收一般字符
17 // DATA1变化:串口在接收一条新消息到来的标志 +CMTI: "SM",1
18 // DATA2变化:从新消息到来的标志(放在inbuf中)判断到了"SM"字符,从而可以解析后跟的
19 // 新消息在SIM卡中的存放位置
20 // DATA3变化:收到的新消息是合法消息,内容的前6位密码正确
21 unsigned char data date1=0xa0, date2=0x67 ,date3=0xe6 ,date4=0xaa;
22
23 // num2:用来标志收到新到消息标志+CMTI:的字符序号,只有连续收到+CMTI:即num2=6时,
24 // 才认为确实收到了一条新消息。
25 // send: 标志是否有新消息到来
26 // =0 没有新到消息
27 // =1 有新到消息,开始处理新到消息
28 unsigned char data num2=1, send = 0;
29
30 // inbuf: 用来存放从sim卡中读取的消息内容;或者要发送的消息内容
31 unsigned char data inbuf[50];
32
33 // buff: 用来存放要发送的消息的AT指令头;或者从SIM卡中读取的密码
34 unsigned char data buff[30];
35
36 // type:定义了短消息操作类型
37 // =0 空操作
38 // =4 收到了合法短消息
39 // =5 从sim卡中读取一条短消息
40 // =6 从sim卡中删除一条短消息
41 // =7 从sim卡的地址本的1位置中读取密码
42 unsigned char data type = 0; // send at cmd type
43
44 // hasplus86: 接收的短消息内容中,发送方的手机号码是否有+86
45 // =0 无+86
46 // =1 有+86
47 unsigned char hasplus86 = 0;
48
49 // idx: inbuf缓冲区当前使用字节的计数
50 char data idx=0;
51
52 // idx2: buff缓冲区当前使用字节的计数
53 char data idx2=0;
54
55 // offset: 在从sim卡中读取一条短消息时候,只读取发送方的电话
C51 COMPILER V7.07 SMS 03/17/2004 17:22:20 PAGE 2
56 // 号码和内容;中间的时间等其他内容将被忽略掉,offset
57 // 用来标志在读取中要忽略的字节个数。
58 char data offset=0;
59
60 #define INBUFF_SIZE 50 // inbuf最大容纳的字节数
61 #define BUFF_SIZE 30 // buff最大容纳的字节数
62 #define CLK7219 P1_2 // 数码管显示用管脚
63 #define DIN7219 P1_1 // 数码管显示用管脚
64
65 // 清空缓冲区
66 void buffzero(unsigned char *pBuff, unsigned char c, unsigned int size)
67 {
68 1 unsigned char i = 0;
69 1 for(i=0; i<size; i++)
70 1 *(pBuff+i) = c;
71 1 }
72
73 // 清空缓冲区//供中断程序调用
74 void buffzero2(unsigned char *pBuff, unsigned char c, unsigned int size)
75 {
76 1 unsigned char i = 0;
77 1 for(i=0; i<size; i++)
78 1 *(pBuff+i) = c;
79 1 }
80
81 // 延迟函数
82 void delay(int c)
83 {
84 1 int i=0, j=0, k=0;
85 1 _nop_();
86 1 if(c > 0)
87 1 {
88 2 for(i=0;i<31000;i++);
89 2 {
90 3 if(c > 1)
91 3 {
92 4 for(j=0;j<31000;j++);
93 4 {
94 5 if(c > 2)
95 5 for(k=0;k<31000;k++);
96 5 }
97 4 }
98 3 }
99 2 }
100 1 }
101
102 // 设置波特率
103 void setup_t1(void)
104 {
105 1 TMOD=0x20;
106 1 TH1=0xfd;
107 1 TL1=0xfd;
108 1 TR1=1;
109 1 // ET1=0;
110 1 }
111
112 // 设置串口
113 void setup_ck(void)
114 {
115 1 SCON=0x50;
116 1 PCON=0x00;
117 1 EA=1;
C51 COMPILER V7.07 SMS 03/17/2004 17:22:20 PAGE 3
118 1 ES=1;
119 1 }
120
121 // 串口接收中断响应函数
122 void receive(void) interrupt 4 using 3
123 {
124 1 ES=0; // 禁止串口中断
125 1
126 1 // 向串口发送字符
127 1 if (TI)
128 1 {
129 2 TI=0;
130 2 ES=1;
131 2 }
132 1
133 1 // 接收来自串口的字符
134 1 if (RI)
135 1 {
136 2 ES=0;
137 2 RI=0;
138 2 if(0 == send) // 当前没有处理新消息
139 2 {
140 3 date4=SBUF; // DATA4变化:串口在接收一般字符
141 3
142 3 // 握手信号
143 3 // 连续收到字符:+CMTI: 就认为有新到消息
144 3 switch(num2)
145 3 {
146 4 case 1:
147 4 num2 = date4=='+' ? ++num2 : 1;
148 4 break;
149 4 case 2:
150 4 num2 = date4=='C' ? ++num2 : 1;
151 4 break;
152 4 case 3:
153 4 num2 = date4=='M' ? ++num2 : 1;
154 4 break;
155 4 case 4:
156 4 num2 = date4=='T' ? ++num2 : 1;
157 4 break;
158 4 case 5:
159 4 num2 = date4=='I' ? ++num2 : 1;
160 4 break;
161 4 case 6:
162 4 num2 = date4==':' ? ++num2 : 1;
163 4 if (1 != num2) // :
164 4 {
165 5 send = 1; // 新到消息标志置1
166 5 num2++;
167 5
168 5 // 清空INBUF,准备将新消息标志+CMTI: "SM",1的后半部分 "SM",1放入
169 5 buffzero2(inbuf, 0, INBUFF_SIZE);
170 5 idx = 0;
171 5 }
172 4 break;
173 4 default:
174 4 num2=1;
175 4 break;
176 4 }
177 3 }else
178 2 {
179 3 // DATA1变化:串口在接收一条新消息到来的标志 +CMTI: "SM",1
C51 COMPILER V7.07 SMS 03/17/2004 17:22:20 PAGE 4
180 3 date1 = SBUF;
181 3
182 3 // 根据消息的操作类型将AT指令的返回放入不同的缓冲区中
183 3 switch(type)
184 3 {
185 4 case 7: // 从地址本中读取密码
186 4 if(idx2 < 0) // 忽略掉前-idx2个字符,idx2是负数
187 4 idx2 ++;
188 4 if(idx2 >= 0 && idx2 < BUFF_SIZE)
189 4 buff[idx2++] = date1;
190 4 break;
191 4 case 5: // 读取一条消息
192 4 case 6: // 和删除一条消息,都将返回放入到inbuf中
193 4 if(idx < 0) // 忽略掉前-idx个字符,idx是负数
194 4 idx ++;
195 4
196 4 // inbuf缓冲区没有溢出
197 4 if(idx >= 0 && idx < INBUFF_SIZE)
198 4 {
199 5 // 因为inbuf中只保存新消息的发送方手机号码和消息内容
200 5 // 用offset来表示要忽略掉的其他不需要的字符
201 5 if(0 == offset && 0 == idx)
202 5 offset = 5; // 忽略掉读取消息AT指令返回的消息头
203 5 else
204 5 if(0 == offset && inbuf[0] == '+' && 14 == idx) // has "+86"
205 5 {
206 6 hasplus86 = 1;
207 6 offset = 28; // 忽略掉返回的消息体中的时间部分
208 6 }
209 5 else
210 5 if(0 == offset && inbuf[0] != '+' && 11 == idx) // not "+86"
211 5 {
212 6 hasplus86 = 0;
213 6 offset = 28; // 忽略掉返回的消息体中的时间部分
214 6 }
215 5
216 5 if(offset > 0)
217 5 offset --;
218 5
219 5 if(0 == offset)
220 5 {
221 6 inbuf[idx++] = date1;
222 6 }
223 5 }
224 4 break;
225 4 default:
226 4 if(idx < 0)
227 4 idx ++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -