📄 demo.lst
字号:
C51 COMPILER V7.50 DEMO 12/14/2007 08:25:27 PAGE 1
C51 COMPILER V7.50, 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
line level source
1 #include <includes.h>
2 #include <stdio.h>
3
4 #define SERIAL_BAUDRATE0 0
5 #define SERIAL_BAUDRATE1 1
6 #define SERIAL_BAUDRATE2 2
7 #define SERIAL_BAUDRATE3 3
8
9 #define SERIAL_BAUD_RATE0 SERIAL_BAUDRATE0
10 #define SERIAL_BAUD_RATE1 SERIAL_BAUDRATE1
11 #define SERIAL_BAUD_RATE2 SERIAL_BAUDRATE2
12 #define SERIAL_BAUD_RATE3 SERIAL_BAUDRATE3
13
14 #define SERIAL_MODE0 0//8-bit var. baudrate
15 #define SERIAL_MODE1 1//9-bit var. baudrate
16
17 #define COMM_Q_SIZE 100//Maximum to 65535
18
19 OS_EVENT *CommQRx,*CommQTx;
20 INT8U Perr;
21
22 void *CommMsgRx[COMM_Q_SIZE],*CommMsgTx[COMM_Q_SIZE];
23 INT8U SerialStatWord;//Readonly
24 // __ __ __ __ __ __ __ __
25 // |__|__|__|__|__|__|__|__|
26 // D7 D6 D5 D4 D3 D2 D1 D0
27 //
28 // D7: Serial Mode
29 // 0--SERIAL_MODE0
30 // 1--SERIAL_MODE1
31 // D6-D4: Serial Baudrate
32 // 000--SERIAL_BAUDRATE0
33 // 001--SERIAL_BAUDRATE1
34 // 010--SERIAL_BAUDRATE2
35 // 011--SERIAL_BAUDRATE3
36 // others--SERIAL_BAUDRATE0(default,can also be defined by user)
37 // D3 D2: Tx-Buffer Status
38 // 00--Normal(stored,but not full)
39 // 10--Empty
40 // 11--Full
41 // D1 D0: Rx-Buffer Status
42 // 00--Normal
43 // 10--Empty
44 // 11--Full
45
46 void SerialInit(INT8U smode,INT8U sbaudrate) reentrant;
47 void SerialBufCreate(void) reentrant;
48 void RxBufgetch(INT8U *ch) reentrant;
49 void TxBufputch(INT8U *ch) reentrant;
50 void SerialBufClr(void) reentrant;
51 void Serial(void) reentrant;
52
53 #define TxStart() TI=1
54 #define SerialRelease() ES=0
55
C51 COMPILER V7.50 DEMO 12/14/2007 08:25:27 PAGE 2
56 /*
57 *************************************************************************************************
58 */
59 void SerialInit(INT8U smode,INT8U sbaudrate) reentrant//串口初始化
60 {
61 1 if(smode==SERIAL_MODE0) {SCON=0x50;SerialStatWord&=0x7F;}
62 1 else {SCON=0xD0;SerialStatWord|=0x80;}
63 1 SerialStatWord&=0x8F;
64 1 TMOD&=0x0F;
65 1 TMOD|=0x20;
66 1 switch(sbaudrate)
67 1 {
68 2 case SERIAL_BAUD_RATE0:
69 2 TL1=0xFD;//19200bps@11.059MHz,TL1=256-(2^SMOD/32*Fosc/12*1/Baudrate)
70 2 PCON=0x80;
71 2 break;
72 2 case SERIAL_BAUD_RATE1:
73 2 TL1=0xFD;//9600bps@11.059MHz
74 2 PCON=0x00;
75 2 SerialStatWord|=0x10;
76 2 break;
77 2 case SERIAL_BAUD_RATE2:
78 2 TL1=0xFA;//4800bps@11.059MHz
79 2 PCON=0x00;
80 2 SerialStatWord|=0x20;
81 2 break;
82 2 case SERIAL_BAUD_RATE3:
83 2 TL1=0xF4;//2400bps@11.059MHz
84 2 PCON=0x00;
85 2 SerialStatWord|=0x30;
86 2 break;
87 2 default:
88 2 TL1=0xFD;//9600bps@11.059MHz
89 2 PCON=0x00;
90 2 }
91 1 TH1=TL1;
92 1 TR1=1;//Start timer1
93 1 ES=1;//Enable serialport interrupt
94 1 }
95 /*
96 *************************************************************************************************
97 */
98 void SerialBufCreate(void) reentrant//建立串口收发缓冲区
99 {
100 1 CommQRx=OSQCreate(&CommMsgRx[0],COMM_Q_SIZE);
101 1 CommQTx=OSQCreate(&CommMsgTx[0],COMM_Q_SIZE);
102 1 SerialStatWord&=0xF0;
103 1 SerialStatWord|=0x0A;
104 1 }
105 /*
106 *************************************************************************************************
107 */
108 void RxBufgetch(INT8U *ch) reentrant//从串口接收缓冲区读1字节数据
109 {
110 1 ch=(INT8U *)OSQAccept(CommQRx, &Perr);
111 1 if(ch!=(INT8U *)0) SerialStatWord&=0xFC;
112 1 else {SerialStatWord&=0xFC;SerialStatWord|=0x02;}
113 1 }
114 /*
115 *************************************************************************************************
116 */
117 void TxBufputch(INT8U *ch) reentrant//向串口发送缓冲区写1字节数据
C51 COMPILER V7.50 DEMO 12/14/2007 08:25:27 PAGE 3
118 {
119 1 INT8U err;
120 1 err=OSQPost(CommQTx,(void *)ch);
121 1 if(err==OS_NO_ERR) SerialStatWord&=0xF3;
122 1 else {SerialStatWord&=0xF3;SerialStatWord|=0x0C;}
123 1 }
124 /*
125 *************************************************************************************************
126 */
127 void SerialBufClr(void) reentrant//清空串口收发缓冲区
128 {
129 1 OSQFlush(CommQRx);
130 1 OSQFlush(CommQTx);
131 1 SerialStatWord&=0xF0;
132 1 SerialStatWord|=0x0A;
133 1 }
134 /*
135 *************************************************************************************************
136 */
137 void Serial(void) reentrant//串口中断服务子程序
138 {
139 1 INT8U *ch,err;
140 1 if(TI)
141 1 {
142 2 TI=0;
143 2 ch=(INT8U *)OSQAccept(CommQTx, &Perr);
144 2 if(ch!=(INT8U *)0)
145 2 {
146 3 ACC=*ch;
147 3 TB8=P;
148 3 SBUF=ACC;
149 3 SerialStatWord&=0xF3;
150 3 }
151 2 else {SerialStatWord&=0xF3;SerialStatWord|=0x08;}
152 2 }
153 1 if(RI)
154 1 {
155 2 RI=0;
156 2 if(SM0)
157 2 {
158 3 ACC=SBUF;
159 3 if(P==RB8)
160 3 {
161 4 err=OSQPost(CommQRx,(void *)0x99);//sfr SBUF=0x99,see "reg51.h"
162 4 if(err==OS_NO_ERR) {SerialStatWord&=0xFC;}
163 4 else {SerialStatWord&=0xFC;SerialStatWord|=0x03;}
164 4 }
165 3 }
166 2 else
167 2 {
168 3 err=OSQPost(CommQRx,(void *)0x99);//sfr SBUF=0x99,see "reg51.h"
169 3 if(err==OS_NO_ERR) {SerialStatWord&=0xFC;}
170 3 else {SerialStatWord&=0xFC;SerialStatWord|=0x03;}
171 3 }
172 2 }
173 1 }
174 /*
175 *************************************************************************************************
176 */
177 /*
178 *************************************************************************************************
179 */
C51 COMPILER V7.50 DEMO 12/14/2007 08:25:27 PAGE 4
180 void PrintChar(INT8U ch) reentrant//显示字符(ASCII码)
181 {
182 1 INT8U temp;
183 1 do {temp=SerialStatWord&0x0C;}//Delay till Tx-Buffer empty(very important)
184 1 while(temp!=0x08);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -