?? comu485.lst
字號:
C51 COMPILER V7.50 COMU485 06/30/2008 23:35:48 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE COMU485
OBJECT MODULE PLACED IN .\comu485.obj
COMPILER INVOKED BY: D:\Edu\Software\Keil\C51\BIN\C51.EXE ..\common\comu485.c BROWSE NOAREGS INCDIR(..\common) DEBUG OBJ
-ECTEXTEND PRINT(.\comu485.lst) OBJECT(.\comu485.obj)
line level source
1
2 #include "reg52.H"
3 #include "Typedef.H"
4 #include "UserDef.H"
5 #include "Comu485.H"
6
7 #define BAUD 1200
8 #define T_Baud8_0 (256 - F_OSC/BAUD/12/32) //SMOD=0
9 #define T_Baud8_1 (256 - F_OSC/BAUD/12/16) //SMOD=1
10
11 /*
12 通訊協議:
13 BoF + 地址 + 數據(變長)+ EoF ; 支持ESC換碼
14
15 因為本范例中數據及地址由主機的鍵盤輸入,因此,只能產生‘0’~‘9’有限數字。
16
17 */
18
19 /* */
20 #define CC_BOF '1'
21 #define CC_EOF '2'
22 #define CC_ESC '3'
23
24 /* 全局變量 */
25 INT8U comu_recv_len = 0;
26 INT8U idata Rxbuf[32];
27 static INT8U iRx=0;
28 static INT8U idata Txbuf[32];
29 static INT8U iTx=0;
30 static INT8U myaddr;
31
32 sbit P_Tx = P3^2; /* RS485芯片的發送/接收工作狀態控制 */
33
34 /***************************************
35
36 串口初始化
37 入口參數:
38 返回值:
39
40 ****************************************/
41 void comu_init(INT8U addr)
42 {
43 1 /* 串口通訊相關定時器設置 */
44 1 TMOD &= 0x0F; //定時器1 :自動再裝入8位定時器
45 1 TMOD |= 0x20;
46 1 TH1 = T_Baud8_0;TL1=T_Baud8_0; //波特率
47 1
48 1 /* 串口配置 */
49 1 SCON = 0x50; //方式1,SM2=0,8Bits,REN=1
50 1 PCON = 0x00; //SMOD=0
51 1 // PCON = 0x80; //SMOD=1
52 1
53 1 myaddr = addr;
54 1 P_Tx = 0;
C51 COMPILER V7.50 COMU485 06/30/2008 23:35:48 PAGE 2
55 1
56 1 ES = TRUE; //串口中斷允許
57 1 TR1 = TRUE; //啟動波特率定時器
58 1 }
59
60
61 /* 對發送內容進行格式化,加上BoF,EoF,以及在需要時換碼,并發送頭一個字符,以啟動發送序列 */
62 void comu485_send_packet(INT8U * send_data,INT8U len)
63 {
64 1 INT8U c,i;
65 1
66 1 Txbuf[0] = CC_BOF;
67 1 i = 1;
68 1 while (len!=0)
69 1 {
70 2 c = *send_data;
71 2 if ((c==CC_BOF) || (c==CC_EOF) || (c==CC_ESC))
72 2 {
73 3 Txbuf[i] = CC_ESC;
74 3 i ++;
75 3 Txbuf[i] = ~c;
76 3 i ++;
77 3 }
78 2 else
79 2 {
80 3 Txbuf[i] = c;
81 3 i ++;
82 3 }
83 2
84 2 send_data ++;
85 2 len --;
86 2 }
87 1 Txbuf[i] = CC_EOF;
88 1
89 1 P_Tx = 1;
90 1 iTx = 0;
91 1 SBUF = CC_BOF;
92 1 }
93
94 /* 對接收到的內容進行處理,去除可能存在的換碼,返回接收到的字節數 */
95 INT8U comu485_recv_packet(INT8U len)
96 {
97 1 INT8U i,n;
98 1
99 1 i = 0;
100 1 n = 0;
101 1
102 1 while (i<len)
103 1 {
104 2 if (Rxbuf[i] == CC_ESC)
105 2 {
106 3 i ++;
107 3 Rxbuf[n] = ~Rxbuf[i];
108 3 }
109 2 else
110 2 {
111 3 Rxbuf[n] = Rxbuf[i];
112 3 }
113 2 n ++;
114 2 i ++;
115 2 }
116 1
C51 COMPILER V7.50 COMU485 06/30/2008 23:35:48 PAGE 3
117 1 return n;
118 1 }
119
120 //-------------------------------------
121 // 串口中斷
122 //-------------------------------------
123 void int_comu(void) interrupt 4 using 2
124 {
125 1 INT8U c;
126 1
127 1 /* 發送中斷 */
128 1 if (TI)
129 1 {
130 2 TI = FALSE;
131 2 if (Txbuf[iTx] == CC_EOF)
132 2 {
133 3 P_Tx = 0;
134 3 }
135 2 else
136 2 {
137 3 iTx ++;
138 3 SBUF = Txbuf[iTx];
139 3 }
140 2 }
141 1
142 1 /* 接收中斷 */
143 1 if (RI)
144 1 {
145 2 RI = FALSE;
146 2 c = SBUF;
147 2 if (c == CC_BOF)
148 2 {
149 3 iRx = 0;
150 3 }
151 2 else if (c == CC_EOF)
152 2 {
153 3 comu_recv_len = comu485_recv_packet(iRx);
154 3 if (Rxbuf[0] != myaddr)
155 3 {
156 4 comu_recv_len = 0;
157 4 }
158 3 }
159 2 else
160 2 {
161 3 Rxbuf[iRx] = c;
162 3 iRx ++;
163 3 }
164 2 }
165 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 229 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 ----
IDATA SIZE = 64 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -