红外发射程序实例.docx
- 文档编号:5709087
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:24
- 大小:20.47KB
红外发射程序实例.docx
《红外发射程序实例.docx》由会员分享,可在线阅读,更多相关《红外发射程序实例.docx(24页珍藏版)》请在冰豆网上搜索。
红外发射程序实例
红外发射实例一:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitIR_OUT=P1^0;
voiddelay_ms(uintms)
{
uinti,j;
for(i=0;i<120;i++)
{
for(j=0;j } } //T113us产生一次中断用于产生38K载波 //T0方式116位用于定时 voidInit_Timer(void) { TMOD=0x21;//T0mode1T1mode2 TH1=256-(1000*11.0592/38.0/12)/2+0.5; //特殊 TL1=TH1; ET1=1; EA=1; } //发送引导码发送方: 4.5ms高电平4.5ms低电平 voidSend_Start_Bit(void)//TR1的值=发送的电平 { //4.5ms1 TH0=(65536-8295)/256; TL0=(65536-8295)%256; TR0=1; TR1=1; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; //4.5ms0 TH0=(65536-4146)/256; TL0=(65536-4146)%256; TR0=1; TR1=0; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; } //发送0 voidSend_Bit_0(void) { //0.565ms1 TH0=(65536-521)/256; TL0=(65536-521)%256; TR0=1; TR1=1; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; //0.565ms0 TH0=(65536-521)/256; TL0=(65536-521)%256; TR0=1; TR1=0; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; } //发送1 voidSend_Bit_1(void) { //0.565ms1 TH0=(65536-521)/256; TL0=(65536-521)%256; TR0=1; TR1=1; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; //1.685ms0 TH0=(65536-1563)/256; TL0=(65536-1563)%256; TR0=1; TR1=0; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; } voidSend_over(void)//发送一个结束码,因为最后一个位只有遇到下降沿才能读取(发射端的上升沿) { //0.500ms1//小于0.5ms接收端很难识别到 TH0=(65536-500)/256; TL0=(65536-500)%256; TR0=1; TR1=1; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; //0.500ms0 TH0=(65536-500)/256; TL0=(65536-500)%256; TR0=1; TR1=0; while(! TF0); TR1=0; TF0=0; TR0=0; IR_OUT=0; } //发送一字节8位 voidSend_Char() { unsignedchari,j1,j2,j3,j4; j1=0xBE; j2=0x41; j3=0xDE; j4=0x20; Send_Start_Bit(); Send_Bit_0(); //发射引导吗 for(i=0;i<8;i++) { if(j1&0x80) Send_Bit_0(); else Send_Bit_1(); j1=j1<<1; //先发射低位 } for(i=0;i<8;i++) { if(j2&0x80) Send_Bit_0(); else Send_Bit_1(); j2=j2<<1; //先发射低位 } for(i=0;i<8;i++) { if(j3&0x80) Send_Bit_0(); else Send_Bit_1(); j3=j3<<1; //先发射低位 } for(i=0;i<8;i++) { if(j4&0x80) Send_Bit_0(); else Send_Bit_1(); j4=j4<<1; //先发射低位 } Send_over(); //结束符 } /*voidDelay10ms(void) { TH0=(65536-10000)/256; TL0=(65536-10000)%256; TR0=1; while(! TF0); TF0=0; }*/ voidT1_ISR(void)interrupt3 { IR_OUT=! IR_OUT; } voidmain(void) { Init_Timer(); while (1) { //Send_Start_Bit(); //Send_Bit_1(); Send_Char(); delay_ms(1000); } } //----------------------------------------------------------------------- //T1ISR 红外发射程序实例二: *******************************/ #include #include sbitIR=P3^2;//将IR位定义为P3.2引脚 sbitRS=P2^4;//寄存器选择位,将RS位定义为P2.0引脚 sbitRW=P2^5;//读写选择位,将RW位定义为P2.1引脚 sbitE=P2^6;//使能信号位,将E位定义为P2.2引脚 sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚 sbitBEEP=P3^0;//蜂鸣器控制端口P36 unsignedcharflag; unsignedcharcodestring[]={"1602IR-CODETEST"}; unsignedchara[4];//储存用户码、用户反码与键数据码、键数据反码 unsignedintLowTime,HighTime;//储存高、低电平的宽度 unsignedinta0,a1,a2,a3,a4,a5,a6,a7; sbitp37=P3^7; /***************************************************** 函数功能: 延时1ms ***************************************************/ voiddelay1ms() { unsignedchari,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; } /***************************************************** 函数功能: 延时若干毫秒 入口参数: n ***************************************************/ voiddelay(unsignedcharn) { unsignedchari; for(i=0;i delay1ms(); } /*********************************************************/ voidbeep()//蜂鸣器响一声函数 { unsignedchari; for(i=0;i<100;i++) { delay1ms(); BEEP=! BEEP;//BEEP取反 } BEEP=1;//关闭蜂鸣器 delay(250);//延时 } /***************************************************** 函数功能: 判断液晶模块的忙碌状态 返回值: result。 result=1,忙碌;result=0,不忙 ***************************************************/ unsignedcharBusyTest(void) { bitresult; RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1;//E=1,才允许读写 _nop_();//空操作 _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给result E=0; returnresult; } /***************************************************** 函数功能: 将模式设置指令或显示地址写入液晶模块 入口参数: dictate ***************************************************/ voidWriteInstruction(unsignedchardictate) { while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_();//空操作两个机器周期,给硬件反应时间 P0=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 指定字符显示的实际地址 入口参数: x ***************************************************/ voidWriteAddress(unsignedcharx) { WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x" } /***************************************************** 函数功能: 将数据(字符的标准ASCII码)写入液晶模块 入口参数: y(为字符常量) ***************************************************/ voidWriteData(unsignedchary) { while(BusyTest()==1); RS=1;//RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" P0=y;//将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 对LCD的显示模式进行初始化设置 ***************************************************/ voidLcdInitiate(void) { delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38);//显示模式设置: 16×2显示,5×7点阵,8位数据接口 delay(5);//延时5ms WriteInstruction(0x38); delay(5); WriteInstruction(0x38); delay(5); WriteInstruction(0x0C);//显示模式设置: 显示开,有光标,光标闪烁 delay(5); WriteInstruction(0x06);//显示模式设置: 光标右移,字符不移 delay(5); WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除 delay(5); } /************************************************************ 函数功能: 对4个字节的用户码和键数据码进行解码 说明: 解码正确,返回1,否则返回0 出口参数: dat *************************************************************/ bitDeCode(void) { unsignedchari,j; unsignedchartemp;//储存解码出的数据 for(i=0;i<4;i++)//连续读取4个用户码和键数据码 { for(j=0;j<8;j++)//每个码有8位数字 { temp=temp>>1;//temp中的各数据位右移一位,因为先读出的是高位数据 TH0=0;//定时器清0 TL0=0;//定时器清0 TR0=1;//开启定时器T0 while(IR==0)//如果是低电平就等待 ;//低电平计时 TR0=0;//关闭定时器T0 LowTime=TH0*256+TL0;//保存低电平宽度 TH0=0;//定时器清0 TL0=0;//定时器清0 TR0=1;//开启定时器T0 while(IR==1);//如果是高电平就等待 TR0=0;//关闭定时器T0 HighTime=TH0*256+TL0;//保存高电平宽度 if((LowTime<370)||(LowTime>640)) return0;//如果低电平长度不在合理范围,则认为出错,停止解码 if((HighTime>420)&&(HighTime<620))//如果高电平时间在560微秒左右,即计数560/1.085=516次 temp=temp&0x7f;//(520-100=420,520+100=620),则该位是0 if((HighTime>1300)&&(HighTime<1800))//如果高电平时间在1680微秒左右,即计数1680/1.085=1548次 temp=temp|0x80;//(1550-250=1300,1550+250=1800),则该位是1 } a[i]=temp;//将解码出的字节值储存在a[i] } if(a[2]=~a[3])//验证键数据码和其反码是否相等,一般情况下不必验证用户码 { if(a[3]==0x17)//继电器开5 { p37=1;} if(a[3]==0x1b)//继电器合6 { p37=0;} return1;}//解码正确,返回1 } /*------------------二进制码转换为压缩型BCD码,并显示---------------*/ voidtwo_2_bcd(unsignedchardate) { unsignedchartemp; temp=date; date&=0xf0; date>>=4;//右移四位得到高四位码 date&=0x0f;//与0x0f想与确保高四位为0 if(date<=0x09) { WriteData(0x30+date);//lcd显示键值高四位 } else { date=date-0x09; WriteData(0x40+date); } date=temp; date&=0x0f; if(date<=0x09) { WriteData(0x30+date);//lcd显示低四位值 } else { date=date-0x09; WriteData(0x40+date); } WriteData(0x48);//显示字符'H' } /************************************************************ 函数功能: 1602LCD显示 *************************************************************/ voidDisp(void) { WriteAddress(0x40);//设置显示位置为第二行的第1个字 two_2_bcd(a[0]); WriteData(0x20); two_2_bcd(a[1]); WriteData(0x20); two_2_bcd(a[2]); WriteData(0x20); two_2_bcd(a[3]); } /************************************************************ 函数功能: 主函数 *************************************************************/ voidmain() { unsignedchari; LcdInitiate();//调用LCD初始化函数 delay(10); WriteInstruction(0x01);//清显示: 清屏幕指令 WriteAddress(0x00);//设置显示位置为第一行的第1个字 i=0; while(string[i]! ='\0')//'\0'是数组结束标志 {//显示字符WWW.RICHMCU.COM WriteData(string[i]); i++; } EA=1;//开启总中断 EX0=1;//开外中断0 ET0=1;//定时器T0中断允许 IT0=1;//外中断的下降沿触发 TMOD=0x01;//使用定时器T0的模式1 TR0=0;//定时器T0关闭 p37=1; while (1)//等待红外信号产生的中断 {; } } /************************************************************ 函数功能: 红外线触发的外中断处理函数 *************************************************************/ voidInt0(void)interrupt0 { EX0=0;//关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号 TH0=0;//定时器T0的高8位清0 TL0=0;//定时器T0的低8位清0 TR0=1;//开启定时器T0 while(IR==0);//如果是低电平就等待,给引导码低电平计时 TR0=0;//关闭定时器T0 LowTime=TH0*256+TL0;//保存低电平时间 TH0=0;//定时器T0的高8位清0 TL0=0;//定时器T0的低8位清0 TR0=1;//开启定时器T0 while(IR==1);//如果是高电平就等待,给引导码高电平计时 TR0=0;//关闭定时器T0 HighTime=TH0*256+TL0;//保存引导码的高电平长度 if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700)) { //如果是引导码,就开始解码,否则放弃,引导码的低电平计时 //次数=9000us/1.085=8294,判断区间: 8300-500=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 红外 发射 程序 实例