/***************************************************************
* 文件名:DP_51PRO_IRDA.C
* 功能:DP_51PRO实验仪红外收发实验。使用串口发送数据经调制后从红外管输出,
* 并通过红外接收模块把接收到的数据返回串口接收端,通过判断接收到的数
* 据来控制LED灯点亮。
***************************************************************/
#include <Reg52.H>
#define uint8 unsigned char
#define uint16 unsigned int
sbit LED_CON = P1^0; // 定义LED控制口
/***************************************************************
* 名称:UART_SendByte()
* 功能:向串口发送一字节数据。
* 入口参数:dat 要发送的数据
* 出口参数:无
***************************************************************/
void UART_SendByte(uint8 dat)
{ SBUF = dat; // 发送数据
while(0==TI); // 等待发送完毕
TI = 0; // 清零TI标志
}
/***************************************************************
* 名称:UART_RcvByte()
* 功能:接收一字节串口数据。
* 入口参数:dat 接收变量的地址指针
* 出口参数:返回0表示没有数据,返回1表示接收到数据
***************************************************************/
uint8 UART_RcvByte(uint8 *dat)
{ if(0==RI) return(0); // 若没有接收到数据则返回0
*dat = SBUF; // 取得接收的数据
RI = 0; // 清除RI标志
return(1);
}
/***************************************************************
* 名称:UART_Init()
* 功能:串口初始化。模式为1位起始位,8位数据位,1位停止位,波特率为9600。
* 入口参数:无
* 出口参数:无
* 说明:晶振为11.0592MHz,使用T1作为波特率发生器。
***************************************************************/
void UART_Init(void)
{ SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFa;
TR1 = 1;
}
/***************************************************************
* 名称:main()
* 功能:主函数,初始化串口后不断的发送及接收数据,若接收到所发送的数据则
* 点亮LED。
***************************************************************/
int main(void)
{ uint8 i;
uint16 j;
uint8 rcv_dat;
uint8 count;
UART_Init();
while(1)
{ count = 0; // 计数变量清零
for(i=0; i<50; i++) // 发送及接收50个数据
{ UART_SendByte(0x5A);
if( UART_RcvByte(&rcv_dat)!=0 )
{ if(0x5A==rcv_dat) count++; // 若接收的数据为0x5A,则计数变量加1
}
}
if(count>30) LED_CON = 0; // 若接收到0x5A的个数大于40个时,点亮LED
else LED_CON = 1; // 否则熄灭LED
for(j=0; j<500; j++);
}
return(0);
}