📄 serial.lst
字号:
C51 COMPILER V6.12 SERIAL 02/27/2006 18:42:08 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN .\serial.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\serial.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //本函数集来自51单片机世界,作者斑竹丁丁(聂小猛)。
2 //主页地址http://www.mcu51.com
3 //串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理
4 //出入均设有缓冲区,大小可任意设置。
5 //可供使用的函数名:
6 /*
7 extern char getbyte(void);//从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
8 extern putbyte(char c);//放入一个字节到发送缓冲区
9 extern putstring(uchar *puts);//发送一个定义在程序存储区的字符串到串口
10 extern puthex(uchar c);//发送一个字节的hex码,分成两个字节发。
11 extern bit inbufsign;
12 #define CR putstring("\r\n")//发送一个回车换行
13 extern void serial_init (void);
14 */
15
16 //*************************************************************************
17 #pragma small
18
19 #include <reg52.h>
20 #define uchar unsigned char
21 #define uint unsigned int
22
23 #define OLEN 8 /* size of serial transmission buffer */
24 idata uchar outbuf[OLEN]; /* storage for transmission buffer */
25 data uchar idata *outlast=outbuf; //最后由中断传输出去的字节位置
26 data uchar idata *putlast=outbuf; //最后放入发送缓冲区的字节位置
27 #define ILEN 30 //32 /* size of serial receiving buffer */
28 idata uchar inbuf[ILEN];
29 data uchar idata *inlast=inbuf; //最后由中断进入接收缓冲区的字节位置
30 data uchar idata *getlast=inbuf; //最后取走的字节位置
31 bit outbufsign0; //最后一个数据覵BUF发完标志 发完=0
32 bit outbufsign; //输出缓冲区非空标志 有=1
33 bit inbufsign; //接收缓冲区非空标志 有=1
34 bit inbufful; //输入缓冲区满标志 满=1
35 #define CR putstring("\r\n") //CR=回车换行
36
37
38 //*****************************
39 //放入一个字节到发送缓冲区
40 putbyte(unsigned char c)
41 {
42 1 ES=0; /*暂停串行中断,以免数据比较时出错 */
43 1 while((((outlast-putlast)==2) && (outlast > putlast )) || ((outlast < putlast) && (OLEN-(putlast-outlast)
-==2)))
44 1 {
45 2 ES=1;
46 2 c++;c--;
47 2 ES=0;
48 2 }
49 1 *putlast=c; //放字节进入缓冲区
50 1 putlast++; //发送缓冲区指针加一
51 1 if (putlast==outbuf+OLEN) putlast=outbuf; //指针到了顶部换到底部
52 1 outbufsign=1;
53 1 if (!outbufsign0)
54 1 {
C51 COMPILER V6.12 SERIAL 02/27/2006 18:42:08 PAGE 2
55 2 outbufsign0=1;
56 2 TI=1;
57 2 } //缓冲区开始为空置为有,启动发送
58 1 ES=1;
59 1 }
60
61 //***************************************
62 //发送字符串到串口
63 putstring(uchar *puts)
64 {
65 1 for(;*puts!=0;puts++) //遇到停止符0结束
66 1 putbyte(*puts);
67 1 }
68 //******************************
69 //放一串数据到发送缓冲区,需要定义发送的字节数
70 putbytes(uchar *outplace,uint j)
71 { int i;
72 1 for(i=0;i<j;i++)
73 1 {
74 2 putbyte(*outplace);
75 2 outplace++;
76 2 }
77 1 }
78 //*************************************
79 //发送一个字节的hex码,分成两个字节发。
80 uchar code hex_[]={"0123456789ABCDEF"};
81 puthex(unsigned char c)
82 {
83 1 int ch;
84 1 ch=(c>>4)&0x0f;
85 1 putbyte(hex_[ch]);
86 1 ch=c&0x0f;
87 1 putbyte(hex_[ch]);
88 1 }
89 //*************************************
90 //从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
91 uchar getbyte (void)
92 {
93 1 char idata c ;
94 1 while (!inbufsign); //缓冲区空等待
95 1 ES=0;
96 1 c= *getlast; //取数据
97 1 getlast++; //最后取走的数据位置加一
98 1 inbufful=0; //输入缓冲区的满标志清零
99 1 if (getlast==inbuf+ILEN) getlast=inbuf; //地址到顶部回到底部
100 1 if (getlast==inlast) inbufsign=0; //地址相等置接收缓冲区空空标志,再取数前要检该标志
101 1 ES=1;
102 1 return (c); //取回数据
103 1 }
104 //*****************************************
105 //串口中断处理
106
107 serial () interrupt 4
108 {
109 1 if (TI)
110 1 {
111 2 TI = 0;
112 2 if (outbufsign)
113 2 {
114 3 SBUF=*outlast; //未发送完继续发送
115 3 outlast++; //最后传出去的字节位置加一
116 3 if (outlast==outbuf+OLEN) outlast=outbuf;//地址到顶部回到底部
C51 COMPILER V6.12 SERIAL 02/27/2006 18:42:08 PAGE 3
117 3 if (putlast==outlast) outbufsign=0; //数据发送完置发送缓冲区空标志
118 3 }
119 2 else
120 2 {
121 3 outbufsign0=0;
122 3 }
123 2
124 2 }
125 1 if (RI)
126 1 {
127 2 RI = 0;
128 2 if(!inbufful)
129 2 {
130 3 *inlast= SBUF; //放入数据
131 3 inlast++; //最后放入的位置加一
132 3 inbufsign=1;
133 3 if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
134 3 if (inlast==getlast) inbufful=1; //接收缓冲区满置满标志
135 3 }
136 2 }
137 1 }
138
139 //*****************************
140 //串口初始化
141 void serial_init (void)
142 {
143 1 //用t1作波特率
144 1 SCON = 0x50; // mode 1: 8-bit UART, enable receiver
145 1 TMOD |= 0x20; // timer 1 mode 2: 8-Bit reload
146 1 PCON |= 0x80; TH1 = 0xfa; //baud*2 /* reload value 9600 baud -22118400HZ
147 1 TR1 = 1; // timer 1 run
148 1
149 1 ES = 1;
150 1 REN=1;
151 1 EA=1;
152 1
153 1 }
154
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 365 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 12
IDATA SIZE = 38 1
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 + -