uPD6121 avr红外解码程序.doc_第1页
uPD6121 avr红外解码程序.doc_第2页
uPD6121 avr红外解码程序.doc_第3页
uPD6121 avr红外解码程序.doc_第4页
uPD6121 avr红外解码程序.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

uPD6121 avr红外解码程序#include #include #define uint unsigned int #define uchar unsigned char #define ulong unsigned long /*-显示-*/ #define LED_DATA PORTB const uchar tab=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ void delay(void) uint i; for(i=0;i12); /显示千位 PORTD=0xf7; delay(); /延时 LED_DATA=tab(uchar)(dis_data&0x0f00)8); /显示百位 PORTD=0xfb; delay(); /延时 LED_DATA=tab(uchar)(dis_data&0x00f0)4; /显示十位 PORTD=0xfd; delay(); /延时 LED_DATA=tab(uchar)dis_data&0x000f; /显示个位 PORTD=0xfe; delay(); /延时 void port_init(void) PORTA = 0xFF; DDRA = 0x00; PORTB = 0xFF; DDRB = 0xFF; PORTC = 0xFF; DDRC = 0xFF; PORTD = 0xFF; DDRD = 0x0F; void timer1_init(void) TCCR1B = 0x00; /stop TCNT1H = 0x00; /setup TCNT1L = 0x00; ICR1H = 0x00; ICR1L = 0x08; TCCR1A = 0x00; /*一体化接收头的DATA引脚接到ATmega16的PD6(ICP1)引脚,采用上升沿捕捉的方法解码*/ /*晶振为6M,无分频,用8M太大(分频则太小)*/ TCCR1B = 0x41; /start Timer uint arr16;/保存捕捉值 uchar times;/记录捕捉次数 uchar index;/数组索引 uchar ir_code;/红外遥控键码 uchar OK_flag;/解码完毕标志 /*- 模块名称:PD6(ICP1)引脚上升沿捕捉中断程序 影响: 将捕捉值保存在arr16中 _ _ | | | | _| |_| |_ | DEC HEX t=9ms 计数值54000 0xD2F0 t=4.5ms 计数值27000 0x6978 t=2.25ms 计数值13500 0x34BC t=1.125ms 计数值6750 0x1A5E -*/ #pragma interrupt_handler timer1_capt_isr:6 void timer1_capt_isr(void) uint value; value=ICR1L; /CLI(); value|=(uint)(ICR1H 18&=35) /第35个上升沿到来时,解码完毕 times=0; index=0; OK_flag=1; /SEI(); /*-解码程序- 结果:得到uchar型的键码ir_code,如果解码出错,则ir_code=0xff -*/ void get_code(void) uchar i,dat,/*键码*/_dat;/*键码反码*/ uint temp=0; for(i=0;i16;i+) if(arri7000) /“0” temp13000) /“1” temp8)&0x00ff);/*键码反码*/ /*“键码”与“键码反码相与,如果为0则解码正确*/ if(dat&_dat)=0) ir_code=dat; else TCNT1H = 0x00; TCNT1L = 0x00; ir_code=0xff;/解码出错 times=0; index=0; void init_devices(void) CLI(); port_init(); timer1_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x20; SEI(); void main(void) uchar i; init_devices(); while(1) if (OK_flag) get_code();/解码 OK_flag=0; for(i=0;i200;i+) dis_int(ir_code);/显示键码 /-楼主程序今测试了下: 主要有两点改动 用M64,T3,晶体7.3728 ,GCC 20040214 1 void timer1_init(void) TCCR3B = 0x00; /stop TCNT3H = 0x00; /setup TCNT3L = 0x00; ICR3H = 0x00; ICR3L = 0x08; TCCR3A = 0x00; /*一体化接收头的DATA引脚接到ATmega64的PE7(ICP3)引脚,采用上升沿捕捉的方法解码*/ /*晶振为7.3728M,8分频*/ TCCR1B = 0xC2; /start Timer 改动 2 SING(XXXXXXXXXXXXXXX) uint value; value=ICR3L; value|=(uint

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论