📄 uart0.lst
字号:
C51 COMPILER V7.06 UART0 09/26/2008 13:35:52 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE UART0
OBJECT MODULE PLACED IN ..\OUT\Uart0.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\Source\Uart0.c BROWSE DEBUG OBJECTEXTEND PRINT(..\OUT\Uart0.lst) OBJECT(
-..\OUT\Uart0.obj)
stmt level source
1 /*
2 *****************************************************************************************************
3 *
4 * File name: uart0.c (MCU的串口0)
5 *
6 * 通讯终端: MCU <==> PC
7 * 波特率: 57600
8 *
9 * 功能:
10 * MCU的UART0操作:1:接收上位机的数据,通过AT^SISW 发送到GPRS网络,
11 * 2:通过读GPRS接收来的数据,AT^SISR,再转发给PC端
12 *
13 *
14 * NOTE: MODEM的UART0引到DB9的PIN4,PIN9,可用SSCOM与MODEM直接AT5指令交互通讯
15 *
16 *
17 *****************************************************************************************************
18 */
19 #include "..\head\includes.h"
20
21
22 unsigned char xdata TxBuf[LenTxBuf]; // 收发缓冲区实体
23 unsigned char xdata RxBuf[LenRxBuf];
24 unsigned char xdata *inRxBuf,*outRxBuf; // inRxBuf指向收的收,outRxBuf指向收缓冲区的读
25 unsigned char xdata *inTxBuf,*outTxBuf;
26 unsigned char xdata bRxFull; //标志收缓冲区是否溢出
27 unsigned char xdata bFullSend; //收缓冲区是否溢出是否已发送满命令
28 unsigned char xdata bEptSend; //收缓冲区空时是否已发空命令
29 bit TIflag=1; //Note:It must be 1.
30
31 unsigned char xdata *inRxBuf_Bak=0;
32
33
34 unsigned int xdata Rx0_Counter; //二级缓冲区接收一侦实际长度
35 unsigned char xdata Mid_Buf[MAX_FRAME_SIZE]; //二级缓冲区,用来记录一侦是否结束,结束后存入Te2NetBuf
36
37 _UART_BUF_STRUCT_ xdata Te2NetBuf[MAX_BUF_NUM]; // 终端到网络
38 unsigned char xdata FrameIn; //用来指向Te2NetBuf进入数据的标量
39 unsigned char xdata FrameOut; //用来指向Te2NetBuf取出数据的标量
40
41 _UART_BUF_STRUCT_ xdata Net2TeBuf[MAX_BUF_NUM2]; // 网络到终端
42 unsigned char xdata FrameIn2; //用来指向Net2TeBuf进入数据的标量
43 unsigned char xdata FrameOut2; //用来指向Net2TeBuf取出数据的标量
44 /*
45 *****************************************************************************************************
46 *Func: 串口中断程序
47 *Note:
48 * 1:
49 * 2:
50 *****************************************************************************************************
51 */
52 void Uart0_ISR(void) interrupt 4
53 {
54 1 unsigned char xdata *t;
C51 COMPILER V7.06 UART0 09/26/2008 13:35:52 PAGE 2
55 1
56 1 if (TI) {
57 2 TI=0;
58 2 if (inTxBuf == outTxBuf) { //TxBuf Empty
59 3 TIflag=1;
60 3 } else {
61 3 ACC = *outTxBuf;
62 3 if (ComcBit == '1') {
63 4 TB8 = ~P; // 方式3:奇校验位
64 4 } else if (ComcBit == '2'){
65 4 TB8 = P; // 方式3:偶校验位
66 4 }
67 3 SBUF=*outTxBuf;
68 3 outTxBuf++;
69 3 if (outTxBuf == TxBuf+LenTxBuf) // Begin ->end ->begin
70 3 outTxBuf = TxBuf;
71 3 }
72 2 }
73 1 if (RI) {
74 2 RI=0;
75 2 TimerMil[T_FRAME_END] = FRAME_END_TIME;
76 2 t=inRxBuf;
77 2 t++; //保留指针位置
78 2 if (t == RxBuf+LenRxBuf) {
79 3 t = RxBuf; //如果到缓冲区末尾,则返回缓冲区头
80 3 }
81 2 if (t != outRxBuf) { //如果相等,说明缓冲区满了,RxBuf Full
82 3 *inRxBuf = SBUF;
83 3 inRxBuf = t;
84 3 } else {
85 3 bEptSend = FALSE; //在满了之后,需等待发送空信号
86 3 bFullSend =FALSE;
87 3 bRxFull = TRUE; //收缓冲区满
88 3 }
89 2 }
90 1 }
91
92 /*
93 *****************************************************************************************************
94 *Func: uart相关寄存器
95 *Note: 波特率:每秒传送多少位。
96 *
97 * 1: SCON寄存器 7 6 5 4 3 2 1 0
98 * ------------------------------------------------------------------------
99 * SM0 SM1 SM2 REN TB8 RB8 TI RI
100 * ------------------------------------------------------------------------
101 * 0 0 : 方式0:
102 * 0 1 : 方式1: 8位数据位的UART工作方式
103 * REN 置1允许接收,置0禁止接收
104
105 * ------------------------------------------------------------------------
106 * 2: PCON寄存器 7 6 5 4 3 2 1 0
107 * ------------------------------------------------------------------------
108 * SMOD(置1波特率加倍速)
109 * ------------------------------------------------------------------------
110 *
111 * 3: IE寄存器 7 6 5 4 3 2 1 0
112 * ------------------------------------------------------------------------
113 * EA X X ES ET1 EX1 ET0 EX0
114 * ------------------------------------------------------------------------
115
116 *****************************************************************************************************
C51 COMPILER V7.06 UART0 09/26/2008 13:35:52 PAGE 3
117 */
118 void Uart0Init(void)
119 {
120 1 unsigned int baudrate=9600;
121 1
122 1 baudrate = vBaudRate[ConfigReg.reg.BautRateStr[0]-0x31];
123 1
124 1 TMOD=TMOD & 0x0F;
125 1 TMOD=TMOD | 0x20;
126 1 switch(baudrate) {
127 2 case 1200:
128 2 case 2400:
129 2 case 4800:
130 2 case 9600:
131 2 case 19200:
132 2 PCON &= 0x7F;
133 2 break;
134 2 case 38400:
135 2 case 57600:
136 2 baudrate /= 2;
137 2 PCON |= 0x80;
138 2 break;
139 2 default:
140 2 baudrate = 9600; //默认为9600
141 2 PCON &= 0x7F; // 9600
142 2 break;
143 2 }
144 1
145 1 TH1 = 256 - XTAL / baudrate / 32 / 12;
146 1 TL1 = TH1;
147 1 //0: NONE 1:OLD 2:EVEN
148 1 if ((ConfigReg.reg.WPCOMC[0] == '1') || (ConfigReg.reg.WPCOMC[0] == '2')) {
149 2 SCON = 0xd0; // 方式3:奇偶校验位
150 2 } else {
151 2 SCON = 0x50; // 方式1:无校验位
152 2 }
153 1
154 1 ET1 = 0;
155 1 TR1 = 1;
156 1 }
157
158 /*
159 *****************************************************************************************************
160 *Func: 串口缓冲区初始化
161 *Note:
162 * 1:
163 * 2:
164 *****************************************************************************************************
165 */
166 void Uart0BufferInit(void)
167 {
168 1 unsigned char i;
169 1
170 1 inTxBuf = TxBuf;
171 1 outTxBuf = TxBuf;
172 1 inRxBuf = RxBuf;
173 1 outRxBuf = RxBuf;
174 1
175 1 bRxFull = FALSE; //收缓冲区非满
176 1 bFullSend = FALSE;
177 1 bEptSend = TRUE;
178 1
C51 COMPILER V7.06 UART0 09/26/2008 13:35:52 PAGE 4
179 1 Rx0_Counter = 0; //一侦实际长度
180 1 TimerMil[T_FRAME_END] = 0; //一侦结束时间
181 1
182 1 for (i=0; i<MAX_BUF_NUM; i++) {
183 2 Te2NetBuf[i].statu = 0;
184 2 }
185 1 for (i=0; i<MAX_BUF_NUM2; i++) {
186 2 Net2TeBuf[i].statu = 0;
187 2 }
188 1 FrameIn2 = FrameOut2 = 0;
189 1 FrameIn = FrameOut = 0;
190 1
191 1 EA=1;
192 1 ES=1;
193 1 }
194
195
196 /*
197 *****************************************************************************************************
198 *Func: 从串口缓冲区读1字节数据,并对缓冲区状态进行检查。如果满了,则
199 发送缓冲区满信号,如果为空,则发送缓冲区为空信号。
200 *Note:
201 * 1: 为了实现接收串口的数据,对缓冲区溢出情况进行处理
202 * 2:
203 *****************************************************************************************************
204 */
205 #if 0
bit Mygetch(unsigned char xdata *ch)
{
ES = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -