📄 serial.lst
字号:
C51 COMPILER V7.07 SERIAL 03/17/2008 08:20:33 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE serial.c BROWSE MODDP2 DEBUG OBJECTEXTEND
stmt level source
1 //**********************************************************************************
2 //杨屹 2002/08/20 第一版
3 //基于中断的串口驱动及显示程序
4 //联系方法:gdtyy@ri.gdt.com.cn(2003/07/31以前有效)
5 //**********************************************************************************
6 //程序特点:
7 // 1.基于中断,可并发执行
8 // 2.参数可配置(收发缓冲区大小,最大字符串长度,TAB键移动距离)
9 //**********************************************************************************
10 //使用方法:(此范例自包含,独立于其他程序。)
11 // 先配制收发缓冲区大小等可变参数(在serial.h中的宏定义)
12 // 1.开头加入#include <reg51.h>语句,一定要有。
13 // 2.初始化串口 InitSerial();//本例中为20MHz晶体,300波特率,模式2初始化
14 // 3.初始化串口缓冲区 InitSerialBuffer();
15 // 4.使用显示字节,字,长字,字符,字符串,清屏函数。
16 //自包含
17 //**********************************************************************************
18 //波特率计算公式:
19 // TH1=256-(2^SMOD/32*Fosc/12*1/Bound)
20 // 其中:SMOD=0,1;Fosc=晶体或晶振频率;Bound=波特率
21 // 本例中,SMOD=0;Fosc=20*10E6;Bound=300,所以TH1=0x52。
22 //Baud rate(20Mhz)
23 //300(52);1200(D5);2400(EA);4800(F5);9600(FB);19200(FD);38400(FF);
24 //**********************************************************************************
25 //书写风格:
26 // 1.带yy前缀标志的函数为杨屹改写的等效C库函数。
27 // 2.单个单词用小写,yy定义为前缀,不算一个单词。
28 // 3.多个单词(2个及以上),每个单词首字母大写。(有时变量名第一个单词首字母小写)
29 // 4.采用内缩风格,每次缩进8个空格。
30 //**********************************************************************************
31 //应用举例:(可在KEIL仿真环境下运行)
32 //源程序文件:serial.h/serial.c/main.c
33 //main.c内容:
34 //#include <reg51.h>//Note:It must be added.必须在serial.c之前
35 //#include <serial.h>
36 //main()
37 //{
38 // unsigned char ch;
39 //
40 // InitSerial();
41 // InitSerialBuffer();
42 // while(1){
43 // PrintStr("\n");
44 // PrintByte(90);PrintStr(" ");
45 // PrintWord(90);PrintStr(" ");
46 // PrintLong(90);PrintStr(" ");
47 // PrintChar('y');PrintChar(' ');//千万别写成双引号,否则打印0(乱字符)。
48 // PrintStr("\nHello!\nI'm YangYi.\n");
49 // PrintStr("Press any key to continue...");
50 // while(!yygetch(&ch));
51 // }
52 //}
53 //**********************************************************************************
54 //建议:
55 // 你完全可以把该子程序当作函数库使用,以便减少重复劳动,提高代码质量。
C51 COMPILER V7.07 SERIAL 03/17/2008 08:20:33 PAGE 2
56 //**********************************************************************************
57
58 #include <serial.h>
59 #include <MCS51.H>
60
61 unsigned char xdata TxBuf[LenTxBuf],RxBuf[LenRxBuf];//收发缓冲区实体
62 unsigned char *inTxBuf,*outTxBuf,*inRxBuf,*outRxBuf;//收发缓冲区读写指针
63 bit TIflag=1; // 标志串口0发送缓冲区为空。
64 bit TIflag1=1; // 标志串口1发送缓冲区为空。
65
66 void InitSerial()//串口初始化
67 {
68 1 /* TMOD=TMOD&0x0F;
69 1 TMOD=TMOD|0x20;
70 1 TL1=0xFD,
71 1 TH1=0xFD;//19200 , 22.1184MHz
72 1 SCON0=0x50;
73 1 SCON1=0x50;
74 1 PCON=0x00;
75 1 TR1=1;*/
76 1 }
77
78 void InitSerialBuffer(void)//串口缓冲区初始化
79 {
80 1 inTxBuf=TxBuf;outTxBuf=TxBuf;
81 1 inRxBuf=RxBuf;outRxBuf=RxBuf;
82 1 }
83
84
85
86 void UART(void) interrupt 4
87 { //中断在汇编中实现,去掉interrupt 4{//串口中断服务子程序
88 1 unsigned char *t;
89 1
90 1 if(TI){
91 2 TI=0;
92 2 if(outTxBuf!=inTxBuf) //TxBuf is not Empty
93 2 {
94 3 SBUF=*outTxBuf;
95 3 outTxBuf++;
96 3 if(outTxBuf==TxBuf+LenTxBuf)
97 3 outTxBuf=TxBuf;
98 3 }
99 2 else
100 2 TIflag=1;
101 2 }
102 1 if(RI){
103 2 RI=0;
104 2 t=inRxBuf;t++;
105 2 if(t==RxBuf+LenRxBuf) t=RxBuf;
106 2 if(t!=outRxBuf) //RxBuf is not Full
107 2 {
108 3 *inRxBuf=SBUF;
109 3 inRxBuf=t;
110 3 }
111 2 }
112 1 }
113
114 void UART1(void) interrupt 7
115 {
116 1 unsigned char *t;
117 1
C51 COMPILER V7.07 SERIAL 03/17/2008 08:20:33 PAGE 3
118 1 if(TI_1){
119 2 TI_1=0;
120 2 if(outRxBuf!=inRxBuf) //TxBuf is not Empty
121 2 {
122 3 SBUF1=*outRxBuf;
123 3 outRxBuf++;
124 3 if(outRxBuf==RxBuf+LenRxBuf)
125 3 outRxBuf=RxBuf;
126 3 }
127 2 else
128 2 TIflag1=1;
129 2 }
130 1 if(RI_1){
131 2 RI_1=0;
132 2 t=inTxBuf;t++;
133 2 if(t==TxBuf+LenTxBuf) t=TxBuf;
134 2 if(t!=outTxBuf) //RxBuf is not Full
135 2 {
136 3 *inTxBuf=SBUF1;
137 3 inTxBuf=t;
138 3 }
139 2 }
140 1 }
141
142 void initial_cpu(void)
143 {
144 1 CKCON = 0x41;
145 1 TA = 0xaa;
146 1 TA = 0x55;
147 1 WDCON = 0x00; // 禁止看门狗
148 1 PMR = 0X41; //外部XDATA 4CLOCKS ONE MACHAINE CYCLE
149 1 SCON = 0x50;
150 1 SCON1 = 0x50;
151 1 TMOD = 0x21; // T1:baut,T0:Time 16bit
152 1 TCON = 0x50;
153 1 TH1 = 0xfe; // 0xfd:9600 0xfe:14400
154 1 TL1 = 0xfe;
155 1 PCON = 0x00; // Uart Baut=9600
156 1 TH0 = 0x4c;
157 1 TL0 = 0x00; // T0=50ms
158 1 IP = 0x50; //两个串口高
159 1 IE = 0xd0; //开全局中断,定时器0。串口1中断。串口2中断。
160 1 }
161
162
163 void putunchar(unsigned char c)
164 {
165 1 ES = 0;
166 1 TI = 0;
167 1 SBUF = c;
168 1 while(!TI);
169 1 TI = 0;
170 1 ES = 1;
171 1 }
172
173
174 void putunchar1(unsigned char c)
175 {
176 1 ES1 = 0;
177 1 TI_1= 0;
178 1 SBUF1 = c;
179 1 while(!TI_1);
C51 COMPILER V7.07 SERIAL 03/17/2008 08:20:33 PAGE 4
180 1 TI_1=0;
181 1 ES1 = 1;
182 1 }
183
184
185 void main(void)
186 {
187 1 int i;
188 1
189 1 initial_cpu();
190 1 InitSerial();
191 1 InitSerialBuffer();
192 1 for(i=0;i<10;i++)
193 1 {
194 2 putunchar(0x30+i);
195 2 putunchar1(0x30+i);
196 2 }
197 1 EA = 1;
198 1
199 1 while(1)
200 1 {
201 2 if((TIflag1==1)&&(inRxBuf!=outRxBuf)) // UART0接收 到 UART1 发送.
202 2 {
203 3 TIflag1=0;
204 3 TI_1=1;
205 3 }
206 2 if((TIflag==1)&&(inTxBuf!=outTxBuf)) // UART1接收 到 UART0 发送.
207 2 {
208 3 TIflag=0;
209 3 TI=1;
210 3 }
211 2 }
212 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 678 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 800 ----
PDATA SIZE = ---- ----
DATA SIZE = 12 6
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -