首页 > 应用 > 单片机应用
[导读]
/*************功能说明**************红外接收程序。适用于市场上用量最大的HT6121/6122及其兼容IC的编码。对于用户码与User_code定义不同的遥控器,程序会将用户码一起从串口输出。使用模拟串口发送监

/*************功能说明**************

红外接收程序。适用于市场上用量最大的HT6121/6122及其兼容IC的编码。

对于用户码与User_code定义不同的遥控器,程序会将用户码一起从串口输出。

使用模拟串口发送监控显示编码,显示内容为ASCII码和中文。

本文引用地址: http://www.21ic.com/app/mcu/201806/761565.htm

本接收程序基于状态机的方式,占用CPU的时间非常少。

******************************************/


/*************用户系统配置**************/

#defineMAIN_Fosc12000000L//定义主时钟,模拟串口和红外接收会自动适应。5~36MHz

#defineD_TIMER0125//选择定时器时间,us,红外接收要求在60us~250us之间

#defineUser_code0xFD02//定义红外接收用户码


/*************以下宏定义用户请勿修改**************/
#include"reg51.H"
#defineucharunsignedchar
#defineuintunsignedint

#definefreq_base(MAIN_Fosc/1200)
#defineTimer0_Reload(65536-(D_TIMER0*freq_base/10000))




/*************本地常量声明**************/



/*************本地变量声明**************/
sbitP_TXD1=P3^1;//定义模拟串口发送脚,打印信息用
sbitP_IR_RX=P0^1;//定义红外接收输入端口

bitP_IR_RX_temp;//Lastsample
bitB_IR_Sync;//已收到同步标志
ucharIR_SampleCnt;//采样计数
ucharIR_BitCnt;//编码位数
ucharIR_UserH;//用户码(地址)高字节
ucharIR_UserL;//用户码(地址)低字节
ucharIR_data;//数据原码
ucharIR_DataShit;//数据反码

bitB_IrUserErr;//Usercodeerrorflag
bitB_IR_Press;//Keypressflag,includerepeatkey.
ucharIR_code;//IRcode红外键码


/*************本地函数声明**************/
voidTx1Send(uchardat);
ucharHEX2ASCII(uchardat);
voidInitTimer(void);
voidPrintString(unsignedcharcode*puts);



/*************外部函数和变量声明*****************/



/*********************主函数*************************/
voidmain(void)
{
InitTimer();//初始化Timer

PrintString("******STC系列MCU红外接收程序2010-12-10******rn");//上电后串口发送一条提示信息

while(1)
{
if(B_IR_Press)//有IR键按下
{
PrintString("红外码:0x");//提示红外键码
Tx1Send(HEX2ASCII(IR_code>>4));//键码高半字节
Tx1Send(HEX2ASCII(IR_code));//键码低半字节
if(B_IrUserErr)//用户码错误,则发送用户码
{
Tx1Send(’’);//发空格
Tx1Send(’’);//发空格
PrintString("用户码:0x");//提示用户码
Tx1Send(HEX2ASCII(IR_UserH>>4));//用户码高字节的高半字节
Tx1Send(HEX2ASCII(IR_UserH));//用户码高字节的低半字节
Tx1Send(HEX2ASCII(IR_UserL>>4));//用户码低字节的高半字节
Tx1Send(HEX2ASCII(IR_UserL));//用户码低字节的低半字节
}
Tx1Send(0x0d);//发回车
Tx1Send(0x0a);//发回车
B_IR_Press=0;//清除IR键按下标志
}
}
}


/*********************十六进制转ASCII函数*************************/
ucharHEX2ASCII(uchardat)
{
dat&=0x0f;
if(dat<=9)return(dat+’0’);//数字0~9
return(dat-10+’A’);//字母A~F
}




//*******************************************************************
//***********************IRRemoteModule**************************

//***********************IRRemoteModule**************************
//thisprogrammeisusedforReceiveIRRemote(HT6121).

//dataformat:Synchro,AddressH,AddressL,data,/data,(total32bit).

//sendaframe(85ms),pause23ms,sendsynchroofanotherframe,pause94ms

//datarate:108ms/Frame


//Synchro:low=9ms,high=4.5/2.25ms,low=0.5626ms
//Bit0:high=0.5626ms,low=0.5626ms
//Bit1:high=1.6879ms,low=0.5626ms
//framesPACe=23msor96ms

/********************红外采样时间宏定义,用户不要随意修改*******************/

#if((D_TIMER0<=250)&&(D_TIMER0>=60))
#defineD_IR_sampleD_TIMER0//定义采样时间,在60us~250us之间
#endif

#defineD_IR_SYNC_MAX(15000/D_IR_sample)//SYNCmaxtime
#defineD_IR_SYNC_MIN(9700/D_IR_sample)//SYNCmintime
#defineD_IR_SYNC_DIVIDE(12375/D_IR_sample)//decidedata0or1
#defineD_IR_DATA_MAX(3000/D_IR_sample)//datamaxtime
#defineD_IR_DATA_MIN(600/D_IR_sample)//datamintime
#defineD_IR_DATA_DIVIDE(1687/D_IR_sample)//decidedata0or1
#defineD_IR_BIT_NUMBER32//bitnumber

//*******************************************************************************************
//****************************IRRECEIVEMODULE********************************************

voidIR_RX_HT6121(void)
{
ucharSampleTime;

IR_SampleCnt++;//Sample+1

F0=P_IR_RX_temp;//SaveLastsamplestatus
P_IR_RX_temp=P_IR_RX;//Readcurrentstatus
if(F0&&!P_IR_RX_temp)//Lastsampleishigh,andcurrentsampleislow,soisfalledge
{
SampleTime=IR_SampleCnt;//getthesampletime
IR_SampleCnt=0;//Clearthesamplecounter

if(SampleTime>D_IR_SYNC_MAX)B_IR_Sync=0;//largetheMaximSYNCtime,thenerror
elseif(SampleTime>=D_IR_SYNC_MIN)//SYNC
{
if(SampleTime>=D_IR_SYNC_DIVIDE)
{
B_IR_Sync=1;//hasreceivedSYNC
IR_BitCnt=D_IR_BIT_NUMBER;//Loadbitnumber
}
}
elseif(B_IR_Sync)//hasreceivedSYNC
{
if(SampleTime>D_IR_DATA_MAX)B_IR_Sync=0;//datasamlpetimetolarge
else
{
IR_DataShit>>=1;//datashiftright1bit
if(SampleTime>=D_IR_DATA_DIVIDE)IR_DataShit|=0x80;//devidedata0or1
if(--IR_BitCnt==0)//bitnumberisover?
{
B_IR_Sync=0;//ClearSYNC
if(~IR_DataShit==IR_data)//判断数据正反码
{
if((IR_UserH==(User_code/256))&&
IR_UserL==(User_code%256))
B_IrUserErr=0;//Usercodeisrighe
elseB_IrUserErr=1;//usercodeiswrong

IR_code=IR_data;
B_IR_Press=1;//数据有效
}
}
elseif((IR_BitCnt&7)==0)//onebytereceive
{
IR_UserL=IR_UserH;//SavetheUsercodehighbyte
IR_UserH=IR_data;//SavetheUsercodelowbyte
IR_data=IR_DataShit;//SavetheIRdatabyte
}
}
}
}
}


/****************Timer初始化函数******************************/
voidInitTimer(void)
{
TMOD=0;//forSTC15Fxxx系列Timer0as16bitreloadtimer.
TH0=Timer0_Reload/256;
TL0=Timer0_Reload%256;
ET0=1;
TR0=1;

EA=1;
}


/**********************Timer0中断函数************************/
voidtimer0(void)interrupt1
{
IR_RX_HT6121();
}


/**********************模拟串口相关函数************************/

voidBitTime(void)//位时间函数
{
uinti;
i=((MAIN_Fosc/100)*104)/140000-1;//根据主时钟来计算位时间
while(--i);
}

//模拟串口发送
voidTx1Send(uchardat)//9600,N,8,1发送一个字节
{
uchari;
EA=0;
P_TXD1=0;
BitTime();
for(i=0;i<8;i++)
{
if(dat&1)P_TXD1=1;
elseP_TXD1=0;
dat>>=1;
BitTime();
}
P_TXD1=1;
EA=1;
BitTime();
BitTime();
}

voidPrintString(unsignedcharcode*puts)//发送一串字符串
{
for(;*puts!=0;puts++)Tx1Send(*puts);//遇到停止符0结束
}

换一批

延伸阅读

[单片机应用] avr单片机proteus仿真第四课:控制继电器

avr单片机proteus仿真第四课:控制继电器

继电器(Relay),作用是用弱电控制强电。比如,我们用avr单片控制一个220V电压的灯泡,这就必须用到继电器。本课用avr单片机来控制继电器的吸合与断开。Proteus仿真实验器件:1 atmega128一块2 button,按键一个3......

关键字:avr单片机 proteus仿真 控制继电器

[单片机应用] PIC32MX单片机外设库使用(Ⅰ)- 系统时钟及I/O口基本设置

PIC32MX单片机外设库使用(Ⅰ)- 系统时钟及I/O口基本设置

开发环境:MAPLAB X IDE v1.85编译器:MPLAB XC 321.使用说明:PIC32外设库提供用于设置和控制32位外设的函数和宏。希望使用外设库的应用程序只需在其源文件中包含一个头文件即可访问任意受支持的函数和宏。 备注:......

关键字:PIC32MX 单片机 外设库 系统时钟 基本设置

[单片机应用] 51单片机学习笔记:定时器产生PWM可调方波,控制led灯亮度

51单片机学习笔记:定时器产生PWM可调方波,控制led灯亮度

使用定时器T0产生PWM方波,用按键调整占空比,20级可调控制led灯的亮度等级.C代码#include"my51.h"#include"timer0.h"#definegrading20//亮度20......

关键字:51单片机 定时器 PWM 可调方波 led灯亮度

[单片机应用] 单片机 Modbus 多机通信程序设计

单片机 Modbus 多机通信程序设计

给从机下发不同的指令,从机去执行不同的操作,这个就是判断一下功能码即可,和我们前边学的实用串口例程是类似的。多机通信,无非就是添加了一个设备地址判断而已,难度也不大。我们找了一个 Modbus 调试精灵,通过......

关键字:单片机 Modbus 多机通信

[单片机应用] STC单片机掉电断电失电瞬间EEPROM数据保存处理办法

STC单片机掉电断电失电瞬间EEPROM数据保存处理办法

  由于客户在请人设计开发一设备,但是设备用户处总停电,造成设备及其周边耗材损耗严重,因此请我司在现有STC为主要芯片的基础上做掉电瞬间EEPROM里的20个参数保存,上电后通过读取EEPROM中的参数回到掉电的状态,......

关键字:STC单片机 掉电断电 失电瞬间 EEPROM 数据保存

[单片机应用] 51单片机(STC89C52RC)小综合实验

51单片机(STC89C52RC)小综合实验

  这个实验包含以下几个内容:51单片机最小系统单片机外接继电器整流桥的使用lm393电压比较器的使用  首先先上实验结果图:前面两个继电器,中间是最小系统,最下脚是整流器和lm393电压比较器.好,下面来说这个板子制......

关键字:51单片机 STC89C52RC 小综合实验

[单片机应用] 单片机与PC之间串行通信实验 仿真及程序

单片机与PC之间串行通信实验 仿真及程序

单片机与PC之间串行通信实验作业 包括DSN .C .HEX文件源程序:#include sbit button=P3^5; void init_tx() {TMOD=0x20; TH1=0xfd; TL1=0xfd; ......

关键字:单片机 PC 串行通信

[单片机应用] STM32单片机闪存存储器里存储的是哪些内容

STM32单片机闪存存储器里存储的是哪些内容

先看rom也就是flash(0x0800 0000-0x0807 ffff)512k,这个空间就是用户存放程序的地方,用户以后自己写boot loader的时候,也是存放在这个空间里的,system memory这个空间是2k大小,是st公......

关键字:STM32 单片机 闪存存储器

[汽车电子] 特斯拉Model 3依然难产,股价应声下跌

特斯拉Model 3依然难产,股价应声下跌

特斯拉四季度Model 3电动车交付1550辆,预期交付2917辆。四季度总产量2.4565万辆,其中Model 3产出2425辆。此外,特斯拉希望第二季度末之前达到每周生产5000辆的里程碑。去年,特斯拉已经将达到该产量的目标时间点从去年......

关键字:特斯拉 电动车 利润率

[消费类电子新闻] 保罗·艾伦去世:他是微软的乔布斯,微软帝国缔造者

保罗·艾伦去世:他是微软的乔布斯,微软帝国缔造者

保罗·艾伦去世,让科技界陷入悲伤之中,说到微软,大家可能想到的是比尔盖茨,但如果没有保罗·艾伦,可能就不会有今天的微软帝国。 ......

关键字:保罗·艾伦 微软

我 要 评 论

网友评论

芯闻号

技术子站

更多

项目外包

更多

推荐博客