📄 send.lst
字号:
C51 COMPILER V8.01 SEND 05/08/2008 00:06:03 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE SEND
OBJECT MODULE PLACED IN Send.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Send.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2
3 汉明码演示系统发送方程序:晶体频率为11.0592M
4
5
6 */
7
8
9 #include <STC89C51RC_RD_PLUS.H>
10 #include "intrins.h"
11
12
13 #define DATAPORT P1 //8位原始数据端口
14 #define HAMMINGPORTL P0 //汉明数据低8位
15 #define HAMMINGPORTH P2 //汉明数据高4位
16
17 sbit DATAKEY = P3^2; //数据产生按键
18 sbit WRONGKEY = P3^3; //差错码产生按键
19
20
21 bit TimeFlag = 0 ; //时基标志 10ms置位一次
22
23 unsigned char DataCount = 0; //原始数据值,随机更新,取值范围0--255
24 unsigned char WrongCount = 0; //差错码产生位置,0--11
25
26
27
28 unsigned char DataValue = 0xaa; //最终数据值
29 unsigned int HammingValue = 0; //汉明码
30 unsigned int WrongValue = 0; //最终差错位置
31
32 unsigned char DisplayCount = 0; //显示刷新计数
33 unsigned char SendCount = 0; //发送处理
34
35
36 unsigned char HammingBuf[12]; //海明码计算缓冲区
37
38
39 unsigned int TempInt = 0;
40
41 #define OLEN 6
42 #define ILEN 6
43 #define START_SEND() {TI=1;}
44 //通信用到的全局变量
45
46 idata unsigned char OutputBuf[OLEN];
47 unsigned char OutputPoint=0; //输出缓冲区指针
48 bit OutputFlag=1; //输出完成置1
49 bit OutputStart=0; //为1正在输出中
50 unsigned char SendNum; //要发送的数据个数
51
52
53
54
55 void DelayMisc(unsigned int temp)
C51 COMPILER V8.01 SEND 05/08/2008 00:06:03 PAGE 2
56 {
57 1 while (temp--);
58 1 }
59
60
61 void RSTDOG(void)
62 {
63 1 WDT_CONTR = 0x34; //喂狗
64 1 }
65
66 /******************************
67 系统初始化部分
68 *********************************/
69 void Init(void)
70 {
71 1 /****设置定时器***************/
72 1 TMOD=0X21; //定时器1用于波特率发生器
73 1 TH1=0XFB; //波特率为9600/11.0592M : 0XFD 9600/18.432M : 0XFB
74 1 TL1=0XFB;
75 1
76 1 TL0 = (65536-10000) % 256; //10ms中断一次
77 1 TH0 = (65536-10000) / 256;
78 1
79 1
80 1 TR0 =1;
81 1 TR1=1;
82 1
83 1
84 1
85 1 /*****设置串行通信************************/
86 1 SCON=0X50; //8位工作方式,
87 1 /*******开启中断****************************/
88 1 ES=1;
89 1 ET0 = 1;
90 1 EA = 1;
91 1
92 1 }
93
94 void T0_Server(void) interrupt 1
95 {
96 1 TL0 = (65536-10000) % 256; //10ms中断一次
97 1 TH0 = (65536-10000) / 256;
98 1
99 1 TimeFlag = 1;
100 1 }
101
102
103 /************************************/
104 //通信服务子程序
105 //
106 /**************************************/
107 //
108 //
109 void UART_Service(void) interrupt 4
110 {
111 1
112 1 if (RI==1) /*必须及时的将输入缓冲区中的数据取出,否则会丢失数据*/
113 1 { /*可以根据波特率、任务切换时间合适设置缓冲区的大小避免以上问题*/
114 2 /*缓冲区大小>=任务切换时间/接收一个字节需要的时间*/
115 2 RI=0;
116 2 }
117 1 else
C51 COMPILER V8.01 SEND 05/08/2008 00:06:03 PAGE 3
118 1 {
119 2 TI=0;
120 2 if(OutputPoint==SendNum)
121 2 {
122 3 return;
123 3 }
124 2
125 2 if(OutputStart==0)
126 2 {
127 3 OutputStart=1;
128 3 OutputPoint=0;
129 3 }
130 2
131 2 SBUF=OutputBuf[OutputPoint++];
132 2 if(OutputPoint==SendNum) //指定的字节个数已发送完
133 2 {
134 3 OutputStart=0;
135 3 OutputFlag=1;
136 3 OutputPoint=0;
137 3 SendNum=0;
138 3
139 3 return;
140 3 }
141 2 }
142 1 }
143
144
145 //计算汉明码
146 void CalHamming(void)
147 {
148 1
149 1 //计算汉明码
150 1 //先填充数据位
151 1 HammingBuf[11] = (DataValue & 0x80) >> 7;
152 1 HammingBuf[10] = (DataValue & 0x40) >> 6;
153 1 HammingBuf[9] = (DataValue & 0x20) >> 5;
154 1 HammingBuf[8] = (DataValue & 0x10) >> 4;
155 1
156 1 HammingBuf[6] = (DataValue & 0x08) >> 3;
157 1 HammingBuf[5] = (DataValue & 0x04) >> 2;
158 1 HammingBuf[4] = (DataValue & 0x02) >> 1;
159 1
160 1 HammingBuf[2] = (DataValue & 0x01);
161 1
162 1 //计算4位编码位
163 1 HammingBuf[0] = HammingBuf[2] ^ HammingBuf[4] ^ HammingBuf[6] ^ HammingBuf[8] ^ HammingBuf[10];
164 1 HammingBuf[1] = HammingBuf[2] ^ HammingBuf[5] ^ HammingBuf[6] ^ HammingBuf[9] ^ HammingBuf[10];
165 1 HammingBuf[3] = HammingBuf[4] ^ HammingBuf[5] ^ HammingBuf[6] ^ HammingBuf[11];
166 1 HammingBuf[7] = HammingBuf[8] ^ HammingBuf[9] ^ HammingBuf[10] ^ HammingBuf[11];
167 1
168 1 //产生最终汉明码
169 1 HammingValue = HammingBuf[0];
170 1 HammingValue += (HammingBuf[1] << 1);
171 1 HammingValue += (HammingBuf[2] << 2);
172 1 HammingValue += (HammingBuf[3] << 3);
173 1 HammingValue += (HammingBuf[4] << 4);
174 1 HammingValue += (HammingBuf[5] << 5);
175 1 HammingValue += (HammingBuf[6] << 6);
176 1 HammingValue += (HammingBuf[7] << 7);
177 1
178 1
179 1 TempInt = HammingBuf[8];
C51 COMPILER V8.01 SEND 05/08/2008 00:06:03 PAGE 4
180 1 TempInt <<= 8;
181 1 HammingValue += TempInt;
182 1
183 1 TempInt = HammingBuf[9];
184 1 TempInt <<= 9;
185 1 HammingValue += TempInt;
186 1
187 1 TempInt = HammingBuf[10];
188 1 TempInt <<= 10;
189 1 HammingValue += TempInt;
190 1
191 1 TempInt = HammingBuf[11];
192 1 TempInt <<= 11;
193 1 HammingValue += TempInt;
194 1
195 1 //计算完直接显示之
196 1 DATAPORT = DataValue;
197 1 HAMMINGPORTH = (HammingValue / 256) | 0xf0;
198 1 HAMMINGPORTL = HammingValue % 256;
199 1 }
200
201 void main(void)
202 {
203 1 DATAPORT = 0;
204 1 HAMMINGPORTL = 0;
205 1 HAMMINGPORTH = 0;
206 1 DelayMisc(50000);
207 1 DATAPORT = 0xff;
208 1 HAMMINGPORTL = 0xff;
209 1 HAMMINGPORTH = 0xff;
210 1
211 1 Init(); //系统初始化
212 1
213 1
214 1 CalHamming(); //先计算一次汉明码
215 1 while(1)
216 1 {
217 2 RSTDOG(); //喂狗
218 2 /****随机数据和随机差错码产生*******/
219 2 DataCount++;
220 2 WrongCount++;
221 2 if (WrongCount > 11)
222 2 {
223 3 WrongCount = 0;
224 3 }
225 2 /**********按键检查*****************/
226 2 if (TimeFlag == 1)
227 2 {
228 3 //数据产生键
229 3 if (DATAKEY == 0)
230 3 {
231 4 DataValue = DataCount;
232 4 WrongValue = 0; //清除差错码
233 4 DisplayCount = 100; //需要显示刷新
234 4
235 4 CalHamming(); //计算汉明码
236 4 }
237 3 //差错产生键
238 3 if (WRONGKEY == 0)
239 3 {
240 4 WrongValue = 1;
241 4 WrongValue <<= WrongCount;
C51 COMPILER V8.01 SEND 05/08/2008 00:06:03 PAGE 5
242 4 DisplayCount = 100; //需要显示刷新
243 4
244 4 CalHamming(); //计算汉明码
245 4 }
246 3 }
247 2 /************定时产生发送编码数据*****/
248 2 //1000ms发送一次
249 2 if (TimeFlag == 1)
250 2 {
251 3 SendCount++;
252 3
253 3 if (SendCount > 50)
254 3 {
255 4 SendCount = 0;
256 4
257 4 OutputBuf[0] = 0xff;
258 4 OutputBuf[1] = 0xaa;
259 4 OutputBuf[2] = (HammingValue ^ WrongValue) % 256; //先发低字节
260 4 OutputBuf[3] = (HammingValue ^ WrongValue) / 256; //先发低字节
261 4
262 4 //tputBuf[2] = (HammingValue ) % 256; //先发低字节
263 4 //tputBuf[3] = (HammingValue ) / 256; //先发低字节
264 4 SendNum = 4;
265 4 START_SEND();
266 4
267 4 }
268 3 }
269 2
270 2
271 2 /************差错位置闪动显示处理**************/
272 2 //200ms翻转一下显示
273 2 if (TimeFlag == 1)
274 2 {
275 3 DisplayCount++;
276 3 if (DisplayCount > 20)
277 3 {
278 4 DisplayCount = 0;
279 4
280 4 TempInt = (HAMMINGPORTH & 0x0F);
281 4 TempInt <<= 8;
282 4 TempInt += HAMMINGPORTL;
283 4
284 4 TempInt ^= WrongValue;
285 4
286 4 HAMMINGPORTH = (TempInt / 256) | 0xf0;
287 4 HAMMINGPORTL = TempInt % 256;
288 4
289 4 }
290 3 }
291 2
292 2 /*************************************/
293 2 if (TimeFlag == 1)
294 2 {
295 3 TimeFlag = 0 ;
296 3 }
297 2
298 2
299 2 }
300 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
C51 COMPILER V8.01 SEND 05/08/2008 00:06:03 PAGE 6
CODE SIZE = 702 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 25 ----
IDATA SIZE = 6 ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -