红外控制小灯亮灭
/**********************************************************
功能:
利用普通的红外接收一体装置,当按红外键盘CH_是,P1.6小灯取反即,亮灭
硬件连接图:
1838T ..............P1.7 //输入并且利用P1.3外部中断带上拉电阻
**********************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
void int_Clock(void) //时钟初始化
{
BCSCTL1 = CALBC1_8MHZ; //DCO数字振荡器=8MHZ
DCOCTL = CALBC1_8MHZ; //DCO数字振荡器=8MHZ
}
void int_WDT(void) //看门狗设置
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog
}
void Delay_us(uint us) // 延时us 前提是f=8MHZ(不建议用该延时,不是很精确)
{
uint i;
for(i=0;i
__delay_cycles(8);
}
void Delay_ms(uint ms) // 延时ms 前提是f=8MHZ
{
uint j;
for(j=0;j
__delay_cycles(8000);
}
#include "hongwai_1838T.h" //红外接收函数
void port_init(void) //端口初始化
{
P1DIR |= BIT6;
P1OUT |= Hongwai_1838T; //Hongwai_1838T上拉电阻
P1REN |= Hongwai_1838T; //使能Hongwai_1838T的上拉电阻
P1IE |= Hongwai_1838T; //Hongwai_1838T中断使能
P1IES |= Hongwai_1838T; //Hongwai_1838T边沿触发中断方式设置
P1IFG &= ~Hongwai_1838T; //Hongwai_1838T断标志位清除
}
void init_devices(void)
{
port_init(); //IO口设置
int_Clock(); //时钟设置
int_WDT(); //看门狗设置
}
void main(void)
{
init_devices();
_EINT();
while(1)
{
Hongwai_1838T_choose();
}
}
//P1中断服务程序
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
Hongwai_1838T_dsp();
P1IFG =0;
}
//开总中断
/**********************************************************
功能: 子函数
利用普通的红外接收一体装置
硬件连接图:
红外接收连接图
1838T ..............P1.7//输入并且利用P1.7外部中断一定带上拉电阻
用法: 1. 先配置P1.7外部中断!!!!!!!!!!!!!!!!!!!!!!!!!
P1OUT |= Hongwai_1838T; //Hongwai_1838T上拉电阻
P1REN |= Hongwai_1838T; //使能Hongwai_1838T的上拉电阻 P1IE |= Hongwai_1838T; //Hongwai_1838T中断使能
P1IES |= Hongwai_1838T; //Hongwai_1838T边沿触发中断方式设置 P1IFG &= ~Hongwai_1838T; //Hongwai_1838T断标志位清除
2. 在while(1)里调用Hongwai_1838T_choose();即:用红外键盘上的按键执行任务 Hongwai_1838T_choose();
3. 开总中断
_EINT(); //开总中断
4. 在P1中断服务程序里调用Hongwai_1838T_dsp();
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
Hongwai_1838T_dsp();
P1IFG =0;
}
**********************************************************/
#define Hongwai_1838T BIT7 //红外输入
volatile uchar addr[4]={0}; //编码放在addr[2]数组里
void Hongwai_1838T_dsp(void)
{
uchar i,j,k=0;
if((P1IN & Hongwai_1838T)==0)
{
for(i = 0;i
{
Delay_us(400);
if(P1IN & Hongwai_1838T) //9MS内有高电平,则判断为干扰,退出处理程序
{
return;
}
}
while(!(P1IN & Hongwai_1838T)); //等待9ms 低电平过去
for(i = 0;i
{
for(j = 0;j
{
while(P1IN & Hongwai_1838T); //等待4.5ms 高电平过去 while(!(P1IN & Hongwai_1838T));//等待变高电平
while(P1IN & Hongwai_1838T) //计算高电平时间
{
Delay_us(100);
k++;
if(k >= 30) //高电平时间过长,则退出处理程序 {
return;
}
}
addr[i]=addr[i] >> 1; //接受一位数据
if(k>=8)
{
addr[i]=addr[i]|0x80; //高电平时间大于0.56,则为数据1 }
k = 0; //计时清零
}
}
}
}
void Hongwai_1838T_choose(void)
{
switch(addr[2]) //可以在中间添加所执行的程序 {
case 69: //对应红外键盘的CH-
{
P1OUT ^= BIT6; //对小灯取反
//在此可以再加自己所需程序 addr[2]=0; //一定要对编码数组addr[2]清0 //否则会一直执行该句
}
break;
case 70: //对应红外键盘的CH {
addr[2]=0; //一定要对编码数组addr[2]清0 //否则会一直执行该句 }
break;
case 71: //对应红外键盘的CH+ {
addr[2]=0;
}
break;
case 68:
{
addr[2]=0;
}
break;
case 64:
{
addr[2]=0;
}
break;
case 67:
{
addr[2]=0;
}
break;
case 7:
{
addr[2]=0;
}
break;
case 21:
{
addr[2]=0;
}
break;
case 9: //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的vol- //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的vol+ //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的|| //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的- //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的+ //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的EQ
{
addr[2]=0; //一定要对编码数组addr[2]清0 //否则会一直执行该句 }
break;
case 22: //对应红外键盘的0
{
addr[2]=0; //一定要对编码数组addr[2]清0 //否则会一直执行该句 }
break;
case 25:
{
addr[2]=0;
}
break;
case 13:
{
addr[2]=0;
}
break;
case 12:
{
addr[2]=0;
}
break;
case 24:
{
addr[2]=0;
}
break;
case 94:
{
addr[2]=0;
}
break;
case 8 :
{
addr[2]=0; //对应红外键盘的100+ //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的200+ //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的1 //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的2 //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的3 //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的4 //一定要对编码数组addr[2]清0
//否则会一直执行该句 }
break;
case 28: //对应红外键盘的5
{
addr[2]=0; //一定要对编码数组addr[2]清0 //否则会一直执行该句 }
break;
case 90:
{
addr[2]=0;
}
break;
case 82:
{
addr[2]=0;
}
break;
case 66:
{
addr[2]=0;
}
break;
case 74:
{
addr[2]=0;
}
break;
default:
break;
}
}
//对应红外键盘的6 //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的7 //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的8 //一定要对编码数组addr[2]清0 //否则会一直执行该句 //对应红外键盘的9 //一定要对编码数组addr[2]清0 //否则会一直执行该句