📄 main.c
字号:
/*
Main.C
红外收发实验
*/
#include <reg51.h>
sbit LED = P0^0; //定义指示灯,收到正确数据后点亮
sbit CLK = P3^4; //定义红外管时钟信号,产生38kHz方波
//参数配置
#define MCLK 11059200L //定义CPU主频(Hz)
#define BAUD_RATE 2400L //设置波特率
volatile bit _TI_; //定义发送辅助标志
volatile unsigned char cnt; //定义接收计数器
/*
函数:UartINTSVC()
功能:T0定时中断服务程序
*/
void T0INTSVC() interrupt 1
{
CLK = !CLK;
}
/*
函数:UartINTSVC()
功能:串行口中断服务程序
*/
void UartINTSVC() interrupt 4
{
unsigned char c;
if ( RI ) //接收中断
{
c = SBUF;
RI = 0;
if ( c == 0x5A ) cnt++;
}
if ( TI ) //发送中断
{
TI = 0;
_TI_ = 1;
}
}
/*
函数:UartInit()
功能:串行口初始化
*/
void UartInit()
{
EA = 0;
TR1 = 0;
RXD = 1;
TXD = 1;
_TI_ = 1;
SCON = 0x50; //串口方式1(8位Uart),允许接收
PCON |= 0x80; //波特率加倍
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 256 - ( MCLK / 12 ) / ( 16 * BAUD_RATE );
TL1 = TH1; //设置波特率
TR1 = 1;
ES = 1; //使能串行口中断
EA = 1; //使能总中断
}
/*
函数:UartSendChar()
功能:通过串行口发送单个字节
参数:
c:被发送的字节数据,取值0x00~0xFF
*/
void UartSendChar(char c)
{
while ( !_TI_ );
_TI_ = 0;
SBUF = c;
}
/*
函数:Delay()
功能:延时(t*0.1)ms
*/
void Delay(unsigned char t)
{
unsigned char n;
do
{
n = 49;
while ( --n != 0 );
} while ( --t != 0 );
}
/*
函数:SysInit()
功能:系统初始化
*/
void SysInit()
{
TMOD &= 0xF0;
TMOD |= 0x02; //设置T0为8位定时器,自动重装
TH0 = 256 - ((MCLK / 12) / 38000L) / 2;
TL0 = TH0; //设置T0初值,对应38kHz
PT0 = 1; //设置T0中断为高级优先级
ET0 = 1; //使能T0中断
EA = 1; //使能总中断
TR0 = 1; //启动定时器T0
UartInit(); //串行口初始化
}
void main()
{
unsigned char i;
SysInit();
for (;;)
{
cnt = 0; //接收计数器清0
for ( i=0; i<10; i++) //发送10次0x5A
{
UartSendChar(0x5A);
Delay(10);
}
if ( cnt > 5 ) //如果收到一半以上的0x5A
{
LED = 0; //点亮LED
}
else
{
LED = 1; //否则熄灭LED
}
Delay(100);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -