📄 serial.lst
字号:
C51 COMPILER V7.10 SERIAL 09/03/2004 14:22:22 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE serial.c LARGE BROWSE DEBUG OBJECTEXTEND
line 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.采用内缩风格,每次缩进一个TAB。
30 //**********************************************************************************
31 //应用举例:(可在KEIL仿真环境下运行)
32 //源程序文件:serial.h/serial.c/main.c
33 //main.c内容:
34 #include "my.h"
35 #include "serial.h"//Note:It's ".c",not ".h"
36
37 unsigned char TxBuf[LenTxBuf],RxBuf[LenRxBuf];//收发缓冲区实体
38 unsigned char *inTxBuf,*outTxBuf,*inRxBuf,*outRxBuf;//收发缓冲区读写指针
39 bit TIflag=1;//Note:It must be 1.
40
41 void serial_init()//串口初始化
42 {
43 1 //serial_baud_9600; //22.1184 mhz 19200bps
44 1 //serial_baud_9600; //22.1184Mhz 38400bps 这些宏定义在my.h文件里。
45 1 //serial_baud_38400;
46 1 //serial_baud_57600;
47 1
48 1 SCON = 0x50;
49 1 TI = 1;
50 1 REN = 1;
51 1 RCAP2L = RCAP2_LOW;
52 1 RCAP2H = RCAP2_HIGH;
53 1 TL2 = RCAP2_LOW;
54 1 TH2 = RCAP2_HIGH;
55 1 rclk = 1;
C51 COMPILER V7.10 SERIAL 09/03/2004 14:22:22 PAGE 2
56 1 tclk = 1;
57 1 TR2 = 1;
58 1
59 1
60 1 serial_uart_8; /*工作方式为8位数据 */
61 1 serial_receive_enable;/*允许接收*/
62 1 ti=1;
63 1
64 1 inTxBuf=TxBuf;outTxBuf=TxBuf;
65 1 inRxBuf=RxBuf;outRxBuf=RxBuf;
66 1 EA=1;ES=1;
67 1 }
68
69 //串口中断服务子程序
70 void serial(void) interrupt 4
71 {
72 1 unsigned char *t;
73 1
74 1 if(TI)
75 1 {
76 2 TI=0;
77 2 if(inTxBuf==outTxBuf) //TxBuf Empty
78 2 {
79 3 TIflag=1;
80 3 return;
81 3 }
82 2 SBUF=*outTxBuf;
83 2 outTxBuf++;
84 2 if(outTxBuf==TxBuf+LenTxBuf)
85 2 outTxBuf=TxBuf;
86 2 }
87 1 if(RI)
88 1 {
89 2 RI=0;
90 2 t=inRxBuf;t++;
91 2 if(t==RxBuf+LenRxBuf)
92 2 t=RxBuf;
93 2 if(t==outRxBuf) //RxBuf Full
94 2 return;
95 2 *inRxBuf=SBUF;
96 2 inRxBuf=t;
97 2 }
98 1 }
99
100 bit getchar(unsigned char *ch)//从串口缓冲区读1字节数据
101 { //unsigned char *t;
102 1 ES=0;
103 1 if(inRxBuf==outRxBuf)
104 1 {
105 2 ES=1;
106 2 return 0;
107 2 } //RxBuf Empty
108 1
109 1 *ch=*outRxBuf;
110 1 /*
111 1 t = outRxBuf;
112 1 t--;
113 1 if(*ch == 'N' && *t=='T')modermflag = 1;
114 1 */
115 1 outRxBuf++;
116 1 if(outRxBuf==RxBuf+LenRxBuf) outRxBuf=RxBuf;
117 1 ES=1;
C51 COMPILER V7.10 SERIAL 09/03/2004 14:22:22 PAGE 3
118 1 return 1;
119 1 }
120
121 bit putchar(unsigned char ch)//显示字符
122 {
123 1 unsigned char *t;
124 1
125 1 ES=0;
126 1 if(TIflag)
127 1 {
128 2 TIflag=0;
129 2 TI=1;
130 2 }
131 1 t=inTxBuf;t++;
132 1 ES=1;
133 1 if(t==TxBuf+LenTxBuf) t=TxBuf;
134 1 // if(t==outTxBuf) {ES=1;return 0;} //TxBuf Full
135 1 while(t==outTxBuf); //TxBuf Full 改为等待
136 1 *inTxBuf=ch;
137 1 inTxBuf=t;
138 1 return 1;
139 1 }
140
141 unsigned char code hex_[]={"0123456789ABCDEF"};
142 void puthex(unsigned char Byte)//以十六进制格式显示1个字节数据
143 {
144 1 unsigned char ch;
145 1 ch=(Byte>>4)&0x0f;
146 1 putchar(hex_[ch]);
147 1 ch=Byte&0x0f;
148 1 putchar(hex_[ch]);
149 1 }
150
151 void putword(unsigned int Word)//以十六进制格式显示1个字数据
152 {
153 1 puthex(Word>>8);
154 1 puthex(Word&0xFF);
155 1 }
156
157 void putstring(unsigned char *str)//显示字符串
158 {
159 1 for (;*str!=0;str++) //遇到停止符0结束
160 1 putchar(*str);
161 1 }
162
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 826 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = 33 12
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 + -