|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
digger63兄用单片机实现方控功能非常好,帖子在老站:http://bbs.mydigit.cn/read.php?tid=1698430
这是我见过改红外遥控的最简洁的方法!奇怪的是,我用stc15w408as,看针脚和201s基本一样,但是isp录入后,红外码都是乱码,测试方控两脚,电流好像没有变化,似乎红外并没有起作用。
我的车机是斯巴鲁力狮6碟,只需要方控正负,测试方控电压为3.20v。取电点为3.40v,接电阻测试电流数据如下:
3.40v下功能电压 pwm比例
静音 0.04v 3:255
音量加 0.48-0.45v 36:255
音量减1.04v 78:255
下一曲 1.85v 139:255
上一区 2.34-2.32v 1755:2550
模式切换 1.50v 1125:2550
没有看明白帖子中电阻和电压的关系[s:15] ,我理解只要给方控加上适当的电压就可以实现方控功能,所以在开机状态下量取加功能电阻后的静态电压,不知道这样合适否?pwm比例和取电点有关,还是和方控电压有关?欢迎有研究的大侠指教。
@digger63 @yuanhs
[attachment=21091458][attachment=21091459]
- /********************************************************
- * 版权所有,仿冒不究
- * 卡罗拉松下版遥控程序,适用于STC15W系单片机
- * STC15W201S IRC频率设定为10MHz
- * 15Jun2016 by digger63
- *********************************************************/
- #define uchar unsigned char
- #define uint unsigned int
- #define User_code 0x4CB3 //定义红外接收用户码
- #define power_code 0xDC //定义开关机红外接收码
- #define LED_code 0x82 //定义按键灯红外接收码
- #define volup_code 0xFF //定义音量加红外接收码
- #define voldown_code 0x81 //定义音量减红外接收码
- #define up_code 0x8D //定义上红外接收码
- #define down_code 0xC1 //定义下红外接收码
- #define mode_code 0xD9 //定义模式红外接收码
- #define mute_code 0x80 //定义静音红外接收码
- #define seek_code 0x99 //定义前进红外接收码
- #define track_code 0xC1 //定义后退红外接收码
- #include <STC15F2K60S2.H>
- #include<intrins.h>
- #include "IR.H"
- sbit sw0=P1^5; //开关按钮
- sbit sw1=P3^3; //方控1
- sbit sw2=P3^2; //方控2
- sbit mcu=P5^5; //MCU
- sbit ACCC=P1^4; //ACC
- sbit LED=P3^6; //按键灯
- void delay(uint t) //10us()@10MHz
- {
- uchar i;
- i = 246;
- do
- {
- while (--i);
- } while (--t);
- }
- void PWM(uint m,n) //m:占空比。n:持续时间,决定短按或长按
- {
- uchar l;
- for(;n;n--)
- {
- for(l=0;l<255;l++) //PWM 周期
- if (l < m){sw1 = 0;}
- else{sw1 = 1;}
- }
- }
- void main()
- {
- P1M0 = 0x10;
- ACCC = 1;
- delay(20000);
- mcu = 0; //模拟短按面板 POWER 按钮
- delay(900);
- mcu = 1;
- LED = 0;
- InitTimer(); //初始化Timer
- PrintString("****** 我的车机红外接收程序 ******\r\n"); //上电后串口发送一条提示信息
- while(1)
- {
- if (sw0 == 0){
- ACCC = !ACCC;
- delay(10000);
- mcu = 0; //模拟短按面板 POWER 按钮
- delay(500);
- mcu = 1;
- }
- if(B_IR_Press) //有IR键按下
- {
- PrintString("红外码: 0x"); //提示红外键码
- Tx1Send(HEX2ASCII(IR_code >> 4)); //键码高半字节
- Tx1Send(HEX2ASCII(IR_code)); //键码低半字节
- if(B_IrUserErr) //用户码错误,则发送用户码
- {
- Tx1Send(' '); //发空格
- Tx1Send(' '); //发空格
- PrintString("用户码: 0x"); //提示用户码
- Tx1Send(HEX2ASCII(IR_UserH >> 4)); //用户码高字节的高半字节
- Tx1Send(HEX2ASCII(IR_UserH)); //用户码高字节的低半字节
- Tx1Send(HEX2ASCII(IR_UserL >> 4)); //用户码低字节的高半字节
- Tx1Send(HEX2ASCII(IR_UserL)); //用户码低字节的低半字节
- }
- else
- {
- EA = 0;
- if(IR_code == power_code)
- {
- ACCC = !ACCC;
- mcu = 0; //模拟短按面板 POWER 按钮
- delay(900);
- mcu = 1;
- }
- if(IR_code == LED_code) {LED = !LED;}
- if(IR_code == volup_code) {PWM(3,255);}
- if(IR_code == voldown_code) {PWM(38,255);}
- if(IR_code == up_code) {PWM(108,255);}
- if(IR_code == down_code) {PWM(150,255);}
- if(IR_code == seek_code) {PWM(220,255);}
- if(IR_code == track_code) {PWM(180,2550);}
- if(IR_code == mode_code) {PWM(1760,2550);} //MODE
- if(IR_code == mute_code) {PWM(78,255);} //静音
- EA = 1;
- }
- Tx1Send(0x0d); //发回车
- Tx1Send(0x0a); //发回车
- B_IR_Press = 0;
- }
- }
- }
- /*
- Program Size: data=16.5 xdata=0 code=633
- creating hex file from "kll"...
- "kll" - 0 Error(s), 0 Warning(s).
- */
复制代码
|
|