?? uart.lst
字號:
C51 COMPILER V7.50 UART 12/11/2007 10:19:45 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN Uart.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE Uart.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 //#include "ML-330.H"
3
4 //#define SYSCLK 24500000
5
6 #include <string.h>
7 #include "c8051F330.h"
8 //#include "const.h"
9 #include "uart.h"
10
11
12 //串口讀寫驅(qū)動程序
13
14 #define SYSCLK 22118400
15
16 #define MAX_LEN 128
17 #define MAX_SEND_LEN 256
18
19
20 volatile bit readFlag0 = 0; //Uart0中斷接收處理標志
21 volatile bit readFlag1 = 0; //Uart1中斷接收處理標志
22 volatile bit sendFlag0 = 0; //Uart0中斷發(fā)送處理標志
23 volatile bit sendFlag1 = 0; //Uart1中斷發(fā)送處理標志
24
25 volatile unsigned char xdata PRead0 = 0; //uart0接收緩沖讀指針
26 volatile unsigned char xdata PWrite0 = 0; //uart0接收緩沖寫指針
27 volatile unsigned char xdata PRead1 = 0; //uart1接收緩沖讀指針
28 volatile unsigned char xdata PWrite1 = 0; //uart1接收緩沖寫指針
29
30 volatile unsigned char xdata PSendRead0 = 0; //uart0發(fā)送緩沖讀指針
31 volatile unsigned char xdata PSendWrite0 = 0; //uart0發(fā)送緩沖寫指針
32 volatile unsigned char xdata PSendRead1 = 0; //uart1發(fā)送緩沖讀指針
33 volatile unsigned char xdata PSendWrite1 = 0; //uart1發(fā)送緩沖寫指針
34
35 unsigned char xdata BufData0[MAX_LEN]; //uart0接收緩沖
36 unsigned char xdata BufSend0[MAX_SEND_LEN]; //uart0發(fā)送緩沖
37 unsigned char xdata BufData1[MAX_LEN]; //uart1接收緩沖
38 unsigned char xdata BufSend1[MAX_SEND_LEN]; //uart1發(fā)送緩沖
39
40 unsigned char xdata SendCount0 = 0; //uart0發(fā)送字節(jié)數(shù)
41 unsigned char xdata SendCount1 = 0; //uart0發(fā)送字節(jié)數(shù)
42
43
44 void Uart0_Init(unsigned long BAUDRATE)
45 {
46 1 SCON0 = 0x10;//允許接收
47 1
48 1 if (SYSCLK/BAUDRATE/2/256 < 1) {
49 2 TH1 = 255-(SYSCLK/BAUDRATE);
50 2 CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx
51 2 CKCON |= 0x08;
52 2 } else if (SYSCLK/BAUDRATE/2/256 < 4) {
53 2 TH1 = -(SYSCLK/BAUDRATE/2/4);
54 2 CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
55 2 CKCON |= 0x09;
C51 COMPILER V7.50 UART 12/11/2007 10:19:45 PAGE 2
56 2 } else if (SYSCLK/BAUDRATE/2/256 < 12) {
57 2 TH1 = -(SYSCLK/BAUDRATE/2/12);
58 2 CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
59 2 } else {
60 2 TH1 = -(SYSCLK/BAUDRATE/2/48);
61 2 CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
62 2 CKCON |= 0x02;
63 2 }
64 1 /*TH1 = 63;
65 1 CKCON &= ~0x0B;
66 1 CKCON |= 0x08;*/
67 1
68 1 TL1 = TH1;
69 1 TMOD &= ~0xf0;
70 1 TMOD |= 0x20;
71 1 TR1 = 1;
72 1 // TI0 = 1;
73 1 }
74
75
76 //串口接收函數(shù)
77 unsigned char UART_Read(const unsigned char ComPort,
78 unsigned char *Buffer)
79 {
80 1 unsigned char xdata BufferStr[MAX_LEN];
81 1 int xdata readCounts = 0; //已經(jīng)讀取的字符個數(shù),與MAX_LEN比較
82 1 unsigned char xdata temp = 0;
83 1 unsigned char xdata BufLen = 0;
84 1
85 1 if ((PRead0!=PWrite0) & (ComPort == 0))
86 1 {
87 2 temp = PWrite0;
88 2 readCounts = (int)temp - (int)PRead0;
89 2
90 2 if (readCounts > 0)
91 2 {
92 3 memcpy( BufferStr, BufData0 + PRead0 , readCounts);
93 3 PRead0 = temp;
94 3
95 3 memcpy(Buffer,BufferStr,readCounts);
96 3
97 3 BufLen = readCounts;
98 3 }
99 2 else if ( readCounts < 0)
100 2 {
101 3 memcpy( BufferStr, BufData0 + PRead0 , MAX_LEN-PRead0);
102 3
103 3 memcpy( BufferStr+MAX_LEN-PRead0, BufData0 , temp);
104 3
105 3 PRead0 = temp;
106 3
107 3 memcpy(Buffer,BufferStr,MAX_LEN+readCounts);
108 3
109 3 BufLen = MAX_LEN+readCounts;
110 3 }
111 2 readFlag0 = 1;
112 2 }
113 1 else if ((PRead1!=PWrite1) & (ComPort == 1))
114 1 {
115 2 temp = PWrite1;
116 2 readCounts = (int)temp - (int)PRead1;
117 2 memset( BufferStr, 0, MAX_LEN );
C51 COMPILER V7.50 UART 12/11/2007 10:19:45 PAGE 3
118 2 if (readCounts > 0)
119 2 {
120 3 memcpy( BufferStr, BufData1 + PRead1 , readCounts);
121 3 PRead1 = temp;
122 3 memcpy(Buffer,BufferStr,readCounts);
123 3 BufLen = readCounts;
124 3 }
125 2 else if ( readCounts < 0)
126 2 {
127 3 memcpy( BufferStr, BufData1 + PRead1 , MAX_LEN-PRead1);
128 3 memcpy( BufferStr+MAX_LEN-PRead1, BufData1 , temp);
129 3 PRead1 = temp;
130 3 memcpy(Buffer,BufferStr,MAX_LEN+readCounts);
131 3 BufLen = MAX_LEN+readCounts;
132 3 }
133 2 readFlag1 = 1;
134 2 }
135 1 return BufLen;
136 1 }
137
138 void Send_Char(const unsigned char com,unsigned char ch)
139 {
140 1
141 1 switch (com)
142 1 {
143 2 case 0:
144 2 //SFRPAGE = UART0_PAGE;
145 2 SBUF0 = ch;
146 2 break;
147 2 case 1:
148 2 //SFRPAGE = UART1_PAGE;
149 2 //SBUF1 = ch;
150 2 break;
151 2 default:
152 2 break;
153 2 }
154 1
155 1 }
156
157 //串口發(fā)送函數(shù)
158 void UART_Send(const unsigned char ComPort,
159 const unsigned char *Data,
160 const unsigned char DataSize)
161 {
162 1
163 1 unsigned int k = 0;
164 1 int i;
165 1
166 1 if ((DataSize > 0)&(DataSize< MAX_SEND_LEN))
167 1 {
168 2 switch (ComPort)
169 2 {
170 3 case 0:
171 3 //將需要發(fā)送的數(shù)據(jù)放入相應(yīng)的發(fā)送緩沖內(nèi)
172 3 for (i=0;i<DataSize;i++)
173 3 {
174 4 BufSend0[PSendWrite0] = Data[i];
175 4 PSendWrite0++;
176 4 if (PSendWrite0 == MAX_SEND_LEN)
177 4 {
178 5 PSendWrite0 = 0;
179 5 }
C51 COMPILER V7.50 UART 12/11/2007 10:19:45 PAGE 4
180 4 }
181 3
182 3 //判斷中斷服務(wù)程序是否完成發(fā)送(發(fā)送標志位是否為0)
183 3 if (sendFlag0 == 0)
184 3 {
185 4 sendFlag0 = 1; //置發(fā)送標志位為1
186 4 Send_Char(ComPort,*Data);//調(diào)用發(fā)送字符函數(shù),發(fā)送第一個字節(jié),觸發(fā)發(fā)送中斷
187 4 }
188 3 break;
189 3 case 1:
190 3 //將需要發(fā)送的數(shù)據(jù)放入相應(yīng)的發(fā)送緩沖內(nèi)
191 3 for (i=0;i<DataSize;i++)
192 3 {
193 4 BufSend1[PSendWrite1] = Data[i];
194 4 PSendWrite1++;
195 4 if (PSendWrite1 == MAX_SEND_LEN)
196 4 {
197 5 PSendWrite1 = 0;
198 5 }
199 4 }
200 3 //判斷中斷服務(wù)程序是否完成發(fā)送(發(fā)送標志位是否為0)
201 3 if (sendFlag1 == 0)
202 3 {
203 4 sendFlag1 = 1; //置發(fā)送標志位為1
204 4 Send_Char(ComPort,*Data);//調(diào)用發(fā)送字符函數(shù),發(fā)送第一個字節(jié),觸發(fā)發(fā)送中斷
205 4 }
206 3 break;
207 3 default:
208 3 break;
209 3 }
210 2 }
211 1 }
212
213 //UART0中斷服務(wù)程序. 接收字符
214 void UART0_ISR(void) interrupt 4
215 {
216 1 unsigned char rxch;
217 1
218 1
219 1 readFlag0 = 0; //中斷處理標志
220 1 //SFRPAGE = UART0_PAGE;
221 1 if(RI0) //中斷標志 RI0=1 數(shù)據(jù)完整接收
222 1 {
223 2 RI0 = 0; //軟件清零
224 2 rxch = SBUF0; //讀緩沖
225 2
226 2 if(PWrite0==MAX_LEN)
227 2 {
228 3 PWrite0 = 0;
229 3 }
230 2 BufData0[PWrite0] = rxch;
231 2 PWrite0++;
232 2 readFlag0 =1;
233 2 }
234 1
235 1 if (TI0)
236 1 { // handle transmit function
237 2 TI0 = 0; // 清除發(fā)送完成標志
238 2 //將緩沖尾指針加1
239 2 PSendRead0++;
240 2 if (PSendRead0 == MAX_SEND_LEN)
241 2 {
C51 COMPILER V7.50 UART 12/11/2007 10:19:45 PAGE 5
242 3 PSendRead0 = 0;
243 3 }
244 2
245 2 if (PSendWrite0!=PSendRead0) //判斷緩沖內(nèi)的首尾指針是否相同
246 2 {
247 3 SBUF0 = BufSend0[PSendRead0]; //如果不同,發(fā)送尾指針所在的字節(jié)
248 3 }
249 2 else
250 2 {
251 3 sendFlag0 = 0; //如果相同,置發(fā)送標志為0
252 3 }
253 2 }
254 1
255 1 }
256
257
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1277 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 778 132
PDATA SIZE = ---- ----
DATA SIZE = ---- 17
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -