📄 serial_communication.lst
字号:
C51 COMPILER V8.08 SERIAL_COMMUNICATION 04/25/2008 15:44:36 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE SERIAL_COMMUNICATION
OBJECT MODULE PLACED IN SERIAL_Communication.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE SERIAL_Communication.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h> //头文件
2 #include <rtx51tny.h>
3
4 #define uchar unsigned char //宏定义
5
6 #define OUTBUF_LEN 8 //串行口发送缓冲区的长度
7 uchar outbuf_start; //串行口发送缓冲区的起点
8 uchar outbuf_end; //串行口发送缓冲区的终点
9 idata char outbuf[OUTBUF_LEN]; //串行口发送缓冲区
10 uchar out_task = 0xff; //串行口输出任务的任务号
11
12 #define INBUF_LEN 8 //串行口接收缓冲区的长度
13 uchar inbuf_start; //串行口接收缓冲区的起点
14 uchar inbuf_end; //串行口接收缓冲区的终点
15 idata char inbuf[INBUF_LEN]; //串行口接收缓冲区
16 uchar in_task = 0xff; //串行口输入任务的任务号
17
18 #define CTRL_Q 0x11
19 #define CTRL_S 0x13
20
21 bit sendfull; //发送缓冲区满标志位
22 bit sendactive; //发送激活标志位
23 bit sendstop; //发送停止标志位
24
25 void putbuf (char c)
26 {
27 1 if (!sendfull) //判断发送缓冲区满标志位
28 1 {
29 2 if (!sendactive && !sendstop) //缓冲区未满,发送器未处于活动态
30 2 {
31 3 sendactive = 1;
32 3 SBUF = c; //直接发送第一个字符到SBUF,并启动发送
33 3 }
34 2 else
35 2 {
36 3 outbuf[outbuf_end++ & (OUTBUF_LEN-1)] = c; //向定义的发送缓冲区传送字符
37 3 if (((outbuf_end ^ outbuf_start) & (OUTBUF_LEN-1)) == 0)
38 3 sendfull = 1; //缓冲区满标志置位
39 3 }
40 2 }
41 1 }
42
43
44 char putchar (char c)
45 {
46 1 if (c == '\n') //扩展一行新字符
47 1 {
48 2 while (sendfull) //如果发送缓冲区满,则等待
49 2 {
50 3 out_task = os_running_task_id (); //置位输出任务号
51 3 os_wait (K_SIG, 0, 0); //等待信号
52 3 out_task = 0xff; //输出任务号清零
53 3 }
54 2 putbuf (0x0D); //在LF换行符之前发送CR回车符
55 2 }
C51 COMPILER V8.08 SERIAL_COMMUNICATION 04/25/2008 15:44:36 PAGE 2
56 1 while (sendfull) //如果发送缓冲区满,则等待
57 1 {
58 2 out_task = os_running_task_id (); //置位输出任务号
59 2 os_wait (K_SIG, 0, 0); //等待信号
60 2 out_task = 0xff; //输出任务号清零
61 2 }
62 1 putbuf (c); //发送字符
63 1 return c; //返回字符
64 1 }
65
66
67 char _getkey (void)
68 {
69 1 while (inbuf_end == inbuf_start) //等待
70 1 {
71 2 in_task = os_running_task_id (); //置位输入任务号
72 2 os_wait (K_SIG, 0, 0); //等待信号
73 2 in_task = 0xff; //输入任务号清零
74 2 }
75 1 return (inbuf[inbuf_start++ & (INBUF_LEN-1)]); //返回值
76 1 }
77
78
79 void serial () interrupt 4 using 2 //中断响应函数
80 {
81 1 unsigned char c;
82 1 bit start_trans = 0;
83 1
84 1 if (RI) //RI置1,接收中断
85 1 {
86 2 c = SBUF; //读SBUF
87 2 RI = 0; //中断请求标志RI清零
88 2
89 2 switch (c) //字符处理
90 2 {
91 3 case CTRL_S: //如果是CTRL_S
92 3 sendstop = 1; //置位sendstop,停止发送
93 3 break;
94 3
95 3 case CTRL_Q: //如果是CTRL_Q
96 3 start_trans = sendstop; //开始发送
97 3 sendstop = 0;
98 3 break;
99 3
100 3 default: //对于其它字符
101 3 if (inbuf_start + INBUF_LEN != inbuf_end) //则读入输入缓冲区
102 3 {
103 4 inbuf[inbuf_end++ & (INBUF_LEN-1)] = c;
104 4 }
105 3
106 3 if (in_task != 0xFF) //如果是任务等待
107 3 isr_send_signal (in_task); //发送信号
108 3 break;
109 3 }
110 2 }
111 1
112 1 if (TI || start_trans) //TI置位,发送中断
113 1 {
114 2 TI = 0; //中断请求标志TI清零
115 2 if (outbuf_start != outbuf_end) //如果输入缓冲区接收到字符
116 2 {
117 3 if (!sendstop)
C51 COMPILER V8.08 SERIAL_COMMUNICATION 04/25/2008 15:44:36 PAGE 3
118 3 { //发送字符
119 4 SBUF = outbuf[outbuf_start++ & (OUTBUF_LEN-1)];
120 4 sendfull = 0; // sendfull 标志清零
121 4
122 4 if (out_task != 0xFF) //如果是任务等待
123 4 isr_send_signal (out_task); //发送信号
124 4 }
125 3 }
126 2 else sendactive = 0; //全部发送完,sendactive清零
127 2 }
128 1 }
129
130
131 void init_serial (void)
132 {
133 1 SCON = 0x50; //串行口方式1,8位 UART, 允许接收
134 1 TMOD = 0x20; //定时器方式2,8位自动重装
135 1 TH1 = 0xf3; //波特率2400bit/s
136 1 TR1 = 1; //启动定时器T1
137 1 ES = 1; //允许串行口中断
138 1 }
139
140
141
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 290 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 1
IDATA SIZE = 16 ----
BIT SIZE = 3 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -