No.46561 作者:ats2008 邮件:ats2008@tom.com ID:16514 登陆:6次 文章数:1篇 最后登陆IP:210.27.5.34 最后登陆:2006/4/29 11:38:27 注册:2003/12/2 19:04:10 财富:110 发帖时间:2003/12/20 23:01:14 发贴者IP:221.15.185.71 标题:ats2008:红外解码,大家切磋 摘要:No.46561红外解码,大家切磋 首先把我的联系方式留几个: QQ:112165 E_Mail:ats2008@tom.com msn:ats2008@tom.com 由于刚开始接触单片机,所以做出来的程序也许不代表什么,程序还有一点点工作没有做,但是你可以在任何一个网站找代码,就是16B的非0即1数据转化为1B的问题,在程序中均有详细的说明,采用的是INT0,INT1,非门双中断,T0,T1双定时,更详细的请看程序,有什么好的想法,可以和我交流,最好的联系方式为Msn,由于我接触单片机只有 短短两个月,这里采用的是At89C52芯片,外电路不要找我,因为我采用的是最简电路. 详细程序如下(Keil C编译成功): /* title 红外解码方式程序设计*/ /*芯片的固有属性为起始位为低电平触发,也就是说采用反向双触发方式第三次出发就为需要的码*/ /*引导码9msL+4.5msH*/ #define CLK_CPU 11.0592 #include <AT89X52.H> bit flag; /* 定义中断标志*/ bit status; /*中断来源 INT0=0;INT1=1*/ unsigned int *px; /*存储解码信号*,第一位存储码数*/ struct code_end { unsigned int number; unsigned char *compressdata; /*把数据压缩后存储*/ }code_end; unsigned int *time_high; /*记录高电平持续时间 第一位为引导脉冲高点平*/ unsigned int *time_low; unsigned int time_stand; /*脉冲基数,即为低电平时间*/ unsigned int count_intr; /*中断产生的次数,这里去除了引导玛*/ bit overlow_sign; /*溢出标志*/ bit start_recieve=0; void get_time_stand(); void write_data(); unsigned int int0_count; /*低脉冲触发次数*/ unsigned int int1_count; /*高脉冲触发次数*/ bit rec_time(); /*记录高低电平的时间*/ void service_int0() interrupt 0 using 2 /* 中断0设置标志*/ { flag=1; status=0; int0_count++; if(int0_count> 1) start_recieve=1; else start_recieve=0; } void service_int1() interrupt 1 using 2 { flag=1; status=1; int1_count++; if(int0_count> 1) start_recieve=1; else start_recieve=0; } void timer0_init() /*定时器0初始化*/ { TMOD = 0x11; /*定时器0 1 均工作在1状态*/ TH0 = 0x00; TL0 = 0x00; TR0=0; } void timer1_init() /* 定时器1初始化*/ { TMOD = 0x11; TH1 = 0x00; TL1 = 0x00; TR1=0; } bit IR_init() /*红外信号接收初始化*/ { /*这里用来获取引导码,包括两个电平*/ /*time_high time_low 第一个存储数据就是相应的引导码的数据*/ /*9ms Low 4.5ms High 格力空调的编码,利用TEK示波器可以获取*/ rec_time(); return start_recieve; } void write_data() /*信号保存*/ { unsigned int i; unsigned int j; unsigned int count_loop; ......
>>返回讨论的主题
|