📄 demo.lst
字号:
C51 COMPILER V7.07 DEMO 05/31/2008 20:36:05 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE DEMO
OBJECT MODULE PLACED IN DEMO.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DEMO.C LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <includes.h>
2
3 #define SERIAL_BAUDRATE0 0
4 #define SERIAL_BAUDRATE1 1
5 #define SERIAL_BAUDRATE2 2
6 #define SERIAL_BAUDRATE3 3
7 #define SERIAL_MODE0 0//8-bit var. baudrate
8 #define SERIAL_MODE1 1//9-bit var. baudrate
9
10 #define COMM_Q_SIZE 100//Maximum to 65535
11
12 OS_EVENT *CommQRx,*CommQTx;
13 void *CommMsgRx[COMM_Q_SIZE],*CommMsgTx[COMM_Q_SIZE];
14 INT8U SerialStatWord;//Readonly
15 // __ __ __ __ __ __ __ __
16 // |__|__|__|__|__|__|__|__|
17 // D7 D6 D5 D4 D3 D2 D1 D0
18 //
19 // D7: Serial Mode
20 // 0--SERIAL_MODE0
21 // 1--SERIAL_MODE1
22 // D6-D4: Serial Baudrate
23 // 000--SERIAL_BAUDRATE0
24 // 001--SERIAL_BAUDRATE1
25 // 010--SERIAL_BAUDRATE2
26 // 011--SERIAL_BAUDRATE3
27 // others--SERIAL_BAUDRATE0(default,can also be defined by user)
28 // D3 D2: Tx-Buffer Status
29 // 00--Normal(stored,but not full)
30 // 10--Empty
31 // 11--Full
32 // D1 D0: Rx-Buffer Status
33 // 00--Normal
34 // 10--Empty
35 // 11--Full
36
37 void SerialInit(INT8U smode,INT8U sbaudrate) reentrant;
38 void SerialBufCreate(void) reentrant;
39 void RxBufgetch(INT8U *ch) reentrant;
40 void TxBufputch(INT8U *ch) reentrant;
41 void SerialBufClr(void) reentrant;
42 void Serial(void) reentrant;
43
44 #define TxStart() TI=1
45 #define SerialRelease() ES=0
46
47 /*
48 *************************************************************************************************
49 */
50 void SerialInit(INT8U smode,INT8U sbaudrate) reentrant//串口初始化
51 {
52 1 if(smode==SERIAL_MODE0) {SCON=0x50;SerialStatWord&=0x7F;}
53 1 else {SCON=0xD0;SerialStatWord|=0x80;}
54 1 SerialStatWord&=0x8F;
55 1 TMOD&=0x0F;
C51 COMPILER V7.07 DEMO 05/31/2008 20:36:05 PAGE 2
56 1 TMOD|=0x20;
57 1 switch(sbaudrate)
58 1 {
59 2 case SERIAL_BAUDRATE0:
60 2 TL1=0xFD;//19200bps@11.059MHz,TL1=256-(2^SMOD/32*Fosc/12*1/Baudrate)
61 2 PCON=0x80;
62 2 break;
63 2 case SERIAL_BAUDRATE1:
64 2 TL1=0xFD;//9600bps@11.059MHz
65 2 PCON=0x00;
66 2 SerialStatWord|=0x10;
67 2 break;
68 2 case SERIAL_BAUDRATE2:
69 2 TL1=0xFA;//4800bps@11.059MHz
70 2 PCON=0x00;
71 2 SerialStatWord|=0x20;
72 2 break;
73 2 case SERIAL_BAUDRATE3:
74 2 TL1=0xF4;//2400bps@11.059MHz
75 2 PCON=0x00;
76 2 SerialStatWord|=0x30;
77 2 break;
78 2 default:
79 2 TL1=0xFD;//9600bps@11.059MHz
80 2 PCON=0x00;
81 2 }
82 1 TH1=TL1;
83 1 TR1=1;//Start timer1
84 1 ES=1;//Enable serialport interrupt
85 1 }
86 /*
87 *************************************************************************************************
88 */
89 void SerialBufCreate(void) reentrant//建立串口收发缓冲区
90 {
91 1 CommQRx=OSQCreate(&CommMsgRx[0],COMM_Q_SIZE);
92 1 CommQTx=OSQCreate(&CommMsgTx[0],COMM_Q_SIZE);
93 1 SerialStatWord&=0xF0;
94 1 SerialStatWord|=0x0A;
95 1 }
96 /*
97 *************************************************************************************************
98 */
99 void RxBufgetch(INT8U *ch) reentrant//从串口接收缓冲区读1字节数据
100 {
101 1 ch=(INT8U *)OSQAccept(CommQRx);
102 1 if(ch!=(INT8U *)0) SerialStatWord&=0xFC;
103 1 else {SerialStatWord&=0xFC;SerialStatWord|=0x02;}
104 1 }
105 /*
106 *************************************************************************************************
107 */
108 void TxBufputch(INT8U *ch) reentrant//向串口发送缓冲区写1字节数据
109 {
110 1 INT8U err;
111 1 err=OSQPost(CommQTx,(void *)ch);
112 1 if(err==OS_NO_ERR) SerialStatWord&=0xF3;
113 1 else {SerialStatWord&=0xF3;SerialStatWord|=0x0C;}
114 1 }
115 /*
116 *************************************************************************************************
117 */
C51 COMPILER V7.07 DEMO 05/31/2008 20:36:05 PAGE 3
118 void SerialBufClr(void) reentrant//清空串口收发缓冲区
119 {
120 1 OSQFlush(CommQRx);
121 1 OSQFlush(CommQTx);
122 1 SerialStatWord&=0xF0;
123 1 SerialStatWord|=0x0A;
124 1 }
125 /*
126 *************************************************************************************************
127 */
128 void Serial(void) reentrant//串口中断服务子程序
129 {
130 1 INT8U *ch,err;
131 1 if(TI)
132 1 {
133 2 TI=0;
134 2 ch=(INT8U *)OSQAccept(CommQTx);
135 2 if(ch!=(INT8U *)0)
136 2 {
137 3 ACC=*ch;
138 3 TB8=P;
139 3 SBUF=ACC;
140 3 SerialStatWord&=0xF3;
141 3 }
142 2 else {SerialStatWord&=0xF3;SerialStatWord|=0x08;}
143 2 }
144 1 if(RI)
145 1 {
146 2 RI=0;
147 2 if(SM0)
148 2 {
149 3 ACC=SBUF;
150 3 if(P==RB8)
151 3 {
152 4 err=OSQPost(CommQRx,(void *)0x99);//sfr SBUF=0x99,see "reg51.h"
153 4 if(err==OS_NO_ERR) {SerialStatWord&=0xFC;}
154 4 else {SerialStatWord&=0xFC;SerialStatWord|=0x03;}
155 4 }
156 3 }
157 2 else
158 2 {
159 3 err=OSQPost(CommQRx,(void *)0x99);//sfr SBUF=0x99,see "reg51.h"
160 3 if(err==OS_NO_ERR) {SerialStatWord&=0xFC;}
161 3 else {SerialStatWord&=0xFC;SerialStatWord|=0x03;}
162 3 }
163 2 }
164 1 }
165 /*
166 *************************************************************************************************
167 */
168 /*
169 *************************************************************************************************
170 */
171 void PrintChar(INT8U ch) reentrant//显示字符(ASCII码)
172 {
173 1 INT8U temp;
174 1 do {temp=SerialStatWord&0x0C;}//Delay till Tx-Buffer empty(very important)
175 1 while(temp!=0x08);
176 1 TxBufputch(&ch);
177 1 TxStart();
178 1 }
179 /*
C51 COMPILER V7.07 DEMO 05/31/2008 20:36:05 PAGE 4
180 *************************************************************************************************
181 */
182 void PrintDec(INT16U dec) reentrant//十进制格式显示数据(16-bit)
183 {
184 1 INT8U a,b,c,d,e;
185 1 a=dec%10;
186 1 b=dec%100/10;
187 1 c=dec%1000/100;
188 1 d=dec%10000/1000;
189 1 e=dec/10000;
190 1 if(e!=0) PrintChar(e+'0');
191 1 if(d!=0) PrintChar(d+'0');
192 1 if(c!=0) PrintChar(c+'0');
193 1 if(b!=0) PrintChar(b+'0');
194 1 PrintChar(a+'0');
195 1 }
196 /*
197 *************************************************************************************************
198 */
199 void PrintHex(INT8U hex) reentrant//十六进制格式显示数据(8-bit)
200 {
201 1 INT8U temp;
202 1 temp=hex>>4;
203 1 if(temp>=0&&temp<=9) temp=temp+'0';
204 1 else temp=temp+'A'-10;
205 1 PrintChar(temp);
206 1 temp=hex&0x0F;
207 1 if(temp>=0&&temp<=9) temp=temp+'0';
208 1 else temp=temp+'A'-10;
209 1 PrintChar(temp);
210 1 }
211 /*
212 *************************************************************************************************
213 */
214 void PrintStr(INT8U *str) reentrant//显示字符串
215 {
216 1 INT8U temp;
217 1 do {temp=SerialStatWord&0x0C;}//Delay till Tx-Buffer empty(very important)
218 1 while(temp!=0x08);
219 1 while(*str!='\0')
220 1 {
221 2 TxBufputch(str);
222 2 str++;
223 2 }
224 1 TxStart();
225 1 }
226 /*
227 *************************************************************************************************
228 */
229 void ClrScr() reentrant//清屏
230 {
231 1 PrintStr("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
232 1 }
233 /*
234 *************************************************************************************************
235 */
236 #define TASK_STK_SIZE MaxStkSize//Maximum to 65535
237
238 OS_STK MyTaskStk[TASK_STK_SIZE];
239
240 void MyTask(void *ppdata) reentrant
241 {
C51 COMPILER V7.07 DEMO 05/31/2008 20:36:05 PAGE 5
242 1 ppdata=ppdata;
243 1 while(1)
244 1 {
245 2 ClrScr();
246 2 PrintStr("\t\t***********************************************************\n");
247 2 PrintStr("\t\t* (c) 2003 DRAGON JUBILATION ELECTRONICS Co., Ltd. *\n");
248 2 PrintStr("\t\t* All Rights Reserved *\n");
249 2 PrintStr("\t\t* THE DEMO OF 8051MCU SERIAL COMMUNICATIONS *\n");
250 2 PrintStr("\t\t* Ver 1.0(beta) *\n");
251 2 PrintStr("\t\t* *\n");
252 2 PrintStr("\t\t* ### ### ########### ######## *\n");
253 2 PrintStr("\t\t* ## ######### ### ## ### ## *\n");
254 2 PrintStr("\t\t* ########## ### ### ## ### ## *\n");
255 2 PrintStr("\t\t* ## # ####### ### ##### ### ## *\n");
256 2 PrintStr("\t\t* # # ## ### ## ## ######### *\n");
257 2 PrintStr("\t\t* ############ ######### ### ## ## ### *\n");
258 2 PrintStr("\t\t* ######## ### ### ##### ### *\n");
259 2 PrintStr("\t\t* ## ## ######## ### ## ### *\n");
260 2 PrintStr("\t\t* ######### ### ### ## ### ## *\n");
261 2 PrintStr("\t\t* ## ## ######## ########## ######## *\n");
262 2 PrintStr("\t\t* ######### ### *\n");
263 2 PrintStr("\t\t* ## ## ######## ## ## ## ## *\n");
264 2 PrintStr("\t\t* ## ## ### ## ### ### ### ### *\n");
265 2 PrintStr("\t\t* ## ## ######## ### ### ### #### *\n");
266 2 PrintStr("\t\t* *\n");
267 2 PrintStr("\t\t***********************************************************\n");
268 2 PrintStr("\t\tSerialStatWord=");PrintHex(SerialStatWord);PrintChar('\n');
269 2 OSTimeDly(0);
270 2 }
271 1 }
272 /*
273 *************************************************************************************************
274 */
275 main()
276 {
277 1 OSInit();
278 1 SerialBufCreate();
279 1 SerialInit(SERIAL_MODE0,SERIAL_BAUDRATE3);
280 1 OSTaskCreate(MyTask, (void *)0, &MyTaskStk[0],0);
281 1 OSStart();
282 1 }
283
284
285
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1556 ----
CONSTANT SIZE = 1304 ----
XDATA SIZE = 707 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
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 + -