📄 receive.lst
字号:
C51 COMPILER V8.01 RECEIVE 05/08/2008 00:03:17 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE RECEIVE
OBJECT MODULE PLACED IN Receive.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Receive.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
14 #define DATAPORT P1 //8位原始数据端口
15 #define HAMMINGPORTL P0 //汉明数据低8位
16 #define HAMMINGPORTH P2 //汉明数据高4位
17
18
19 #define ILEN 4
20
21
22 bit TimeFlag = 0 ; //时基标志 10ms置位一次
23
24 unsigned char DataValue = 0; //最终数据值
25 unsigned int HammingValue = 0x0f77; //汉明码
26 unsigned int HammingValueBak=0; //汉明码
27 unsigned int WrongValue = 0; //最终差错位置
28
29 unsigned char DisplayCount = 0; //显示刷新计数
30
31 unsigned int PortValue = 0;
32
33
34 unsigned int TempInt;
35
36
37 idata unsigned char CmdBuf[2]; //汉明码
38
39 unsigned char HammingBuf[12]; //海明码计算缓冲区
40 unsigned char WrongS[4];
41
42
43 //通信用到的全局变量
44 idata unsigned char InputBuf[ILEN];
45 bit InputFlag=0; //输入完成置1
46 bit FirstBelow=0; //第一次跌破门限
47
48
49 bit CmdFlag = 0; //接收到一组汉明码组置1
50
51
52 void RSTDOG(void)
53 {
54 1 WDT_CONTR = 0x34; //喂狗
55 1 }
C51 COMPILER V8.01 RECEIVE 05/08/2008 00:03:17 PAGE 2
56
57
58
59 void DelayMisc(unsigned int temp)
60 {
61 1 while (temp--);
62 1 }
63
64
65
66 /******************************
67 系统初始化部分
68 *********************************/
69 void Init(void)
70 {
71 1
72 1 /****设置定时器***************/
73 1 TMOD=0X21; //定时器1用于波特率发生器
74 1 TH1=0XFB; //波特率为9600/11.0592M : 0XFD 9600/18.432M : 0XFB
75 1 TL1=0XFB;
76 1
77 1 TL0 = (65536-10000) % 256; //10ms中断一次
78 1 TH0 = (65536-10000) / 256;
79 1
80 1
81 1 TR0 =1;
82 1 TR1=1;
83 1
84 1
85 1
86 1 /*****设置串行通信************************/
87 1 SCON=0X50; //8位工作方式,
88 1 /*******开启中断****************************/
89 1 ES=1;
90 1 ET0 = 1;
91 1 EA = 1;
92 1
93 1 }
94
95 void T0_Server(void) interrupt 1
96 {
97 1 TL0 = (65536-10000) % 256; //10ms中断一次
98 1 TH0 = (65536-10000) / 256;
99 1
100 1 TimeFlag = 1;
101 1 }
102
103
104
105 /************************************/
106 //通信服务子程序
107 //
108 /**************************************/
109 //
110 //
111 void UART_Service(void) interrupt 4
112 {
113 1 unsigned char i;
114 1
115 1 if (RI==1) /*必须及时的将输入缓冲区中的数据取出,否则会丢失数据*/
116 1 { /*可以根据波特率、任务切换时间合适设置缓冲区的大小避免以上问题*/
117 2 /*缓冲区大小>=任务切换时间/接收一个字节需要的时间*/
C51 COMPILER V8.01 RECEIVE 05/08/2008 00:03:17 PAGE 3
118 2 RI=0;
119 2
120 2 for(i=0;i<ILEN-1;i++)
121 2 InputBuf[i]=InputBuf[i+1];
122 2 InputBuf[ILEN-1]=SBUF;
123 2
124 2 /******判断接受头标志******************/
125 2 if(InputBuf[0]!=0xff) return;
126 2 if(InputBuf[1]!=0xaa) return;
127 2
128 2 CmdBuf[0] = InputBuf[2];
129 2 CmdBuf[1] = InputBuf[3];
130 2
131 2 CmdFlag = 1;
132 2 }
133 1 else
134 1 {
135 2 TI=0;
136 2 }
137 1 }
138
139
140 //计算汉明码
141 void CalHamming(void)
142 {
143 1 unsigned char WrongCount = 0;
144 1
145 1
146 1 //对编码内容拆分
147 1
148 1 HammingBuf[0] = (HammingValue & 0x0001) >> 0;
149 1 HammingBuf[1] = (HammingValue & 0x0002) >> 1;
150 1 HammingBuf[2] = (HammingValue & 0x0004) >> 2;
151 1 HammingBuf[3] = (HammingValue & 0x0008) >> 3;
152 1 HammingBuf[4] = (HammingValue & 0x0010) >> 4;
153 1 HammingBuf[5] = (HammingValue & 0x0020) >> 5;
154 1 HammingBuf[6] = (HammingValue & 0x0040) >> 6;
155 1 HammingBuf[7] = (HammingValue & 0x0080) >> 7;
156 1 HammingBuf[8] = (HammingValue & 0x0100) >> 8;
157 1 HammingBuf[9] = (HammingValue & 0x0200) >> 9;
158 1 HammingBuf[10] = (HammingValue & 0x0400) >> 10;
159 1 HammingBuf[11] = (HammingValue & 0x0800) >> 11;
160 1
161 1
162 1 //计算出错位置
163 1 WrongS[0] = HammingBuf[0] ^ HammingBuf[2] ^HammingBuf[4] ^HammingBuf[6] ^HammingBuf[8] ^HammingBuf[10];
164 1 WrongS[1] = HammingBuf[1] ^ HammingBuf[2] ^HammingBuf[5] ^HammingBuf[6] ^HammingBuf[9] ^HammingBuf[10];
165 1 WrongS[2] = HammingBuf[3] ^ HammingBuf[4] ^HammingBuf[5] ^HammingBuf[6] ^HammingBuf[11] ;
166 1 WrongS[3] = HammingBuf[7] ^ HammingBuf[8] ^HammingBuf[9] ^HammingBuf[10] ^HammingBuf[11];
167 1
168 1 WrongCount = (WrongS[3] << 3) + (WrongS[2] << 2) + (WrongS[1] << 1) + (WrongS[0] << 0);
169 1 //
170 1 if (WrongCount == 0)
171 1 {
172 2 WrongValue = 0;
173 2 }
174 1 else
175 1 {
176 2 WrongValue = 1;
177 2 WrongValue <<= (WrongCount-1);
178 2 }
179 1
C51 COMPILER V8.01 RECEIVE 05/08/2008 00:03:17 PAGE 4
180 1 HammingValue ^= WrongValue;
181 1
182 1
183 1 HammingBuf[2] = (HammingValue & 0x0004) >> 2;
184 1 HammingBuf[4] = (HammingValue & 0x0010) >> 4;
185 1 HammingBuf[5] = (HammingValue & 0x0020) >> 5;
186 1 HammingBuf[6] = (HammingValue & 0x0040) >> 6;
187 1
188 1 //产生最终数据值
189 1 DataValue = HammingValue>>4;
190 1 DataValue &= 0xf0;
191 1 DataValue += HammingBuf[2];
192 1 DataValue += (HammingBuf[4] << 1);
193 1 DataValue += (HammingBuf[5] << 2);
194 1 DataValue += (HammingBuf[6] << 3);
195 1
196 1
197 1 //计算完直接显示之
198 1 DATAPORT = DataValue;
199 1
200 1
201 1 HammingValueBak = HammingValue;
202 1 // HAMMINGPORTH = (HammingValue / 256) | 0xf0;
203 1 // HAMMINGPORTL = HammingValue % 256;
204 1
205 1
206 1 }
207
208
209
210 void main(void)
211 {
212 1
213 1 DATAPORT = 0;
214 1 HAMMINGPORTL = 0;
215 1 HAMMINGPORTH = 0;
216 1 DelayMisc(5000);
217 1 DATAPORT = 0xff;
218 1 HAMMINGPORTL = 0xff;
219 1 HAMMINGPORTH = 0xff;
220 1
221 1 CalHamming(); //解码
222 1
223 1 Init();
224 1 while(1)
225 1 {
226 2 RSTDOG(); //喂狗
227 2
228 2 /****************判断是否有接收到的数据*********/
229 2 if (CmdFlag == 1)
230 2 {
231 3 CmdFlag = 0;
232 3
233 3 HammingValue = CmdBuf[1];
234 3 HammingValue <<= 8;
235 3 HammingValue += CmdBuf[0];
236 3
237 3 CalHamming(); //解码
238 3 }
239 2
240 2
241 2 /************差错位置闪动显示处理**************/
C51 COMPILER V8.01 RECEIVE 05/08/2008 00:03:17 PAGE 5
242 2 //200ms翻转一下显示
243 2 if (TimeFlag == 1)
244 2 {
245 3 DisplayCount++;
246 3 if (DisplayCount > 20)
247 3 {
248 4 DisplayCount = 0;
249 4
250 4 TempInt = (HAMMINGPORTH & 0x0F);
251 4 TempInt <<= 8;
252 4 TempInt += HAMMINGPORTL;
253 4
254 4
255 4 TempInt ^= WrongValue;
256 4
257 4 HAMMINGPORTH = (TempInt / 256) | 0xf0;
258 4 HAMMINGPORTL = TempInt % 256;
259 4
260 4 }
261 3 }
262 2
263 2 /*************************************/
264 2 if (TimeFlag == 1)
265 2 {
266 3 TimeFlag = 0 ;
267 3 }
268 2 }
269 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 670 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 28 ----
IDATA SIZE = 6 ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -