用的PIC16F877A,程序不知道哪里出错了,找茬了一天了。求指导; CCP1输入捕获方式,用D端口的指示灯指示接收到的数据。指示灯用电阻上拉的。 程序如下:请指导下。 #include<pic.h> //__CONFIG(0xFF32); void ccp1_init() //capture mode { T1CON = 0x00; //no postscale and no prescale CCP1CON = 0x04; //capture mode and falling edge TMR1L = 0x00; //timer1 count from TMR1 to 0xffff TMR1H = 0x00; GIE = 1; PEIE = 1; CCP1IE = 1; CCP1IF = 0; } volatile unsigned int countl = 0; //捕获的时间 volatile unsigned char leadcode_ok = 0; //引导码OK volatile unsigned char time_start = 0; //解码开始 volatile unsigned char i = 0; volatile unsigned char ir_code[4] = {0,0,0,0}; // 红外接收到的4个数据 void main() { TRISD = 0x00; //portd 输出 LED端口 PORTD = 0xff; TRISC = 0xff; // CCP1 输入,对应红外输入 ccp1_init(); while (1) { ; } } void interrupt ccp1(void) { if(CCP1IF && CCP1IE ) { CCP1IE = 0; if(time_start == 0) { TMR1H = 0; TMR1L = 0 ; TMR1ON = 1; time_start = 1; } else { TMR1ON = 0; countl = TMR1H*256+TMR1L; TMR1H = 0; TMR1L = 0; TMR1ON = 1; if((countl >12500)&&(countl <14500)&&(leadcode_ok == 0)) { leadcode_ok = 1; i = 0; } else { if((countl >2000)&&(countl <2500)&&(leadcode_ok==1)) //bit 1 { ir_code[i/8] = ir_code[i/8]<<1+1; i++; } else if((countl >1000)&&(countl <1300)&&(leadcode_ok==1)) //bit 0 { ir_code[i/8] = ir_code[i/8] <<1 ; i++; } else { time_start = 0; leadcode_ok = 0; i = 0; } } if(i==32) { i = 0; time_start = 0; leadcode_ok = 0; PORTD = ~ir_code[3]; //用指示灯输出 红外数据 } } TMR1IF = 0; CCP1IF = 0; CCP1IE = 1; } } |
共7条
1/1 1 跳转至页
红外遥控解码有点问题,求各位大佬指导
关键词: 指导
//测试成功,修改 //---------------------------------------------------------------------------------------------------------------------------------- // 程序名:HW6-2.c // 程序功能:红外线遥控LED // -------------------------------------------------------------------------------------------------------------------------------- #include<reg51.h> //头文件 sbit IRIN=P3^2; //定义红外IR信号输入位 sbit SPK=P3^7; //定义蜂鸣器接口 sbit RELAY=P2^7; //定义继电器接口 unsigned char IRDATA[7]; //定义数组,存储红外接收到的数据 //-------------------------------------- 主函数 -------------------------------------- void main() { EA=1; // 允许总中断 EX0=1; // 允许外部中断INT0中断 IT0=1; // 外部中断INT0采用脉冲触发方式 P1=0x00; // 设置P1初始值 SPK=1; // 设置SPK初始值 IRIN=1; // IR 输入位设置为高电平 while(1); // 无限循环 } //--------------------------------------- 延时函数 ------------------------------------ void delay(unsigned char x) //延时约x*0.1ms { unsigned char i; while(x--) {for(i=0;i<10;i++){}} } //------------------------------------- 发声函数 ------------------------------------- void fs_d ( ) { unsigned char i; for(i=0;i<100;i++) { delay(4); SPK=~SPK; } SPK=1; } //------------------------------------- 中断解码函数 ----------------------------------- void IR_IN() interrupt 0 using 0 //外部中断INT0函数 { unsigned char j,k,n=0; //先定义变量,且n=0 EX0=0; //暂时先关中断 delay(20); //延时0.10ms*20=2ms if(IRIN==1) //如果IRIN出现高电平,是干扰信号 { EX0=1; return; //返回 } while(!IRIN){delay(1);} //避开9ms前导低电平信 for(j=0;j<4;j++) //一共有4组数据 { for(k=0;k<8;k++) //每组数据有8位 { while(IRIN){delay(1);} // 避开4.5ms高电平 while(!IRIN){delay(1);} // 开始接收数据 while(IRIN) { delay(1); //延时0.1ms n++; //每过0.1ms时n就加1 if(n>=30) //如果超过30,放弃 { EX0=1; return; } //返回 } IRDATA[j]=IRDATA[j]>>1; //右移1位 if(n>=8){IRDATA[j]=IRDATA[j]|0x80;} n=0; //n清0 } } //检查接收的数据和数据反码是否相反 if(IRDATA[2]!=~IRDATA[3]) //判断数据码和数据反码是不是相反 { //否则就放弃 EX0=1; return; } else {} fs_d ( ); //调用发声函数 P1=IRDATA[2]; // P1端口输出 EX0=1; //开中断 } //-------------------------------------------------------------------------------------------------- |
共7条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【我想要一部加热台】使用8051单片机驱动WS2812被打赏40分 | |
【换取逻辑分析仪】rtthread添加RRH62000传感器驱动-基于野火启明6M5被打赏48分 | |
换逻辑分析仪+Verilog多输入门被打赏27分 | |
【换取逻辑分析仪】基于ESP32和LVGL的音频数据动态显示系统被打赏48分 | |
与电子爱好者谈读图四被打赏50分 | |
Let‘s do 第三季 [电子测光表] 基础任务和进阶任务成果展示被打赏50分 |