📄 serial.lst
字号:
C51 COMPILER V6.14 SERIAL 05/04/2005 04:11:15 PAGE 1
C51 COMPILER V6.14, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN .\serial.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE .\serial.c LARGE BROWSE DEBUG OBJECTEXTEND SRC(.\serial.SRC)
stmt 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
44 #ifndef OS_MASTER_FILE
45 #include "includes.h"
46 #endif
47
48 //#include <includes.h>
49 //#include <serial.h>
50 //#include <reg51.h>
51
52 INT8U xdata TxBuf[LenTxBuf],RxBuf[LenRxBuf];//收发缓冲区实体
53 INT8U xdata*inTxBuf,*outTxBuf,*inRxBuf,*outRxBuf;//收发缓冲区读写指针unsigned char
54 BOOLEAN TIflag=1;//Note:It must be 1.
55
C51 COMPILER V6.14 SERIAL 05/04/2005 04:11:15 PAGE 2
56 void InitSerial() reentrant//串口初始化
57 {
58 1 TMOD=TMOD&0x0F;
59 1 TMOD=TMOD|0x20;
60 1 TL1=0xFD;TH1=0xFD;//19200 , 22.1184MHz
61 1 SCON=0x50;PCON=0x00;
62 1 TR1=1;
63 1 }
64
65 void InitSerialBuffer(void) reentrant//串口缓冲区初始化
66 {
67 1 inTxBuf=TxBuf;outTxBuf=TxBuf;
68 1 inRxBuf=RxBuf;outRxBuf=RxBuf;
69 1 ES=1;
70 1 //EA=1;
71 1 }
72
73 void serial(void) reentrant
74 { //中断在汇编中实现,去掉interrupt 4{//串口中断服务子程序
75 1 unsigned char *t;
76 1
77 1 if(TI){
78 2 TI=0;
79 2 if(inTxBuf==outTxBuf) {TIflag=1;return;}//TxBuf Empty
80 2 SBUF=*outTxBuf; outTxBuf++;
81 2 if(outTxBuf==TxBuf+LenTxBuf) outTxBuf=TxBuf;
82 2 }
83 1 if(RI){
84 2 RI=0;
85 2 t=inRxBuf;t++;
86 2 if(t==RxBuf+LenRxBuf) t=RxBuf;
87 2 if(t==outRxBuf) return; //RxBuf Full
88 2 *inRxBuf=SBUF;
89 2 inRxBuf=t;
90 2 }
91 1 }
92
93
94
95 void PrintChar(unsigned char ch) reentrant//显示字符
96 {
97 1 unsigned char *t;
98 1
99 1 //ES=0;
100 1 //入临界区
101 1 OS_ENTER_CRITICAL();
102 1 t=inTxBuf;t++;
103 1 if(t==TxBuf+LenTxBuf) t=TxBuf;
104 1 if(t==outTxBuf) {/*ES=1;*/
105 2 //出临界区
106 2 OS_EXIT_CRITICAL();
107 2 return;} //TxBuf Full
108 1 *inTxBuf=ch;
109 1 inTxBuf=t;
110 1 //ES=1;
111 1 //出临界区
112 1 OS_EXIT_CRITICAL();
113 1 if(TIflag){
114 2 TIflag=0;
115 2 TI=1;
116 2 }
117 1 }
C51 COMPILER V6.14 SERIAL 05/04/2005 04:11:15 PAGE 3
118
119
120
121 void PrintStr(unsigned char *str) reentrant//显示字符串
122 {
123 1 int i;
124 1 unsigned char j;
125 1 unsigned char ch;
126 1
127 1 //EA=0;
128 1 //入临界区
129 1 OS_ENTER_CRITICAL();
130 1 for(i=0;i<MaxLenStr;i++){
131 2 ch=*(str+i);
132 2 if(ch=='\0') break;
133 2 else if(ch=='\n'){PrintChar(10);PrintChar(13);}
134 2 else if(ch=='\t'){
135 3 for(j=0;j<TABNum;j++)
136 3 PrintChar(' ');
137 3 }
138 2 else PrintChar(ch);
139 2 }
140 1 //EA=1;
141 1 //出临界区
142 1 OS_EXIT_CRITICAL();
143 1 }
144
145 void clrscr() reentrant//清屏
146 {
147 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个回车换行清屏幕。
148 1 }
149
150 //============================================================================================
151
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 818 ----
CONSTANT SIZE = 26 ----
XDATA SIZE = 2062 ----
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 + -