📄 serial_int_3.lst
字号:
C51 COMPILER V8.02 SERIAL_INT_3 04/22/2008 14:44:03 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE SERIAL_INT_3
OBJECT MODULE PLACED IN serial_int_3.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE serial_int_3.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //文件名:serial_int_3.c
2 //说明:中断法串口通讯程序
3 //可以使用串口调试助手测试
4 //编写:王晓荣
5 //日期:20080403
6 #include <REGX51.H>
7
8 #define OUTBUF_LENGTH 20 //输出缓冲区大小
9 unsigned char arOutbuf[OUTBUF_LENGTH]; //输出缓冲区
10 unsigned char *pOutlast = arOutbuf; //输出缓冲区中已发送数据位置指针
11 unsigned char *pPutlast = arOutbuf; //输出缓冲区中已存放数据位置指针
12
13 #define INBUF_LENGTH 20 //输入缓冲区大小
14 unsigned char arInbuf[INBUF_LENGTH]; //输入缓冲区
15 unsigned char *inlast = arInbuf; //输入缓冲区中已接收数据位置指针
16 unsigned char *getlast = arInbuf; //输入缓冲区中已读取数据位置指针
17
18 bit sendFlg; //一组数据的启动发送标志
19 bit outbufEmptyFlg; //输出缓冲区空标志
20 bit inbufEmptyFlg; //输入缓冲区空标志
21 bit inbufFullFlg; //输入缓冲区满标志
22
23 putbyte(char c); //存一个字节到输出缓冲区
24 putbytes(unsigned char *,unsigned char); //存多个字节到输出缓冲区
25 putstring(unsigned char *); //存字符串到输出缓冲区
26 unsigned char getbyte (); //从输入缓冲区中读取一个字节数据
27 void getbytes (unsigned char *, unsigned char); //从输入缓冲区中读取多个字节数据
28 void getstring (unsigned char *, unsigned char);//从输入缓冲区中读取字符串
29 //////////////////////////////////////////////////////////////////////////////////////////
30
31 //测试用主函数
32 void main( )
33 {
34 1 //unsigned char i;
35 1 unsigned char free[20];
36 1 sendFlg = 1; //一组数据的启动发送标志
37 1 outbufEmptyFlg = 1; //输出缓冲区空
38 1 inbufEmptyFlg = 1; //输入缓冲区空
39 1 serial_init ();
*** WARNING C206 IN LINE 39 OF SERIAL_INT_3.C: 'serial_init': missing function-prototype
40 1 IE = 0X90;
41 1 //for(i = 0; i < 10; i ++)
42 1 //free[i] = i + 0x30;
43 1 //getstring(free, 10);
44 1 //putstring(free);
45 1 //putbytes(free,10);
46 1 //getbytes(free, 10);
47 1 //putbytes(free);
48 1 getstring(free, 10);
49 1 putstring(free);
50 1 putstring("ready!");
51 1 while(1);
52 1 }///////////////////////////////////////////////////////////////////////////////////
-
53
C51 COMPILER V8.02 SERIAL_INT_3 04/22/2008 14:44:03 PAGE 2
54
55 //存一个字节到输出缓冲区
56 putbyte(char c)
57 {
58 1 //等待,防止写入数据时发生套圈现象
59 1 while ((pOutlast == pPutlast + 2) ||
60 1 (OUTBUF_LENGTH + pOutlast == pPutlast + 2));
61 1 ES=0; //暂停串行中断
62 1 *pPutlast = c; //存数据
63 1 pPutlast ++; //已存放数据位置指针调整
64 1 if (pPutlast == arOutbuf + OUTBUF_LENGTH)
65 1 pPutlast = arOutbuf; //指针到了顶部换到底部
66 1 outbufEmptyFlg = 0; //输出缓冲区标志为非空
67 1 if (sendFlg) //如果是第1个数据,启动发送
68 1 {
69 2 sendFlg = 0;
70 2 TI = 1; //启动发送
71 2 }
72 1 ES = 1;
73 1 }///////////////////////////////////////////////////////////////////////
74
75
76 //存多个字节到输出缓冲区
77 putbytes(unsigned char *pOutput,unsigned char length)
78 {
79 1 unsigned char i;
80 1 for(i = 0; i < length; i++)
81 1 {
82 2 putbyte(*pOutput);
83 2 pOutput ++;
84 2 }
85 1 }////////////////////////////////////////////////////////////
86
87
88 //存字符串到输出缓冲区
89 putstring(unsigned char *pString)
90 {
91 1 for (;*pString != 0; pString++) //遇到停止符0结束
92 1 putbyte(*pString);
93 1 }//////////////////////////////////////////////////////////
94
95 //从输入缓冲区中读取一个字节数据
96 unsigned char getbyte ()
97 {
98 1 unsigned char ch ;
99 1 while (inbufEmptyFlg); //如果缓冲区空,则等待
100 1 ES = 0;
101 1 ch = *getlast; //读取输入缓冲区数据
102 1 getlast ++; //调整已读取数据位置指针
103 1 inbufFullFlg = 0; //输入缓冲区未满
104 1 if (getlast == arInbuf + INBUF_LENGTH)
105 1 getlast = arInbuf; //地址到顶部回到底部
106 1 if (getlast == inlast) //如果缓冲区数据已读取完
107 1 inbufEmptyFlg = 1;
108 1 ES = 1;
109 1 return (ch); //取回数据
110 1 }//////////////////////////////////////////////////////////////////////////////////
111
112 //从输入缓冲区中读取多个字节数据
113 //参数 接收数据存放位置, 接收数据长度
114 void getbytes (unsigned char *pline, unsigned char length)
115 {
C51 COMPILER V8.02 SERIAL_INT_3 04/22/2008 14:44:03 PAGE 3
116 1 unsigned char i;
117 1 for(i = 0; i < length; i++)
118 1 {
119 2 *pline = getbyte ();
120 2 pline ++;
121 2 }
122 1 }/////////////////////////////////////////////////////////////////////////
123
124 //从输入缓冲区中读取字符串
125 //参数 接收数据存放位置, 接收数据长度
126 void getstring (unsigned char *pline, unsigned char length)
127 {
128 1 unsigned char i;
129 1 for(i = 0; i < length; i++)
130 1 {
131 2 *pline = getbyte ();
132 2 if( *pline == 0x00)
133 2 break;
134 2 pline ++;
135 2 }
136 1 *pline = 0x00; //加上停止符0
137 1 }/////////////////////////////////////////////////////////////////////////
138
139 //串口中断处理
140 serial () interrupt 4
141 {
142 1 if (TI )
143 1 {
144 2 TI = 0;
145 2 if (!outbufEmptyFlg)
146 2 {
147 3 SBUF = *pOutlast; //未发送完继续发送
148 3 pOutlast++ ; //最后传出去的字节位置加一
149 3 if (pOutlast == arOutbuf + OUTBUF_LENGTH)
150 3 pOutlast = arOutbuf; //地址到顶部回到底部
151 3 if (pPutlast == pOutlast)
152 3 outbufEmptyFlg = 1; //数据发送完置发送缓冲区空标志
153 3 }
154 2 else
155 2 sendFlg = 1;
156 2 }
157 1 if (RI)
158 1 {
159 2 RI = 0;
160 2 if(!inbufFullFlg)
161 2 {
162 3 *inlast = SBUF; //放入数据
163 3 inlast ++; //最后放入的位置加一
164 3 inbufEmptyFlg = 0; //输入缓冲区非空
165 3 if (inlast == arInbuf + INBUF_LENGTH)
166 3 inlast = arInbuf; //地址到顶部回到底部
167 3 if (inlast == getlast)
168 3 inbufFullFlg = 1; //输入缓冲区满
169 3 }
170 2 }
171 1 }//////////////////////////////////////////////////////////////////////////////////
172
173 //串口初始化
174 serial_init ()
175 {
176 1 TMOD = 0x20;
177 1 TH1 = 256 - 12; //1.5: 波特率19200; 3: 波特率9600; 6:波特率4800; 12:波特率2400
C51 COMPILER V8.02 SERIAL_INT_3 04/22/2008 14:44:03 PAGE 4
178 1 TL1 = 256 - 12;
179 1 SCON = 0x50; //工作方式1
180 1 PCON &= 0xef; // 波特率不倍增
181 1 TR1 = 1;
182 1 }//////////////////////////////////////////////////////////////////////////////////
183
184
185
186
187
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 661 ----
CONSTANT SIZE = 7 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 52 32
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -