圣源电子制作
标题: tc9012 芯片的遥控-C51 C语言程序 [打印本页]
作者: sydz 时间: 2011-10-10 15:36
标题: tc9012 芯片的遥控-C51 C语言程序
使用tc9012芯片的遥控
[attach]6392[/attach][attach]6393[/attach][attach]6391[/attach]
TC9012是一块用于东芝系列红外遥控系统中的专用发射集成电路,采用 CMOS工艺制造。它可外接 32个按键,提供 8种用户编码,另外还具有 3种双重按键功能。TC9012的管脚设置和外围应用线路都进行了高度优化,以配合 PCB的布图和低成本的要求。
主要特点
z | 低压 CMOS工艺制造 |
z | 低功耗超小静态电流 |
z | 低工作电压(VDD=2.0~5.0V) |
z | 32+3条指令码 |
z | 8种用户编码可选择 |
z | TSOP-20、SOP20、COB可选的封装形式 |
应用范围
z 电视机、组合音响设备、录音卡座、VCD、DVD播放机
(, 下载次数: 69)
管脚说明
管脚号 | 名称 | 类型 | 描述 |
1~4 | KI0-KI4 | IN | 4位输入脚用于键盘扫描输入(平时为低电平,内置下拉电阻) |
5 | REM | OUT | 带载波的遥控信号输出 |
6 | VDD | | 电源正端(2.0V~4.0V)3V(典型) |
7 | NC | | 空脚 |
8 | OSCO | OUT | 晶振输出 |
9 | OSCI | IN | 晶振输入 |
10 | VSS | | 电源负端(接地) |
19~12 | KO0-KO7 | OUT | 8位输出脚用于键盘扫描输出 |
11 | LMP | OUT | 指示灯输出 |
20 | SEL | IN | 用于用户编码选择跳线(平时为高电平,内置下拉电阻) |
参数说明
极限参数(除非特别说明,Tamb=25℃)
参数 | 符号 | 最小值 | 最大值 | 单位 |
电源电压 | VDD | 1.8 | 4.0 | V |
输入电压 | VIN | -0.5 | VDD +0.5 | V |
输出电压 | VO | -0.5 | VDD +0.5 | V |
输出电流 | IO | | 20 | mA |
功耗 | PD | | 250 | mw |
贮存温度 | Tstg | | -40~+125 | ℃ |
工作温度 | Topr | | -20~+75 | ℃ |
推荐工作条件(除非特别说明,Tamb=25℃)
参数 | 符号 | 最小值 | 典型值 | 最大值 | 单位 |
电源电压 | VDD | 2.0 | 3.0 | 3.6 | V |
振荡频率 | Fosc | 400 | 455 | 500 | KHz |
输入电压 | VIN | 0 | -- | VDD | V |
电气参数(除非特别说明,Tamb=25℃,VDD=3.0V)
参数 | 符号 | 测试条件 | 最小值 | 典型值 | 最大值 | 单位 |
电源电压 | VDD | | 2.0 | 3.0 | 3.6 | V |
工作电流 | ICC1 | 按键按下,VDD=3.0V, Fosc=455KHz,不接红外管、led管 | | | 1.0 | mA |
静态电流 | ICC2 | VDD=3.0V,没有按键按下,晶振停振,红外管,led管均不工作 | | | 1 | uA |
KI高电平输入电压 | VIH | VDD =3.0V | 0.7 VDD | | VDD | V |
KI低电平输入电压 | VIL | VDD =3.0V | 0 | | 0.3 VDD | V |
REM高电平输出电流 | IOH | VOH=1.5V,VDD=3V | 5 | 5 | | mA |
LMP低电平输出电流 | IOL | VOL=1.5V,VDD=3V | 1 | | | mA |
输入下拉电阻 | RON | VDD=3.0V | 30 | 50 | 100 | KΩ |
三.遥控器输出波形
(, 下载次数: 70)
以下为遥控器布图的注意事项: 1、将电源滤波电容尽可能靠近IC;电源滤波电容只需要使用104的瓷片电容即可;2、尽可能避免电源和地线走线过长或过细; 3、尽可能把晶振电路放置在离芯片较近的位置; 4、建议在三极管的发射极使用2欧姆的限流电阻;
5、建议晶振旁边的两个谐振电容使用 150pf以上,这样可以防止高频谐波。
6、上图中 SEL脚和 KO7相连,所以客户码选择为:0E0E;
图 6 TC9012参考应用电路图
(, 下载次数: 69)
封装外形图
(, 下载次数: 61)
提供 三个 51C程序
- #include <AT89X51.H>
- #define c(x) (x*110592/120000)
- sbit Ir_Pin=P3^5;
- unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
- 0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F.
- unsigned char code Led_Sel[]={0xfe,0xfd,0xfb,0xf7}; //显示位控
- unsigned char Led_Buf[4]; //显示缓冲区
- char Led_Index; //位选
- unsigned char Ir_Buf[4]; //用于保存解码结果
- //==============================================================
- //数码管扫描
- timer0() interrupt 1 using 1
- {
- TL0=(65536-1000)%256;
- TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
- P0=0xff;
- P2=Led_Sel[Led_Index]; //位选
- P0=Led_Tab[Led_Buf[Led_Index]]; //段选
- if(++Led_Index>3) Led_Index=0; //四个扫描完了,到第一个数码管
- }
- //==============================================================
- unsigned int Ir_Get_Low()
- {
- TL1=0;
- TH1=0;
- TR1=1;
- while(!Ir_Pin && (TH1&0x80)==0); //当P3.5为低 且 TH1<0x80时 等待
- TR1=0;
- return TH1*256+TL1;
- }
- //=============================================================
- unsigned int Ir_Get_High()
- {
- TL1=0;
- TH1=0;
- TR1=1;
- while(Ir_Pin && (TH1&0x80)==0);
- TR1=0;
- return TH1*256+TL1;
- }
- //==============================================================
- main()
- {
- unsigned int temp;
- char i,j;
- Led_Index=1;
- TMOD=0x11;
- TL0=(65536-1000)%256;
- TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
- EA=1;
- ET0=1;
- TR0=1;
- Led_Buf[0]=0;
- Led_Buf[1]=0;
- Led_Buf[2]=0;
- Led_Buf[3]=0; //显示区设成0
- do{
- restart:
- while(Ir_Pin);
- temp=Ir_Get_Low();
- if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲低电平9000
- temp=Ir_Get_High();
- if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500
- for(i=0;i<4;i++) //4个字节
- for(j=0;j<8;j++) //每个字节8位
-
- {
-
- temp=Ir_Get_Low();
-
- if(temp<c(200) || temp>c(800)) goto restart;
-
- temp=Ir_Get_High();
-
- if(temp<c(200) || temp>c(2000)) goto restart;
- Ir_Buf[i]>>=1;
-
- if(temp>c(1120)) Ir_Buf[i]|=0x80;
-
- }
- Led_Buf[0]=Ir_Buf[2]&0xf; //低四位数据码
-
- Led_Buf[1]=(Ir_Buf[2]/16)&0xf; //高四位数据码
- Led_Buf[2]=Ir_Buf[0]&0xf; //低四位用户码
- Led_Buf[3]=(Ir_Buf[0]/16)&0xf; //高四位用户码
- }while(1);
- }
复制代码
- //使用12M晶振 适用于TC9012芯片,其他芯片请自行更改解码时序
- #include<reg52.h>
- #include<stdio.h>
- #include<intrins.h>
- ////////////////////////////////////////////////
- #define TURE 1
- #define FALSE 0
- ////////////////////////////////////////////////
- sbit IR=P3^2;//红外接口标志
- unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- ////////////////////////////////////////////
- unsigned char irtime;//红外用全局变量
- bit irpro_ok,irok;
- unsigned char IRcord[4];
- unsigned char irdata[33];
- //////////////////////////////////////////////
- void Delay(unsigned char mS);
- void Ir_work(void);
- void Ircordpro(void);
- //////////////////////////////////////////////////////////////////
- void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
- {
- irtime++;
- }
- ///////////////////////////////////////////////////////////////////////
- void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
- {
- static unsigned char i;
- static bit startflag;
- if(startflag)
- {
-
- if(irtime<42&&irtime>=33)//引导码 TC9012的头码
- i=0;
-
- irdata[i]=irtime;//一次存储32位电平宽度
- irtime=0;
- i++;
- if(i==33)
- {
- irok=1;
- i=0;
- }
- }
- else
- {irtime=0;startflag=1;}
- }
- ////////////////////////////////////////////////////////////////////
- void TIM0init(void)//定时器0初始化
- {
- TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
- TH0=0x00;//reload value
- TL0=0x00;//initial value
- ET0=1;//开中断
- TR0=1;
- }
- ///////////////////////////////////////////////////////////////////
- void EX0init(void)
- {
- IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)
- EX0 = 1; // Enable EX0 Interrupt
- EA = 1;
- }
- /****************************************************************/
- /******************************************************************/
- void Ir_work(void)//红外键值散转程序
- {
- switch(IRcord[2])//判断第三个数码值
- {
- case 0:P0=dofly[1];break;//1 显示相应的按键值
- case 1:P0=dofly[2];break;//2
- case 2:P0=dofly[3];break;//3
- case 3:P0=dofly[4];break;//4
- case 4:P0=dofly[5];break;//5
- case 5:P0=dofly[6];break;//6
- case 6:P0=dofly[7];break;//7
- case 7:P0=dofly[8];break;//8
- case 8:P0=dofly[9];break;//9
- }
-
- irpro_ok=0;//处理完成标志
- }
- /*****************************************************************/
- void Ircordpro(void)//红外码值处理函数
- {
- unsigned char i, j, k;
- unsigned char cord,value;
- k=1;
- for(i=0;i<4;i++)//处理4个字节
- {
- for(j=1;j<=8;j++) //处理1个字节8位
- {
- cord=irdata[k];
- if(cord>7)//大于某值为1
- {
- value=value|0x80;
- }
- else
- {
- value=value;
- }
- if(j<8)
- {
- value=value>>1;
- }
- k++;
- }
- IRcord[i]=value;
- value=0;
- } irpro_ok=1;//处理完毕标志位置1
-
- }
- /////////////////////////////////////////////////////////////////
- void main(void)
- {
- EX0init(); // Enable Global Interrupt Flag
- TIM0init();//初始化定时器0
- P2=0x00;//1位数码管全部显示
- while(1)//主循环
- {
- if(irok)
- {
- Ircordpro();//码值处理
- irok=0;
- }
- if(irpro_ok)//step press key
- {
- Ir_work();//码值识别散转
- }
- }
- }
复制代码
程序
(, 下载次数: 34)
作者: 1260086278 时间: 2012-8-20 22:06
谢谢 学习一下
欢迎光临 圣源电子制作 (http://syyyd.com/) |
Powered by Discuz! X3.4 |