📄 serial.lst
字号:
C51 COMPILER V8.08 SERIAL 03/01/2008 16:39:16 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE serial.c LARGE BROWSE INCDIR(F:\software\KEIL\) DEBUG OBJECTE
-XTEND
line level source
1 /*
2 *********************************************************************************************************
3 * uC/OS-II
4 * 实时内核
5 *
6 * (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
7 * 版权所有
8 *
9 * MCU-51 专用代码
10 * KEIL C51大模式编译
11 *
12 * 文件名 : SERIAL.C
13 * 作者 : Jean J. Labrosse
14 * 改编 : 杨屹 gdtyy@ri.gdt.com.cn 巨龙公司系统集成开发部 2002.09.27
15 *********************************************************************************************************
16 */
17
18 //**********************************************************************************
19 //杨屹 2002/08/20 第一版
20 //基于中断的串口驱动及显示程序
21 //联系方法:gdtyy@ri.gdt.com.cn(2003/07/31以前有效)
22 //**********************************************************************************
23 //程序特点:
24 // 1.基于中断,可并发执行
25 // 2.参数可配置(收发缓冲区大小,最大字符串长度,TAB键移动距离)
26 //**********************************************************************************
27 //使用方法:(此范例自包含,独立于其他程序。)
28 // 先配制收发缓冲区大小等可变参数(在serial.h中的宏定义)
29 // 1.开头加入#include <reg51.h>语句,一定要有。
30 // 2.初始化串口 InitSerial();//本例中为20MHz晶体,300波特率,模式2初始化
31 // 3.初始化串口缓冲区 InitSerialBuffer();
32 // 4.使用显示字节,字,长字,字符,字符串,清屏函数。
33 //自包含
34 //**********************************************************************************
35 //波特率计算公式:
36 // TH1=256-(2^SMOD/32*Fosc/12*1/Bound)
37 // 其中:SMOD=0,1;Fosc=晶体或晶振频率;Bound=波特率
38 // 本例中,SMOD=0;Fosc=20*10E6;Bound=300,所以TH1=0x52。
39 //Baud rate(20Mhz)
40 //300(52);1200(D5);2400(EA);4800(F5);9600(FB);19200(FD);38400(FF);
41 //**********************************************************************************
42 //书写风格:
43 // 1.带yy前缀标志的函数为杨屹改写的等效C库函数。
44 // 2.单个单词用小写,yy定义为前缀,不算一个单词。
45 // 3.多个单词(2个及以上),每个单词首字母大写。(有时变量名第一个单词首字母小写)
46 // 4.采用内缩风格,每次缩进8个空格。
47 //**********************************************************************************
48 //应用举例:(可在KEIL仿真环境下运行)
49 //源程序文件:serial.h/serial.c/main.c
50 //main.c内容:
51 //#include <reg51.h>//Note:It must be added.必须在serial.c之前
52 //#include <serial.h>
53 //main()
54 //{
C51 COMPILER V8.08 SERIAL 03/01/2008 16:39:16 PAGE 2
55 // unsigned char ch;
56 //
57 // InitSerial();
58 // InitSerialBuffer();
59 // while(1){
60 // PrintStr("\n");
61 // PrintByte(90);PrintStr(" ");
62 // PrintWord(90);PrintStr(" ");
63 // PrintLong(90);PrintStr(" ");
64 // PrintChar('y');PrintChar(' ');//千万别写成双引号,否则打印0(乱字符)。
65 // PrintStr("\nHello!\nI'm YangYi.\n");
66 // PrintStr("Press any key to continue...");
67 // while(!yygetch(&ch));
68 // }
69 //}
70 //**********************************************************************************
71 //建议:
72 // 你完全可以把该子程序当作函数库使用,以便减少重复劳动,提高代码质量。
73 //**********************************************************************************
74
75 #ifndef OS_MASTER_FILE
76 #include "includes.h"
77 #endif
78
79 //#include <includes.h>
80 //#include <serial.h>
81 //#include <reg51.h>
82
83 unsigned char TxBuf[LenTxBuf],RxBuf[LenRxBuf];//收发缓冲区实体
84 unsigned char *inTxBuf,*outTxBuf,*inRxBuf,*outRxBuf;//收发缓冲区读写指针
85 bit TIflag=1;//Note:It must be 1.
86
87 void InitSerial() reentrant//串口初始化
88 {
89 1 SCON0=0x50;
90 1 TMOD=TMOD&0x0F;
91 1 TMOD=TMOD|0x20;
92 1 TH1=0xF4;//115200 , 22.1184MHz
93 1 TR1=1;
94 1 CKCON |= 0x10; // Timer1 uses SYSCLK as time base
95 1 PCON |= 0x80;
96 1 TI0 = 1;
97 1
98 1 }
99
100 void InitSerialBuffer(void) reentrant//串口缓冲区初始化
101 {
102 1 inTxBuf=TxBuf;outTxBuf=TxBuf;
103 1 inRxBuf=RxBuf;outRxBuf=RxBuf;
104 1 ES0=1;
105 1 //EA=1;
106 1 }
107
108 void serial(void) reentrant
109 { //中断在汇编中实现,去掉interrupt 4{//串口中断服务子程序
110 1 unsigned char *t;
111 1
112 1 if(TI0){
113 2 TI0=0;
114 2 if(inTxBuf==outTxBuf) {TIflag=1;return;}//TxBuf Empty
115 2 SBUF0=*outTxBuf; outTxBuf++;
116 2 if(outTxBuf==TxBuf+LenTxBuf) outTxBuf=TxBuf;
C51 COMPILER V8.08 SERIAL 03/01/2008 16:39:16 PAGE 3
117 2 }
118 1 if(RI0){
119 2 RI0=0;
120 2 t=inRxBuf;t++;
121 2 if(t==RxBuf+LenRxBuf) t=RxBuf;
122 2 if(t==outRxBuf) return; //RxBuf Full
123 2 *inRxBuf=SBUF0;
124 2 inRxBuf=t;
125 2 }
126 1 }
127
128 bit yygetch(unsigned char *ch) reentrant//从串口缓冲区读1字节数据
129 {
130 1 //ES=0;
131 1 if(inRxBuf==outRxBuf) {ES0=1;return 0;} //RxBuf Empty
132 1 *ch=*outRxBuf; outRxBuf++;
133 1
134 1 if(outRxBuf==RxBuf+LenRxBuf) outRxBuf=RxBuf;
135 1 //ES=1;
136 1 return 1;
137 1 }
138
139 void PrintChar(unsigned char ch) reentrant//显示字符
140 {
141 1 unsigned char *t;
142 1
143 1 //ES=0;
144 1 if(TIflag){
145 2 TIflag=0;
146 2 TI0=1;
147 2 }
148 1 t=inTxBuf;t++;
149 1 if(t==TxBuf+LenTxBuf) t=TxBuf;
150 1 if(t==outTxBuf) {/*ES=1;*/return;} //TxBuf Full
151 1 *inTxBuf=ch;
152 1 inTxBuf=t;
153 1 //ES=1;
154 1 }
155
156 void PrintCh(unsigned char ch) reentrant//内部使用,不建议用户看到。
157 {
158 1 if(ch>=0&&ch<=9) ch=ch+'0';
159 1 else ch=ch+'A'-10;
160 1 PrintChar(ch);
161 1 }
162
163 void insidePrintByte(unsigned char Byte) reentrant//内部使用,以十六进制格式显示1个字节数据
164 {
165 1 unsigned char c;
166 1 c=Byte;
167 1 c=c>>4;
168 1 PrintCh(c);
169 1 c=Byte;c=c&0x0F;PrintCh(c);
170 1 }
171
172 void PrintByte(unsigned char Byte) reentrant//以十六进制格式显示1个字节数据
173 {
174 1 EA=0;
175 1 insidePrintByte(Byte);
176 1 EA=1;
177 1
178 1 }
C51 COMPILER V8.08 SERIAL 03/01/2008 16:39:16 PAGE 4
179
180 void insidePrintWord(unsigned int Word) reentrant//内部使用,以十六进制格式显示1个字数据
181 {
182 1 insidePrintByte(Word>>8);
183 1 insidePrintByte(Word&0xFF);
184 1 }
185
186 void PrintWord(unsigned int Word) reentrant//以十六进制格式显示1个字数据
187 {
188 1 EA=0;
189 1 insidePrintWord(Word);
190 1 EA=1;
191 1 }
192
193 void PrintLong(unsigned long LongWord) reentrant//以十六进制格式显示1个长字数据
194 {
195 1 EA=0;
196 1 insidePrintWord(LongWord>>16);
197 1 insidePrintWord(LongWord&0xFFFF);
198 1 EA=1;
199 1 }
200
201 void PrintStr(unsigned char *str) reentrant//显示字符串
202 {
203 1 int i;
204 1 unsigned char j;
205 1 unsigned char ch;
206 1
207 1 EA=0;
208 1 for(i=0;i<MaxLenStr;i++){
209 2 ch=*(str+i);
210 2 if(ch=='\0') break;
211 2 else if(ch=='\n'){PrintChar(10);PrintChar(13);}
212 2 else if(ch=='\t'){
213 3 for(j=0;j<TABNum;j++)
214 3 PrintChar(' ');
215 3 }
216 2 else PrintChar(ch);
217 2 }
218 1 EA=1;
219 1
220 1 }
221
222 void clrscr() reentrant//清屏
223 {
224 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");//25个回车换行清屏幕。
225 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1270 ----
CONSTANT SIZE = 26 ----
XDATA SIZE = 2062 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -