📄 serial.lst
字号:
C51 COMPILER V7.06 SERIAL 12/12/2008 13:46:00 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE serial.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 //基于中断的串口驱动程序
3 //程序特点:
4 // 1.基于中断,可并发执行
5 // 2.参数可配置(收发缓冲区大小,最大字符串长度,TAB键移动距离)
6 //**********************************************************************************
7 //使用方法:(此范例自包含,独立于其他程序。)
8 // 先配制收发缓冲区大小等可变参数(在serial.h中的宏定义)
9 // 1.开头加入#include <reg51.h>语句,一定要有。
10 // 2.初始化串口 InitSerial();//本例中为20MHz晶体,300波特率,模式2初始化
11 // 3.初始化串口缓冲区 InitSerialBuffer();
12 // 4.使用显示字节,字,长字,字符,字符串,清屏函数。
13 //**********************************************************************************
14 //波特率计算公式:
15 // TH1=256-(2^SMOD/32*Fosc/12*1/Bound)
16 // 其中:SMOD=0,1;Fosc=晶体或晶振频率;Bound=波特率
17 //**********************************************************************************
18
19
20 #include <serial.h>
21 #include <at89x52.h>
22
23 unsigned char TxBuf[LenTxBuf],RxBuf[LenRxBuf]; //串口0收发缓冲区实体 receiveflag:接收中断标志
24 unsigned char receiveflag=0;
25 unsigned char *inTxBuf,*outTxBuf,*inRxBuf,*outRxBuf; //串口0收发缓冲区读写指针
26
27
28 bit TIflag=1;//Note:It must be 1.
29 bit RIflag=1;
30
31 void InitSerial()//串口初始化
32 {
33 1 TMOD=0x21; //方式1 T0 16 bit
34 1 TL1=0xFD;
35 1 TH1=0xFD; //9600 , 11.0592MHz
36 1 SCON=0x50;
37 1 PCON=0x80; //SM0.SM1=01:可变波特率 REN=1,允许串行接收位 SCON:串行接口控制寄存器
38 1 //PCON:首位是SMOD,SMOD=1,在串行接口方式1、2、3情况下,波特率提高一倍。
-复位时,SMOD=0(波特率不加倍).
39 1 TR1=1; //T1运行控制位
40 1 ES=1;
41 1 }
42
43 void InitSerialBuffer(void)//串口缓冲区初始化
44 {
45 1 inTxBuf=TxBuf;outTxBuf=TxBuf; //串口0缓冲区初始化 TxBuf[LenTxBuf],RxBuf[LenRxBuf];
46 1 inRxBuf=RxBuf;outRxBuf=RxBuf;
47 1 ES=1; //串行接口允许中断位
48 1
49 1 }
50
51 void serial(void) interrupt 4
52 { //中断在汇编中实现,去掉interrupt 4{//串口中断服务子程序
53 1 unsigned char *t;
54 1
C51 COMPILER V7.06 SERIAL 12/12/2008 13:46:00 PAGE 2
55 1 if(TI){ //TI发送中断标志
56 2 TI=0;
57 2 if(inTxBuf==outTxBuf)
58 2 {
59 3 TIflag=1;return; //TxBuf Empty
60 3 }
61 2 SBUF=*outTxBuf; outTxBuf++;
62 2 if(outTxBuf==TxBuf+LenTxBuf) outTxBuf=TxBuf;
63 2 }
64 1 if(RI){ //RI接收中断标志
65 2 RI=0;
66 2 t=inRxBuf;t++;
67 2 if(t==RxBuf+LenRxBuf) t=RxBuf;
68 2 if(t==outRxBuf) {RIflag=1;return;} //RxBuf Full
69 2 *inRxBuf=SBUF;
70 2 inRxBuf=t;
71 2 receiveflag=1;
72 2 }
73 1
74 1 }
75
76 /*
77 bit getbyte(unsigned char *ch)//从串口缓冲区读1字节数据
78
79 ES=1; ////串行接口允许中断位
80 */
81
82 bit getbyte(unsigned char *ch) //从串口缓冲区读1字节数据
83 {
84 1 if(inRxBuf==outRxBuf) {ES=1;return 0;} //RxBuf Empty
85 1 *ch=*outRxBuf; outRxBuf++;
86 1 if(outRxBuf==RxBuf+LenRxBuf) outRxBuf=RxBuf;
87 1 //ES=1;
88 1 return 1;
89 1
90 1 }
91
92 bit putbytes(unsigned char *ch,unsigned char bytes)//串口发送数据
93 {
94 1 unsigned char *t;
95 1 unsigned char i;
96 1
97 1 for(i=0;i<bytes;i++)
98 1 {
99 2 t=inTxBuf; t++;
100 2 if(t==TxBuf+LenTxBuf) t=TxBuf;
101 2 if(t==outTxBuf)
102 2 {
103 3 /*ES=1;*/
104 3 return 0;
105 3 } //TxBuf Full
106 2 *inTxBuf=*ch; //要发送的数据均是存放在ch空间里的
107 2 inTxBuf=t;
108 2 ch++;
109 2 }
110 1 if(TIflag)
111 1 {
112 2 TIflag=0;
113 2 TI=1;
114 2 }
115 1
116 1 return 1;
C51 COMPILER V7.06 SERIAL 12/12/2008 13:46:00 PAGE 3
117 1
118 1
119 1 }
120
121 unsigned char ReceivedBytes(void) //判断串口缓冲区是否为空,若为空返回0,否则返回缓冲区字节数
122 {
123 1 char len;
124 1 len=inRxBuf-outRxBuf;
125 1 if(len<0)
126 1 len+=LenRxBuf;
127 1 return len;
128 1 }
129
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 523 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 37 12
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 + -