📄 uart.lst
字号:
C51 COMPILER V8.16 UART 10/10/2009 14:43:32 PAGE 1
C51 COMPILER V8.16, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN uart.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE uart.c LARGE WARNINGLEVEL(1) BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "system.h"
2
3 volatile unsigned char UartSendBuffer[OutLEN]; //发送缓冲
4 volatile unsigned char UartReceiveBuffer[InLEN]; //接收数据缓冲
5 volatile unsigned char *outlast=UartSendBuffer; //最后由中断传输出去的字节位置
6 volatile unsigned char *putlast=UartSendBuffer; //最后放入发送缓冲区的字节位置
7 volatile unsigned char UartSendBufferemptyFlag=1; //缓冲区数据发完标志 发完=1
8 volatile unsigned char UartSendBufferHaveDataFlag=0; //发送缓冲区非空标志 有=1
9
10 volatile unsigned char UartReceiveCounter=0; //接收计数器
11 volatile unsigned char UartRxTimerStartFlag=0; //接收超时计数器启动标志
12 volatile unsigned char UartWaitForCounter=0; //接收超时计数器
13 volatile unsigned char UartDataReadyFlag=0; //接收完成标志
14
15 //=======================================================================================================
16 // 函数名称: UartInit
17 //
18 // 功能描述:串口初始化
19 //
20 // 输 入: void
21 //
22 // 输 出: void
23 //
24 // 全局变量: UartReceiveCounter ; UartRxTimerStartFlag
25 // 调用模块: 无
26 //
27 // 作 者: 卢明君
28 // 日 期: 2009年9月15日
29 // 备 注:
30 //-------------------------------------------------------------------------------------------------------
31 // 修改人:
32 // 日 期:
33 // 备 注:
34 //-------------------------------------------------------------------------------------------------------
35 //=======================================================================================================
36 /*
37 void UartInit(void)
38 {
39 SCON = 0x50;
40 //PCON |= 0x80;
41 //AUXR2|= 0x40;
42 //Timer1Init();
43 TR1=0; //停止定时器
44 // TCON=0x00; //定时器控制寄存器 注意:TCON只需操作一次
45 TMOD |= 0x20; //定时器1
46 TL1 = -(SYSCLK/12/32/baud);//0xfa; // -(SYSCLK/12/32/baud); //注意波特率加倍位
47 TH1 = TL1;
48 TR1=1; //启动定时器1
49 // ET1=1; //打开定时器1中断
50 UartReceiveCounter=0;
51 UartRxTimerStartFlag=0;
52 }
53 */
54 //=======================================================================================================
55 // 函数名称: UartSendchar
C51 COMPILER V8.16 UART 10/10/2009 14:43:32 PAGE 2
56 //
57 // 功能描述:放入一个字节到发送缓冲区
58 //
59 // 输 入: unsigned char ucdata
60 //
61 // 输 出: void
62 //
63 // 全局变量: outlast ; putlast ; UartSendBuffer[] ; UartSendBufferHaveDataFlag ; UartSendBufferemptyFlag
64 // 调用模块: 无
65 //
66 // 作 者: 卢明君
67 // 日 期: 2009年9月15日
68 // 备 注:
69 //-------------------------------------------------------------------------------------------------------
70 // 修改人:
71 // 日 期:
72 // 备 注:
73 //-------------------------------------------------------------------------------------------------------
74 //=======================================================================================================
75 void UartSendchar(unsigned char ucdata)
76 {
77 1 ES=0; // 暂停串行中断,以免数据比较时出错
78 1 while((((outlast-putlast)==2)&&(outlast > putlast ))||((outlast < putlast)&&(OutLEN-(putlast-outlast)==2)
-))
79 1 {
80 2 ES=1;
81 2 ucdata++;
82 2 ucdata--;
83 2 ES=0;
84 2 }
85 1 *putlast=ucdata; // 放字节进入缓冲区
86 1 putlast++; // 发送缓冲区指针加1
87 1 if (putlast==UartSendBuffer+OutLEN) putlast=UartSendBuffer; // 指针到了顶部换到底部
88 1 UartSendBufferHaveDataFlag=1;
89 1 if (UartSendBufferemptyFlag) // 缓冲区无数据
90 1 {
91 2 UartSendBufferemptyFlag =0;
92 2 SBUF=*outlast; // 未发送完继续发送
93 2 outlast++; // 最后传出去的字节位置加1
94 2 if (outlast==UartSendBuffer+OutLEN)outlast=UartSendBuffer; // 地址到顶部回到底部
95 2 if (putlast==outlast)UartSendBufferHaveDataFlag=0; // 数据发送完置发送缓冲区空标志
96 2 } // 缓冲区开始为空,置为有,启动发送
97 1 ES=1;
98 1 }
99 //=======================================================================================================
100 // 函数名称: UartSendString
101 //
102 // 功能描述:发送字符串
103 //
104 // 输 入: unsigned char *str
105 //
106 // 输 出: void
107 //
108 // 全局变量:
109 // 调用模块: UartSendchar
110 //
111 // 作 者: 卢明君
112 // 日 期: 2009年9月15日
113 // 备 注:
114 //-------------------------------------------------------------------------------------------------------
115 // 修改人:
116 // 日 期:
C51 COMPILER V8.16 UART 10/10/2009 14:43:32 PAGE 3
117 // 备 注:
118 //-------------------------------------------------------------------------------------------------------
119 //=======================================================================================================
120 void UartSendString(unsigned char *str)
121 {
122 1 while(*str) // 遇到停止符0结束
123 1 {
124 2 UartSendchar(*str++);
125 2 //while(UartSendBufferHaveDataFlag);
126 2 }
127 1 }
128 //=======================================================================================================
129 // 函数名称: UartSendByte
130 //
131 // 功能描述:发送一串数据
132 //
133 // 输 入: unsigned char *Startaddr,unsigned char SendByte
134 //
135 // 输 出: void
136 //
137 // 全局变量:
138 // 调用模块: UartSendchar
139 //
140 // 作 者: 卢明君
141 // 日 期: 2009年9月15日
142 // 备 注:
143 //-------------------------------------------------------------------------------------------------------
144 // 修改人:
145 // 日 期:
146 // 备 注:
147 //-------------------------------------------------------------------------------------------------------
148 //=======================================================================================================
149 void UartSendByte(unsigned char *Startaddr,unsigned char SendByte)
150 {
151 1 while(SendByte--)
152 1 {
153 2 UartSendchar(*Startaddr++);
154 2 }
155 1 }
156
157 void Uart(void) interrupt 4 using 2
158 {
159 1 if(TI)
160 1 {
161 2 TI=0;
162 2 if (UartSendBufferHaveDataFlag)
163 2 {
164 3 SBUF=*outlast; // 未发送完继续发送
165 3 outlast++; // 最后传出去的字节位置加1
166 3 if (outlast==UartSendBuffer+OutLEN)outlast=UartSendBuffer; // 地址到顶部回到底部
167 3 if (putlast==outlast)UartSendBufferHaveDataFlag=0; // 数据发送完置发送缓冲区空标志
168 3 }
169 2 else UartSendBufferemptyFlag =1;
170 2 }
171 1 if(RI)
172 1 {
173 2 RI = 0;
174 2 //==========================================================
175 2 // 若有必要 有待于加入 偶校验算法 .数据位的bit7位为校验位
176 2 //==========================================================
177 2 UartReceiveBuffer[UartReceiveCounter++]=SBUF&0x7f;
178 2 UartRxTimerStartFlag=1; // 启动超时计数器
C51 COMPILER V8.16 UART 10/10/2009 14:43:32 PAGE 4
179 2 UartWaitForCounter=0; // 清超时计数器 // 10ms
180 2 if (UartReceiveCounter>=InLEN)
181 2 {
182 3 UartDataReadyFlag=1;
183 3 //UartReceiveCounter=0;
184 3 REN=0;
185 3 }
186 2 }
187 1 }
188
189
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 674 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 184 7
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -