/*
项目名称:机顶盒频道锁定
日期:2016年1月31日 23:33
版本:2.1
设计:chunli
博客:http://990487026.blog.51cto.com/
邮箱:[email protected]
编码环境:GBK2312简体中文
μVision 版本:4.72.9.0
代码类型:C语言
功能:用导线的方式实现红外控制功能
2.0更新说明:
1, 废弃弃原来模拟按键的方式去控制机顶盒的频道,因为这种方式不稳定。
2,采用红外控制的思想,用导线代替红外发射,频道锁定迅速
2.1更新说明:
1,简化代码,为机顶盒高度定制的C程序
使用说明:
//在 void channel(void)函数内 设定频道锁定
为什么要这么设计?
因为该环境内有7个同批次机顶盒同时在工作,如果只想控制其中的一个机顶盒,
用发射红外的方式,必然带来对其他机顶盒的干扰。
用导线的方式代替发射红外,彻底杜绝红外发射对其他机顶盒的干扰。、
而且频道锁定迅速,
单片机:STC15f104W
【注意】【注意】【注意】烧录晶振设定12M
接线:
1,单片机的GND 接机顶盒的 GND
1,单片机的3号脚接机顶盒红外接收一体化的OUT引脚
STC15F104W引脚
1 P3.4
2 VCC 3.8--5.5V
3 P3.5
4 GND
5 P3.0 接烧录器的TXD
6 P3.1 接烧录器的RXD
7 P3.2
8 P3.3
*/
#include <STC15F104E.H>
#define waiting 3 //开机初始化的时间 值应该为60,单位秒钟 范围:0--65535秒
#define rollback 2 //轮询锁定频道, 值应该为15,单位分钟 范围:0--255分钟
sbit ISR_Single = P3^5;
staticunsignedint count; //中断次数计数器
staticunsignedint End_Times; //终止延时计数
static bitSingle_flag; //0、1电平标志
unsignedchar code usercode1=0x48; //遥控器用户码前8位
unsignedchar code usercode2=0x77; //遥控器用户码后8位
unsignedchar code key_0=0x10; //遥控器数字按键0
unsignedchar code key_1=0x11; //遥控器数字按键1
unsignedchar code key_2=0x12; //遥控器数字按键2
unsignedchar code key_3=0x13; //遥控器数字按键3
unsignedchar code key_4=0x14; //遥控器数字按键4
unsignedchar code key_5=0x15; //遥控器数字按键5
unsignedchar code key_6=0x16; //遥控器数字按键6
unsignedchar code key_7=0x17; //遥控器数字按键7
unsignedchar code key_8=0x18; //遥控器数字按键8
unsignedchar code key_9=0x19; //遥控器数字按键9
unsignedchar code key_menu=0x07; //遥控器菜单按键
unsignedchar code key_back=0x1C; //遥控器返回按键
unsignedchar code key_ok=0x1F; //遥控器确定按键
unsignedchar code key_up=0x00; //遥控器向上按键
unsignedchar code key_down=0x01; //遥控器向下按键
unsignedchar code key_left=0x03; //遥控器向左按键
unsignedchar code key_right=0x02; //遥控器向右按键
unsignedchar code key_CH_UP =0x5A;//遥控器频道加按键
unsignedchar code key_CH_DOWN =0x5B;//遥控器频道减按键
unsignedchar codekey_VOL_UP =0x06;//遥控器音量加按键
unsignedchar code key_VOL_DOWN=0x0B;//遥控器音量减按键
voidDELAY_MS (unsignedint a){
unsignedint i;
while(--a !=0) {
for(i=0;i<=600;i++);
}
}
void sleep_s(unsignedint a){
unsignedint i;
for(i=0;i<a;i++){
DELAY_MS(1000);
}
}
void sleep_m(unsignedint a){
unsignedint i;
for(i=0;i<a;i++){
sleep_s(60);
}
}
voidSendSingle(unsignedint Single_times, bit Single_type){ //参数信号持续时间控制,电平高低
End_Times=Single_times;
Single_flag=Single_type;
EA=0;
count=0;
EA=1; //避免中断影响count置数
while(1){
EA=0;
if( count < End_Times ) EA=1; //避免中断影响count比较
else{EA=1;break;}
}
}
voidSend_Byte(unsignedchar irdata){ //发射一个8位数据,低位先发送!!
unsignedchar i;
for(i=0;i<8;i++) {
SendSingle(43,1); //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)13.02*43=0.56ms
if(irdata &1) SendSingle(130,0); //1为宽电平,13.02*130=1.693ms
else SendSingle(43,0); //0为窄电平,13.02*43=0.560ms
irdata=irdata>>1; //数据右移,原先的最低位移出
}
}
voidSend_Code(unsignedchar Code){//编码发送,
SendSingle(692,1); //13.02*692=9.010ms //发送9ms的起始码,高电平有38KHZ载波
SendSingle(346,0); //发送4.5ms的结果码,低电平无38KHZ载波 //13.02*346=4.505ms
Send_Byte(usercode1); //发送十六位地址的前八位
Send_Byte(usercode2); //发送十六位地址的后八位
Send_Byte(Code); //发送八位数据
Send_Byte(~Code); //发送八位数据的反码
SendSingle(43,1); //发送总的结束位1bit //13.02*43=0.56ms
Single_flag=0;
}
voidTimerInit(void){ // 12M @12T 13微秒中断, 1S/38K=26.31微秒,1/2的占空比方波,需要13微秒的中断
TMOD =0x02; //(定时器0 方式2,8位自动重装)
TH0 =0xF3;
TL0 =0xF3;
TR0 =1; //开始计数
ET0 =1; //定时器0中断允许
EA =1; //允许CPU中断
}
void channel(void){
// CCTV 1 综合 7 CCTV1 是7 号频道,按一下7
// CCTV 5 体育 20 CCTV5 是20号频道,先按2 再按0
// CCTV 13 新闻 22
// CCTV 14 少儿 87
// 湖南卫视 39
// 安徽卫视 55
// 东方卫视 33
// 黑龙江卫视 25
Send_Code(key_CH_UP); //跳到CCTV1 综合频道
DELAY_MS(500);
// Send_Code(key_down);
// DELAY_MS(500);
}
void main(void){
count =0;
Single_flag =0;
ISR_Single =1;
TimerInit();
sleep_s(waiting); //等待机顶盒初始化完成
channel(); //开始锁定频道
while(1){
// sleep_m(rollback);
sleep_s(rollback);
channel(); //再次锁定频道
}
}
void timeint(void) interrupt 1{
count++;
if(Single_flag) ISR_Single=0;
else ISR_Single=1;
}