📄 serial.lst
字号:
C51 COMPILER V7.08 SERIAL 12/26/2003 07:27:16 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: C:\Keil708\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 serial_uart_8; /*工作方式为8位数据 */
48 1 serial_receive_enable;/*允许接收*/
49 1 ti=1;
50 1
51 1 inTxBuf=TxBuf;outTxBuf=TxBuf;
52 1 inRxBuf=RxBuf;outRxBuf=RxBuf;
53 1 EA=1;ES=1;
54 1 }
55
C51 COMPILER V7.08 SERIAL 12/26/2003 07:27:16 PAGE 2
56 //串口中断服务子程序
57 void serial(void) interrupt 4
58 {
59 1 unsigned char *t;
60 1
61 1 if(TI)
62 1 {
63 2 TI=0;
64 2 if(inTxBuf==outTxBuf) //TxBuf Empty
65 2 {
66 3 TIflag=1;
67 3 return;
68 3 }
69 2 SBUF=*outTxBuf;
70 2 outTxBuf++;
71 2 if(outTxBuf==TxBuf+LenTxBuf)
72 2 outTxBuf=TxBuf;
73 2 }
74 1 if(RI)
75 1 {
76 2 RI=0;
77 2 t=inRxBuf;t++;
78 2 if(t==RxBuf+LenRxBuf)
79 2 t=RxBuf;
80 2 if(t==outRxBuf) //RxBuf Full
81 2 return;
82 2 *inRxBuf=SBUF;
83 2 inRxBuf=t;
84 2 }
85 1 }
86
87 bit getchar(unsigned char *ch)//从串口缓冲区读1字节数据
88 {
89 1 ES=0;
90 1 if(inRxBuf==outRxBuf)
91 1 {
92 2 ES=1;
93 2 return 0;
94 2 } //RxBuf Empty
95 1 *ch=*outRxBuf; outRxBuf++;
96 1 if(outRxBuf==RxBuf+LenRxBuf) outRxBuf=RxBuf;
97 1 ES=1;
98 1 return 1;
99 1 }
100
101 bit putchar(unsigned char ch)//显示字符
102 {
103 1 unsigned char *t;
104 1
105 1 ES=0;
106 1 if(TIflag)
107 1 {
108 2 TIflag=0;
109 2 TI=1;
110 2 }
111 1 t=inTxBuf;t++;
112 1 ES=1;
113 1 if(t==TxBuf+LenTxBuf) t=TxBuf;
114 1 // if(t==outTxBuf) {ES=1;return 0;} //TxBuf Full
115 1 while(t==outTxBuf); //TxBuf Full 改为等待
116 1 *inTxBuf=ch;
117 1 inTxBuf=t;
C51 COMPILER V7.08 SERIAL 12/26/2003 07:27:16 PAGE 3
118 1 return 1;
119 1 }
120
121 unsigned char code hex_[]={"0123456789ABCDEF"};
122 void puthex(unsigned char Byte)//以十六进制格式显示1个字节数据
123 {
124 1 unsigned char ch;
125 1 ch=(Byte>>4)&0x0f;
126 1 putchar(hex_[ch]);
127 1 ch=Byte&0x0f;
128 1 putchar(hex_[ch]);
129 1 }
130
131 void putword(unsigned int Word)//以十六进制格式显示1个字数据
132 {
133 1 puthex(Word>>8);
134 1 puthex(Word&0xFF);
135 1 }
136
137 void putstring(unsigned char *str)//显示字符串
138 {
139 1 for (;*str!=0;str++) //遇到停止符0结束
140 1 putchar(*str);
141 1 }
142
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 812 ----
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 + -