📄 serial_int_2.lst
字号:
C51 COMPILER V8.02 SERIAL_INT_2 04/21/2008 06:36:30 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE SERIAL_INT_2
OBJECT MODULE PLACED IN serial_int_2.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE serial_int_2.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //文件名:serial_int_2.c
2 //说明:较简单的中断法串口通讯程序
3 //可以使用串口调试助手测试
4 //编写:王晓荣
5 //日期:20080403
6
7 #include <reg51.h>
8
9 #define OUTBUF_LENGTH 5 //输出缓冲区大小
10 unsigned char arOutbuf[OUTBUF_LENGTH]; //输出缓冲区
11 unsigned char *pOutlast = arOutbuf; //最后由中断传输出去的字节位置
12 unsigned char *pPutlast = arOutbuf; //最后放入发送缓冲区的字节位置
13
14 #define INBUF_LENGTH 5 //输入缓冲区大小
15 unsigned char arInbuf[INBUF_LENGTH]; //输入缓冲区
16 unsigned char *inlast = arInbuf; //最后由中断进入接收缓冲区的字节位置
17 unsigned char *getlast = arInbuf; //最后取走的字节位置
18
19 bit sendoutEndFlg; //BUF中最后一个数据发完标志,用于启动一组数据的发送
20 bit outbufEmptyFlg; //输出缓冲区空标志
21 bit inbufEmptyFlg; //接收缓冲区空标志
22 bit inbufFullFlg; //输入缓冲区满标志
23 //////////////////////////////////////////////////////////////////////////////////////////
24
25 //放入一个字节到发送缓冲区
26 putbyte(char c)
27 {
28 1 //等待,防止写入数据时发生套圈现象
29 1 while ((pOutlast == pPutlast + 2) ||
30 1 (OUTBUF_LENGTH + pOutlast == pPutlast + 2));
31 1 ES=0; //暂停串行中断
32 1 *pPutlast = c; //写缓冲区
33 1 pPutlast ++; //发送缓冲区指针加一
34 1 if (pPutlast == arOutbuf + OUTBUF_LENGTH) //指针到了顶部换到底部
35 1 pPutlast = arOutbuf;
36 1 outbufEmptyFlg = 0;
37 1 if (sendoutEndFlg) //缓冲区开始为空置为有,启动发送
38 1 {
39 2 sendoutEndFlg = 0;
40 2 TI = 1;
41 2 }
42 1 ES = 1;
43 1 }///////////////////////////////////////////////////////////////////////
44
45
46 //发送一个定义在程序存储区的字符串到串口
47 putstring(unsigned char *pString)
48 {
49 1 for (;*pString != 0; pString++) //遇到停止符0结束
50 1 putbyte(*pString);
51 1 }//////////////////////////////////////////////////////////
52
53 unsigned char getbyte ()
54 {
55 1 unsigned char c ;
C51 COMPILER V8.02 SERIAL_INT_2 04/21/2008 06:36:30 PAGE 2
56 1 while (inbufEmptyFlg); //如果缓冲区空,则等待
57 1 ES = 0;
58 1 c = *getlast; //取数据
59 1 getlast ++; //最后取走的数据位置加一
60 1 inbufFullFlg = 0; //输入缓冲区的满标志清零
61 1 if (getlast == arInbuf + INBUF_LENGTH) //地址到顶部回到底部
62 1 getlast = arInbuf;
63 1 if (getlast == inlast) //如果缓冲区数据已读取完
64 1 inbufEmptyFlg = 1;
65 1 ES = 1;
66 1 return (c); //取回数据
67 1 }//////////////////////////////////////////////////////////////////////////////////
68
69 //串口中断处理
70 serial () interrupt 4
71 {
72 1 if (TI )
73 1 {
74 2 TI = 0;
75 2 if (!outbufEmptyFlg)
76 2 {
77 3 SBUF = *pOutlast; //未发送完继续发送
78 3 pOutlast++ ; //最后传出去的字节位置加一
79 3 if (pOutlast == arOutbuf + OUTBUF_LENGTH)
80 3 pOutlast = arOutbuf;//地址到顶部回到底部
81 3 if (pPutlast == pOutlast)
82 3 outbufEmptyFlg = 1; //数据发送完置发送缓冲区空标志
83 3 }
84 2 else
85 2 sendoutEndFlg = 1;
86 2 }
87 1 if (RI)
88 1 {
89 2 RI = 0;
90 2 if(!inbufFullFlg)
91 2 {
92 3 *inlast = SBUF; //放入数据
93 3 inlast ++; //最后放入的位置加一
94 3 inbufEmptyFlg = 0;
95 3 if (inlast == arInbuf + INBUF_LENGTH)
96 3 inlast = arInbuf;//地址到顶部回到底部
97 3 if (inlast == getlast)
98 3 inbufFullFlg = 1; //接收缓冲区满置满标志
99 3 }
100 2 }
101 1 }//////////////////////////////////////////////////////////////////////////////////
102
103 //串口初始化
104 serial_init ()
105 {
106 1 TMOD = 0x20;
107 1 TH1 = 256 - 12; //1.5: 波特率19200; 3: 波特率9600; 6:波特率4800; 12:波特率2400
108 1 TL1 = 256 - 12;
109 1 SCON = 0x50; //工作方式1
110 1 PCON &= 0xef; // 波特率不倍增
111 1 TR1 = 1;
112 1 }//////////////////////////////////////////////////////////////////////////////////
113
114 //测试用主函数
115 void main( )
116 {
117 1 unsigned char c;
C51 COMPILER V8.02 SERIAL_INT_2 04/21/2008 06:36:30 PAGE 3
118 1 sendoutEndFlg = 1; //BUF中最后一个数据发完标志,用于启动一组数据的发送
119 1 outbufEmptyFlg = 1; //输出缓冲区空标志
120 1 inbufEmptyFlg = 1; //接收缓冲区空标志
121 1 serial_init ();
122 1
123 1 IE = 0X90;
124 1 putstring("com");
125 1 putstring("com");
126 1 while(1)
127 1 {
128 2 c = getbyte ();
129 2 putbyte(c);
130 2 }
131 1
132 1 }
133
134
135
136
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 507 ----
CONSTANT SIZE = 4 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 22 3
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -