📄 uart.lst
字号:
C51 COMPILER V7.09 UART 11/29/2005 14:09:25 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN uart.OBJ
COMPILER INVOKED BY: c:\Keil\C51\BIN\C51.EXE uart.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /************************************************************************************************
2 **文件名: uart.c
3 **Copyright(c) 2005-2006中太视讯技术有限公司
4 **创建人:金雨和
5 **日 期:2005/09/21 16:10:20
6 **描述:
7 ** 单片机(C51)红外接收程序
8 ** 对应红外发送芯片为:HT6222
9 ** 单片机芯片为philips P89LPC935
10 **
11 **修改人:金雨和
12 **修改记录:
13 ** Revision 1.0 创建 2005/09/21 16:10:20
14 **
15 *************************************************************************************************/
16 #include <Reg935.h>
17 #include "uart.h"
18 #include "string.h"
19
20 /**********************************************************************
21 * 文件: UART_IR_Master.C
22 * 开发: WWW.ZLGMCU.COM
23 * 日期: 2004.03.04
24 * 功能: 利用LPC900系列单片机的UART和CCU模块实现红外通信。
25 * 此程序为主机程序,先发送16字节数据给从机,从机再把接收到的
26 * 数据返回给主机,如果返回正确,则蜂鸣器短响一声,否则长响一声。
27 ************************************************************************/
28
29 #define PLEEN PLLEN
30
31 // 变量定义
32 sbit BEEP=P2^7;
33 sbit KEY1=P0^0;
34
35 const uchar data BRGR1_DATA=9; //波特率设为2400bit/s
36 const uchar data BRGR0_DATA=0xb4;
37
38 //主程序开始
39 void main()
40 {
41 1 uchar sndBuf[16];
42 1 // uchar RcvBuf[16]; //接收数据用缓冲区
43 1 // P0M1=P0M2=0;
44 1 // P1M1=P1M2=0; //P0,P1口设置为准双向
45 1 P1M1 &= 0xfc;
46 1 P1M2 &= 0xfc;
47 1 //P2M1=P2M2=0xc0; //P2.6,P2.7设置为开漏
48 1 // CCU_Init(); //CCU模块初始化,用以产生38KHz调制信号
49 1 UART_Init();
50 1 // IICInit();
51 1 memset(sndBuf, 0, 16);
52 1 memcpy(sndBuf, "1234567890abcdef",16);
53 1
54 1 while(1)
55 1 {
C51 COMPILER V7.09 UART 11/29/2005 14:09:25 PAGE 2
56 2 //while(KEY1);
57 2 //Delay(10);
58 2 #if 0
RcvData(sndBuf);//RcvBuf); //接收16字节数据
if(sndBuf[0] == 0x0D)
SendData("\r\n",2);
else if(sndBuf[0] == 0x0A)
SendData("\r\n",2);
else if(sndBuf[0] == 0x08)
{
sndBuf[0]=0x08;
sndBuf[1]=' ';
sndBuf[2]=0x08;
SendData(sndBuf,3);
}
else
SendData(sndBuf,1);//16); //发送16字节数据
#endif
75 2 Delay(10);
76 2 }
77 1 }
78
79 /*********************************************
80 * 名称: SendData()
81 * 功能: 通过UART连续发送16字节数据(0~15)
82 * 入口参数:无
83 * 出口参数:无
84 * 注意: 此程序采用查询方式发送。
85 **********************************************/
86 void SendData(uchar *pbuf, uchar len)
87 {
88 1 uchar i;
89 1 TI=0;
90 1 for(i=0; i<len; i++)
91 1 {
92 2 SBUF=pbuf[i];
93 2 while(!TI);
94 2 TI=0;
95 2 }
96 1 }
97
98 /********************************************************************
99 * 名称: RcvData()
100 * 功能: 通过UART连续接收16字节数据
101 * 入口参数: pbuf--用于接收数据的缓冲区首地址
102 * 出口参数: 接收到的16字节数据位于接收缓冲区
103 * 注意: 此程序采用查询方式进行接收。由于采取半双工通信,所以接收
104 * 数据之前要打开接收允许,接收完毕之后要关闭接收允许。
105 *********************************************************************/
106 void RcvData(uchar *pbuf)
107 {
108 1 uchar i=0;
109 1 REN=1;
110 1 FE=0;
111 1 RI=0;
112 1 //for(i=0;i<16;i++)
113 1 {
114 2 while(!RI);
115 2 RI=0;
116 2 pbuf[i]=SBUF;
117 2 }
C51 COMPILER V7.09 UART 11/29/2005 14:09:25 PAGE 3
118 1 REN=0;
119 1 }
120
121
122 /*********************************************************************
123 * 名称: CCU_Inti()
124 * 功能: CCU模块初始化,使OCA(P2.7)输出38KHz,50%占空比的PWM波,
125 * 作为红外线的载波
126 * 使用6MHz晶振时,CCU频率=((6000000/2)/6)*32=16MHz
127 * 定时器重装值=CCU频率/红外线载频=16000000/38000=421=0x1a5
128 **********************************************************************/
129 void CCU_Init()
130 {
131 1 //TOR2H=0x01; //定时器重装值
132 1 //TOR2L=0xa5;
133 1 //OCRAH=0x00; //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
134 1 //OCRAL=0xd2;
135 1
136 1 TOR2H=0x03; //定时器重装值
137 1 TOR2L=0x4a;
138 1 OCRAH=0x01; //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
139 1 OCRAL=0xa5;
140 1 TCR21=0x85; //PLL预分频为5+1
141 1 CCCRA=1; //非反相的PWM,
142 1
143 1 TCR20=0;
144 1 PLEEN=1;
145 1 while(!PLEEN);
146 1 TCR20|=3; //启动定时器,非对称PWM模式
147 1 }
148
149 /***************************************
150 * 名称: UART_Init()
151 * 功能: UART初始化,波特率2400bit/s
152 ****************************************/
153 void UART_Init()
154 {
155 1 //PCON=0;
156 1 //SSTAT=0; //双缓冲禁止,中断禁止,采用查询方式发送和接收
157 1 SSTAT=0xE0; //选择独立的Tx/Rx中断
158 1 SCON=0x50; //串口模式1,接收禁止
159 1 //PCON|=0x40; //SMOD0=1,SCON的位7作为FE
160 1 BRGCON=0;
161 1 BRGR1=0x02;//0x04;//BRGR1_DATA;
162 1 BRGR0=0xf0;//0xd2;//BRGR0_DATA;
163 1 BRGCON=3; //启动UART的波特率发生器
164 1
165 1 ESR=1; //ESR=Enable Serial Recieve
166 1 // EST=1; //EST=Enable Serial Transmit
167 1 EA=1; //使能中断
168 1 }
169
170 /*****************************************************
171 * 名称: Delay()
172 * 功能: 延时0.1*k秒(振荡器为6MHz)
173 * 入口参数:k--延时时间
174 * 出口参数:无
175 * 注意: 如果入口参数k等于0,则不延时而直接返回。
176 ******************************************************/
177 void Delay(uchar k)
178 {
179 1 uchar i,j;
C51 COMPILER V7.09 UART 11/29/2005 14:09:25 PAGE 4
180 1 if(k==0)
181 1 {
182 2 return;
183 2 }
184 1 for(;k;k--)
185 1 {
186 2 for(j=200;j;j--) //延时0.1S
187 2 {
188 3 for(i=250;i;i--)
189 3 {
190 4 //nop();
191 4 //nop();
192 4 //nop();
193 4 ;//nop();
194 4 }
195 3 }
196 2 }
197 1 }
198
199
200 //--------------------------------
201 void Rcv_ISR() interrupt 4
202 {
203 1 uchar temp;
204 1 uchar sndBuf[10];
205 1 //;当接收完一个字节RI置1进入Recieve中断
206 1 EA=0;
207 1 // while(!RI) //等待接收完时RI置位
208 1 temp=SBUF; //保存所读取的数据
209 1 RI=0; //RI清0以等待下次发送
210 1
211 1 #if 0
SBUF=temp; //发送数据
while(!TI); //当TI为1时发送完毕
TI=0; //TI清0准备发送
#endif
216 1
217 1 #if 1
218 1 if(temp == 0x0D)
219 1 SendData("\r\n",2);
220 1 else if(temp == 0x0A)
221 1 SendData("\r\n",2);
222 1 else if(temp == 0x08)
223 1 {
224 2 sndBuf[0]=0x08;
225 2 sndBuf[1]=' ';
226 2 sndBuf[2]=0x08;
227 2 SendData(sndBuf,3);
228 2 }
229 1 else
230 1 SendData(&temp,1);//16); //发送16字节数据
231 1 #endif
232 1 EA=1;
233 1 }
234 //--------------------------------
235 //在有的时候会出现仅发送一次然后程序卡死这种现象但是如果把程序中
236 //指令的流程稍微修改一下把TI=0移到 while(!TI)的后面程序可连续接收发送 SBUF=temp;
237 //发送数据 while(!TI); //当TI为1时发送完毕 TI=0; //TI清0准备下一次发送
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 297 ----
C51 COMPILER V7.09 UART 11/29/2005 14:09:25 PAGE 5
CONSTANT SIZE = 20 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 30
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 + -