📄 hongwai_receiver.c
字号:
//只接收数据和起始码 ,简化协议编程 ,中断1设为下降沿触发,接收到中断后启动定时器
//计算低电平的维持时间,得到正确的接收码则发光二极管亮
//发送数据时先发射最低位
#define uchar unsigned char
int hongwai_receiver[9]={0,0,0,0,0,0,0,0,0}; //存放载波周期数
uchar hongwai_re_cishu=0; //
int hongwai_shuju=0; //载波周期的个数
uchar hongw_receive=0; //存放接收到的数据
bit hongwai_re_enable=0; //允许计算低电平的维持时间
bit hongwai_dis_enable=0; //允许显示接收倒的数据
sbit hongwai_get=P3^3; //用于读端口操作
void hongwai_control(); //对接受的数据进行识别处理
void hongwai_Delay(int j) //延时函数
{
int m;
for(m=0;m<j;m++)
{
int i;
for(i=0; i<300; i++){;} //约1ms
}
}
void waibu_int(void) interrupt 2
{
EX1=0;
hongwai_re_enable=1;
TR0 = 1; //有红外数据来才开计数器
}
void hongwai_ini(void)
{
IT1 = 1; //设外部中断1 为下降沿触发
EX1=1;
ET0 = 1; //定时器0中断允许
EA = 1; //允许CPU中断
TMOD =TMOD& 0xf1; //设定时器0和1为16位模式1
TH0 = 0xff;
TL0 = 0xe6; //设定时值0的装入值,输出脉冲频率为38K,即26us中断一次
//计数器对数字温度计影响较大,开始时不要打开
}
void timeint(void) interrupt 1 //定时器0中断处理
{
TH0=0xff;
TL0=0xe6; //26us中断一次,再重装数据
if(hongwai_re_enable==1)
{
if(hongwai_get==0)
{
hongwai_shuju++; //计算0电平维持的时间
}
else
{
EX1=1;
hongwai_re_enable=0;
hongwai_receiver[hongwai_re_cishu]=hongwai_shuju;
hongwai_shuju=0;
hongwai_re_cishu++;
}
if(hongwai_re_cishu==9) //接收完成
{
hongwai_re_cishu=0;
hongwai_dis_enable=1; //允许显示接收的数据
}
}
}
void hongwai_control() //发送数据时先发射最低位
{
int i;
if(hongwai_dis_enable==1) //
{
if(300<hongwai_receiver[0]<360) //检测起始码是否正确300
{
for(i=1;i<9;i++)
{
hongw_receive>>=1; //数据you移
if((hongwai_receiver[i]<80)&&(hongwai_receiver[i]>40)) //是否为高电平
{ hongw_receive|=0x80; }
}
}
hongwai_dis_enable=0; //
TR0 = 0;
switch ( hongw_receive ) //为空格键时,键值与显示字符的对应关系
{
case 0x38:
time_daoji_enable=~time_daoji_enable; //键盘a键,控制倒计时开/关
break;
case 0x64:
time_naoling_enable=~time_naoling_enable; //键盘b,控制闹铃开/关
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -