📄 红外线.c
字号:
}
void ir_exit(void) //红外接收恢复程序,恢复到红外接收前的状态
{
TR2=0; //停止计数以便修改计数器2寄存器
TR0=0;
ET2=0; //禁止计数器2中断
TL2=0xfb; //重新设置波特率为115.2kbps
TH2=0xff;
RCAP2H=0xff;
RCAP2L=0xfb;
T2CON=0x34;
ES=1; //允许串行中断
EA=1; //开放全局中断
}
void ir_jiema(void){ //解码程序,放在ir_code中,高十六位表示接收频率
//如果解码失败则为,如果是重复码则为1
//低八位表示载波频率,以KHz为单位
//低十六位的高八位表示系统码,低八位为按键码
p.p2[0]=IR;
p.p2[1]=p.p2[0]+1;
i.b[0]=*p.p2[0];
i.b[1]=*p.p2[1];
for(;i.b[1]!=0;){
if(i.b[0]>i.b[1]){
i.b[0]=0xffff-i.b[0];
i.b[0]+=i.b[1];
i.b[0]++;
}
else{
i.b[0]=i.b[1]-i.b[0];
}
*p.p2[0]=i.b[0];
p.p2[0]++;
i.b[0]=*p.p2[0];
p.p2[1]++;
i.b[1]=*p.p2[1];
}
*p.p2[0]=0;
p.p2[0]=IR;
temp.b=*p.p2[0];
ir_code.c=count.b;
ir_code.b[0]=(ir_code.c*1536000)/temp.b;
for(;temp.b!=0;){
*p.p2[0]=temp.b/154;
p.p2[0]++;
temp.b=*p.p2[0];
}
ir_code.b[1]=0;
if(p.p2[0]==IR+132){
p.p2[0]=IR;
p.p2[0]+=3;
i.c=0;
temp.b=*p.p2[0];
for(;temp.b!=0;){
i.c<<=1;
if(temp.b>=11){
i.a[3]++;
}
p.p2[0]+=2;
temp.b=*p.p2[0];
}
if(i.a[0]==(~i.a[1])&&i.a[2]==(~i.a[3])){
ir_code.a[2]=i.a[0];
ir_code.a[3]=i.a[2];
}
else ir_code.b[0]=0;
}
else{
if(p.p2[0]==IR+4){
p.p2[0]=IR;
p.p2[0]++;
temp.b=*p.p2[0];
if(temp.b<=30){
ir_code.b[0]=1;
}
else ir_code.b[0]=0;
}
else ir_code.b[0]=2;
}
//if(ir_flag==2)ir_code.b[0]=3;
}
void read_ir(void){
buf1_flag=0;
REN=1;
buf2_length=4;
while(buf2_flag);
ir_init();
while(!ir_flag);
ir_exit();
ir_jiema();
buf2=SEND;
*buf2++=ir_code.a[0];
*buf2++=ir_code.a[1];
*buf2++=ir_code.a[2];
*buf2=ir_code.a[3];
buf2=SEND;
buf2_flag=1;
SBUF=HEAD;
}
void delay(void){}
void start_iic(void){
SCL=0;
SDA=1;
delay();
delay();
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
delay();
}
void stop_iic(void){
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
SCL=0;
delay();
delay();
SCL=1;
delay();
}
void send_ack_iic(void){
SDA=0;
delay();
SCL=1;
delay();
delay();
SCL=0;
delay();
}
void send_nack_iic(void){
SDA=1;
delay();
SCL=1;
delay();
delay();
SCL=0;
delay();
}
bit receive_ack_iic(void){
bit a;
SDA=1;
delay();
SCL=1;
delay();
if(SDA) a=1;
else a=0;
delay();
SCL=0;
delay();
return a;
}
unsigned char read_byte_ack_iic(void){
unsigned char a;
SDA=1;
for(p.a[0]=0;p.a[0]<8;p.a[0]++){
a<<=1;
delay();
SCL=1;
delay();
if(SDA) a++;
delay();
SCL=0;
delay();
}
send_ack_iic();
return a;
}
unsigned char read_byte_nack_iic(void){
unsigned char a;
SDA=1;
for(p.a[0]=0;p.a[0]<8;p.a[0]++){
a<<=1;
delay();
SCL=1;
delay();
if(SDA) a++;
delay();
SCL=0;
delay();
}
send_nack_iic();
return a;
}
void reset_iic(void){
SDA=1;
for(p.a[0]=0;p.a[0]<10;p.a[0]++){
SCL=0;
delay();
delay();
SCL=1;
delay();
delay();
}
}
bit write_byte_iic(unsigned char a){
for(p.a[0]=0;p.a[0]<8;p.a[0]++){
if(a&0x80){
SDA=1;
}
else{
SDA=0;
}
delay();
SCL=1;
delay();
delay();
SCL=0;
delay();
a<<=1;
}
return receive_ack_iic();
}
unsigned int read_key_data(unsigned char a){
union{
unsigned char a[2];
unsigned int b;
}key_data;
reset_iic();
start_iic();
write_byte_iic(0xa0);
write_byte_iic(a);
start_iic();
write_byte_iic(0xa1);
key_data.a[0]=read_byte_ack_iic();
key_data.a[1]=read_byte_nack_iic();
stop_iic();
return key_data.b;
}
void write_key_data(unsigned char a){
reset_iic();
start_iic();
write_byte_iic(0xa0);
write_byte_iic(a);
write_byte_iic(ir_code.a[2]);
write_byte_iic(ir_code.a[3]);
stop_iic();
}
void store_ir(void){
buf1_flag=0;
REN=1;
buf1=RECEIVE+1;
*buf1=(*buf1)<<1;
write_key_data(*buf1);
}
unsigned char yima(void){
unsigned char a;
for(a=0;a<100;){
if(ir_code.b[1]==read_key_data(a)){
break;
}
a++;
a++;
}
a>>=1;
return a;
}
void read_key(){
unsigned char a;
buf1_flag=0;
REN=1;
ir_init();
while(!ir_flag);
ir_exit();
ir_jiema();
buf2=SEND;
a=yima();
if(a==50){
*buf2=0xff;
}
else *buf2=a;
buf2_length=1;
buf2_flag=1;
SBUF=HEAD;
}
main(){
unsigned char ctr;
delay1s();
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
ctr=0;
buf1=RECEIVE;
buf2=SEND;
buf1_length=0;
buf2_length=0;
buf1_flag=0;
buf2_flag=0;
state1=0;
state2=0;
SP=0xe0; //将堆栈指针指向高端
TL2=0xfb;
TH2=0xff; //溢出值为5,波特率为115.2Kbps;
RCAP2H=0xff;
RCAP2L=0xfb;
SCON=0x50; //方式1,8位方式,SM0=0,SM1=1,SM2=0,REN=1允许接收
IE=0x10; //串行中断允许,全局中断不允许
T2CON=0x34; //RCLK=1,TCLK=1,TR2=1 启动计数器
EA=1; //开放全局中断
free();
while(1){
//ir_init();
//while(!ir_flag);
//ir_exit();
//ir_jiema();
//if(yima()==0) P1_0=1;
//if(yima()==1) P1_0=0;
if(buf1_flag){
buf1=RECEIVE;
ctr=*buf1;
switch(ctr){
case ACK: ack();
break;
case NACK: nack();
break;
case FREE: free();
break;
case BUSY: busy();
break;
case DOWNLOAD: download();
break;
case UPLOAD: upload();
break;
case RUN: run();
break;
case READ_IR: read_ir();
break;
case READ_KEY: read_key();
break;
case STORE_IR: store_ir();
break;
default: buf1_flag=0;
REN=1;
break;
}
}
}
}
void sub(void){
}
void ie_0(void){
}
void tf_0(void){
}
void ie_1(void){
}
void tf_1(void){
}
void tf_2(void){
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -