📄 红外.c
字号:
#include<at89x51.h>
#include<absacc.h>
#include<INTRINS.H>
#define SEGMENT P0
#define BIT_LED P2
#define fosc 12
#define time0 2600 //26us
unsigned char data display_bit,display_buffer[8];
unsigned char data time0_h,time0_l;
unsigned int idata time0_times;
unsigned char data send_data[6]={0xc1,0x60,0x11,0x22,0x33,0x55};
unsigned int showdata;
unsigned char data TEMP;
int *point;
unsigned int shdata;
unsigned int keyin;
unsigned int kbempty;
sbit C =0xA0;
sbit ACC_0=0xE0;
sbit ACC_1=0XE1;
sbit ACC_2=0XE2;
sbit ACC_3=0XE3;
sbit ACC_4=0XE4;
sbit ACC_5=0XE5;
sbit ACC_6=0XE6;
sbit ACC_7=0XE7;
sbit dataout=0xB7;//P3.7
unsigned char get_code(unsigned char i);
void display(void);
void breakdata(void);
void unitial(void);
void delay13us(void);
void send(void);
void getkeyin(void);
/**************************主程序*****************************/
main()
{
unitial();
_nop_();
delay13us();
ACC_0=1;
ACC_1=0;
ACC_2=1;
keyin=ACC;
send();
while(1)
{
getkeyin();
display();
}
}
/**************初始化******************************/
void unitial(void)
{
//point=&display_buffer[0];
display_bit=0x01;
BIT_LED=0;
TMOD=0X02;
// time0_times=65536-time0*fosc/12;
// time0_h=(time0_times/256);
// time0_l=(time0_times%256);
//TH0=time0_h;
//TL0=time0_l;
TH0=0X00;
TL0=0XC0;
TR0=1;
EA=1;
//ET0=1;
dataout=1;
P3_2=1;
P3_7=1;
shdata=keyin;
}
/*********************************************/
void time0_int(void) interrupt 1
{
//TH0=time0_h;
//TL0=time0_l;
P1=~P1;
}
/***********************************************/
unsigned char get_code (unsigned char i)
{
unsigned char p;
switch(i)
{
case 0: p=0x3F; break; /*0*/
case 1: p=0x06; break; /*1*/
case 2: p=0x5B; break; /*2*/
case 3: p=0x4F; break; /*3*/
case 4: p=0x66; break; /*4*/
case 5: p=0x6D; break; /*5*/
case 6: p=0x7D; break; /*6*/
case 7: p=0x07; break; /*7*/
case 8: p=0x7F; break; /*8*/
case 9: p=0x67; break; /*9*/
case 10: p=0x77; break; /*A*/
case 11: p=0x7C; break; /*B*/
case 12: p=0x39; break; /*C*/
case 13: p=0x5E; break; /*D*/
case 14: p=0x79; break; /*E*/
case 15: p=0x71; break; /*F*/
case 16: p=0x00; break; /*灭灯*/
default: break;
}
return ((~p) & 0x7F);
}
/**************************************************/
void display(void)
{
int f;
showdata=keyin;
breakdata();
for(f=0;f<6;f++)
{unsigned char i;
switch(display_bit)
{
case 1:i=0;break;
case 2:i=1;break;
case 4:i=2;break;
case 8:i=3;break;
case 16:i=4;break;
// case 32:i=5;break;
// case 64:i=6;break;
// case 128:i=7;break;
default:break;
}
BIT_LED=0;
SEGMENT=get_code(display_buffer[i]);
TEMP=SEGMENT;
BIT_LED=display_bit;
if(display_bit<0x32)
{display_bit=display_bit*2;}
else display_bit=0x01;
}
}
/******************数据拆分**********************/
void breakdata(void)
{ int j;
for(j=0;j<6;j++)
{
display_buffer[j]=showdata%10;
showdata=showdata/10;
//*(point+1);
}
}
/*******************************延时13us*********************************/
void delay13us(void)
{ _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/**************************数据发送程序********************************/
void send (void)
{ int n;
unsigned p;
int q;
P3_2=0;
//发送9ms发始码
for(p=0;p<680;p++)//3us 700*13=9100
{
dataout=!dataout;//1us
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();//12us
}
//发送4.5ms结果
for(p=0;p<333;p++)//300*13=3900
{dataout=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();//12us
}
for(q=0;q<6;q++)
{ showdata=send_data[q];
for(n=0;n<=7;n++) //3us
{ ACC=showdata; //1us
if(ACC_7==1) //3us 发送1
{ int l; //1us
for(l=0;l<42;l++)
{dataout=!dataout;//1
_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12us
}
for(l=0;l<128;l++)//3us
{dataout=1; //1us
_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12us
}
}
else //调制38K信号,发送0;
{ int m;
for(m=0;m<43;m++)//3us
{
dataout=!dataout;//1us
_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12us
}
for(m=0;m<42;m++)
{dataout=1;
_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12us
}
}
showdata=showdata<<1;//7us
}//10us
for(n=0;n<45;n++)//3us
{
dataout=!dataout;//1us
_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12us
}
P3_2=1;
P3_7=1;
}
}
/************************************************************
键盘扫描及取键值程序
unsigned char getkeyin(void)
功能:键值放入keyin。
************************************************************/
void getkeyin(void)
{
unsigned char temp;
P1=0x0f;
temp=P1;
if(temp==0x0f)
{
kbempty=0;
// keyin=0xff;
}
// if(kbempty==0&&temp!=0x0f)//按键有松开过
// {
// for(i=10;i>0;i--); //键盘去抖延迟
P1=0xef; //P1^4=0
temp=P1;
temp=temp&0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:keyin=3;send();break; //keyin='3'
case 0x0d:keyin=7;send();break; //keyin='7'
case 0x0b:keyin=11;send();break; //keyin='11'
case 0x07:keyin=15;send();break; //keyin='15'
// default:keyin=0xff;
}
kbempty=1;
//return(keyin) ;
}
P1=0xdf; //P1^5=0
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:keyin=2;break; //keyin='2'
case 0x0d:keyin=6;break; //keyin='6'
case 0x0b:keyin=10;break; //keyin='10'
case 0x07:keyin=14;break; //keyin='14'
// default:keyin=0xff;
}
kbempty=1;
//return(keyin) ;
}
P1=0xbf; //P1^6=0
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:keyin=1;break; //keyin='1'
case 0x0d:keyin=5;break; //keyin='5'
case 0x0b:keyin=9;break; //keyin='9'
case 0x07:keyin=13;break; //keyin='13'
// default:keyin=0xff;
}
kbempty=1;
//return(keyin) ;
}
P1=0x7f; //P1^7=0
temp=P1;
temp=temp & 0x0f;
if (temp!=0x0f)
{
switch(temp)
{
case 0x0e:keyin=0;break; //keyin='0'
case 0x0d:keyin=4;break; //keyin='4'
case 0x0b:keyin=8;break; //keyin='8'
case 0x07:keyin=12;break; //keyin='12'
// default:keyin=0xff;
}
kbempty=1;
}
//return(keyin) ;
}
// keyin=0xff;
//return(keyin);
// }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -