完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
回复本帖可获得 1 分积分奖励! 每人限 1 次 |
本帖最后由 0和1的世界 于 2015-7-3 22:46 编辑
我这个程序下进去不行,求指点 #include #define uchar unsigned char #define uint unsigned int uint IR_time; //uchar tab[]={0x9f,0x24,0x0d,0x99,0xff};//数码管编码 uchar TIME[33]={0};//存放33个波形时间 uchar Time_dat[4]={0};//存放4个解码完成的数据 ***it w1=P3^4; ***it w2=P3^5; //***it fmq=P3^7; bit IR_ok; bit IR_chuli_ok;//将波型时间转换成逻辑电平的标志位 bit start; //标志位,开始计时标志位 void EX1_init(void) { IT1 = 1; //外部中断下降沿触发 EA = 1; EX1 = 1; } void Time1_init(void) { TMOD |= 0x10; //定时器工作在方式2(8位自动重装) TH1 = (65536-276)/256; TL1 = (65536-276)%256; ET1 = 1; TR1 = 1; } void IR_chuli(void) { //将时间值转化为逻辑电平(转换成16进制函数) uchar i,j; uchar NUM = 1; //去除引导码,因为引导码存在数组下标为0的位置,即第1位,数据从第2位开始) uchar HL_time; //定义一个时间变量,用于单个按键波形处理 uchar byte = 0x00; //定义一个字节变量,用于存储转换的16进制数 for(i=0;i<4;i++) //表示4类数据(客户码、客户反码、数据码、数据反码) { for(j=0;j<8;j++) { HL_time = TIME[NUM]; if(HL_time > 6) //((1.125+2.25)/2=1.687ms,277us*6=1.66ms,判断为1,否则为0) byte |= 0x80; else byte = byte; if(j < 7) byte >>= 1; //因为最先处理低位数据,所以要用右移方法,将低位移7次,回到本来位置) NUM++; } Time_dat = byte; byte = 0x00; } if(Time_dat[2] == ~Time_dat[3]) //比较数据码与数据反码是否相等,相等,表示处理成功。 IR_chuli_ok = 1; //处理成功的标志, } void play(void) { switch(Time_dat[2]) { case 0x45:{ w1=w2=0; }break; case 0x46:{ w2=w1=1; }break; default:break; } /********************************************************* 遥控器1(小)码值: 遥控器2(大)码值: 45 46 47 05 04 06 07 44 40 43 09 08 0a 0b 07 15 09 0d 0c 0e 0f 16 19 0d 15 14 16 17 0c 18 5e 19 18 1a 1b 08 1c 5a 11 10 12 13 42 52 4a 01 00 02 03 1d 1c 1e 1f ***********************************************************/ } void main() { EX1_init(); Time1_init(); while(1) { //P0=0xff; if(IR_ok) // 按键的键值时间存储完毕标志 { IR_ok = 0; IR_chuli(); //将键值时间转换成16进制处理函数。 } if(IR_chuli_ok) //短按处理 { IR_chuli_ok = 0; play(); } } } void EX1_(void) interrupt 2 //外部中断 { static uchar xx = 0; // 设置记录波形的变量;计数 0 ~33(记录34个波形的时间) if(!start) //第一个下降沿触发 表示解码开始 { start = 1; IR_time = 0; } else if(start) //第二个下降沿到第33个下降沿 { if((IR_time < 50)&&(IR_time >= 32)) //剔除引导码(引导码为9000US,在8.8MS与13.8MS之间认为是引导码) xx = 0; TIME[xx] = IR_time; //存储按键码值时间(引导码存在数组的第一个位置,TIME[]为键值时间存储数组) IR_time = 0; xx++; if(xx == 33) { xx = 0; IR_ok = 1; //按键键值时间存储完成的标志,等于1表示完成 start = 0; } } } void Time1(void) interrupt 3 //定时器中断 { TH1 = (65536-276)/256; TL1 = (65536-276)%256; IR_time++; //每经过256*(12/11.0592)us触发一次中断(约277US) } |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
594 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
449 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-网络编程示例之开发板测试
395 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-网络编程示例之网络socket程序编程
895 浏览 0 评论
飞凌嵌入式-ELFBOARD-RGB LCD屏接口的PCB设计要点
895 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11728 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-16 22:26 , Processed in 0.475215 second(s), Total 72, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号