📄 serial_communication.lst
字号:
C51 COMPILER V8.08 SERIAL_COMMUNICATION 09/04/2008 10:42:41 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 <stdio.h>
3 #include <rtx51tny.h>
4
5 #define uchar unsigned char //宏定义
6
7 #define OUTBUF_LEN 8 //串行口发送缓冲区的长度
8 #define INBUF_LEN 8 //串行口接收缓冲区的长度
9
10 #define CTRL_Q 0x11
11 #define CTRL_S 0x13
12
13 bit Full; //发送缓冲区满标志位
14 bit Active; //发送激活标志位
15 bit Stop; //发送停止标志位
16
17 uchar bufout_start; //串行口发送缓冲区的起点
18 uchar bufout_end; //串行口发送缓冲区的终点
19 idata char outbuf[OUTBUF_LEN]; //串行口发送缓冲区
20 uchar out_task = 0xff; //串行口输出任务的任务号
21
22 uchar bufin_start; //串行口接收缓冲区的起点
23 uchar bufin_end; //串行口接收缓冲区的终点
24 idata char inbuf[INBUF_LEN]; //串行口接收缓冲区
25 uchar in_task = 0xff; //串行口输入任务的任务号
26
27
28 void putbuf (char c)
29 {
30 1 if (!Full) //判断发送缓冲区满标志位
31 1 {
32 2 if (!Active && !Stop) //缓冲区未满,发送器未处于活动态
33 2 {
34 3 Active = 1;
35 3 SBUF = c; //直接发送第一个字符到SBUF,并启动发送
36 3 }
37 2 else
38 2 {
39 3 outbuf[bufout_end++ & (OUTBUF_LEN-1)] = c; //向定义的发送缓冲区传送字符
40 3 if (((bufout_end ^ bufout_start) & (OUTBUF_LEN-1)) == 0)
41 3 Full = 1; //缓冲区满标志置位
42 3 }
43 2 }
44 1 }
45
46
47
48 char putchar (char c)
49 {
50 1 if (c == '\n') //扩展一行新字符
51 1 {
52 2 while (Full) //如果发送缓冲区满,则等待
53 2 {
54 3 out_task = os_running_task_id (); //置位输出任务号
55 3 os_wait (K_SIG, 0, 0); //等待信号
C51 COMPILER V8.08 SERIAL_COMMUNICATION 09/04/2008 10:42:41 PAGE 2
56 3 out_task = 0xff; //输出任务号清零
57 3 }
58 2 putbuf (0x0D); //在LF换行符之前发送CR回车符
59 2 }
60 1 while (Full) //如果发送缓冲区满,则等待
61 1 {
62 2 out_task = os_running_task_id (); //置位输出任务号
63 2 os_wait (K_SIG, 0, 0); //等待信号
64 2 out_task = 0xff; //输出任务号清零
65 2 }
66 1 putbuf (c); //发送字符
67 1 return c; //返回字符
68 1 }
69
70
71 char _getkey (void)
72 {
73 1 char crt;
74 1 while (bufin_end == bufin_start) //等待
75 1 {
76 2 in_task = os_running_task_id (); //置位输入任务号
77 2 os_wait (K_SIG, 0, 0); //等待信号
78 2 in_task = 0xff; //输入任务号清零
79 2 }
80 1 crt=inbuf[bufin_start++ & (INBUF_LEN-1)];
81 1 return crt; //返回值
82 1 }
83
84
85
86 void serial () interrupt 4 using 2 //中断响应函数
87 {
88 1 unsigned char c;
89 1 bit start_trans = 0;
90 1
91 1 if (RI) //RI置1,接收中断
92 1 {
93 2 c = SBUF; //读SBUF
94 2 RI = 0; //中断请求标志RI清零
95 2
96 2 switch (c) //字符处理
97 2 {
98 3 case CTRL_S: //如果是CTRL_S
99 3 Stop = 1; //置位Stop,停止发送
100 3 break;
101 3
102 3 case CTRL_Q: //如果是CTRL_Q
103 3 start_trans = Stop; //开始发送
104 3 Stop = 0;
105 3 break;
106 3
107 3 default: //对于其它字符,则读入输入缓冲区
108 3 if (bufin_start + INBUF_LEN != bufin_end)
109 3 {
110 4 inbuf[bufin_end++ & (INBUF_LEN-1)] = c;
111 4 }
112 3
113 3 if (in_task != 0xFF) //如果是任务等待
114 3 isr_send_signal (in_task); //发送信号
115 3 break;
116 3 }
117 2 }
C51 COMPILER V8.08 SERIAL_COMMUNICATION 09/04/2008 10:42:41 PAGE 3
118 1
119 1 if (TI || start_trans) //TI置位,发送中断
120 1 {
121 2 TI = 0; //中断请求标志TI清零
122 2 if (bufout_start != bufout_end) //如果输入缓冲区接收到字符
123 2 {
124 3 if (!Stop)
125 3 { //发送字符
126 4 SBUF = outbuf[bufout_start++ & (OUTBUF_LEN-1)];
127 4 Full = 0; // Full 标志清零
128 4
129 4 if (out_task != 0xFF) //如果是任务等待
130 4 isr_send_signal (out_task); //发送信号
131 4 }
132 3 }
133 2 else Active = 0; //全部发送完,Active清零
134 2 }
135 1 }
136
137 void init_serial (void)
138 {
139 1 SCON = 0x50; //设置串行口: 方式 1, 8位UART, 允许接收
140 1 TMOD |= 0x20; //设置定时器T1, 方式 2, 8位自动重装
141 1 PCON =0x80; //设置SMOD=1
142 1 TL1 =0xF4; //波特率4800bit/s,初值
143 1 TH1 =0xF4;
144 1 TR1 = 1; //启动定时器T1
145 1 ES = 1; //允许串行口中断
146 1 TI =1;
147 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 298 ----
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 + -