STC12C5A60S2红外发射程序

/*
移植时注意与传统8051单片机的软件延时不同,因12c系列处理速度更快!!!
*/
#include"STC12C5A60S2.h"
#define uchar unsigned char //数据类型的宏定义
#define uint unsigned int //数据类型的宏定义
sbit OUT=P3^4;
sbit KEY=P2^4;
static bit OP; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag; //红外发送标志
char iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节
char senddat[5];
void SendIRdata(char *p_irdata);
void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);
void delay();
sbit P27=P2^7;
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};
//共阳数码管显示字型码数组 1011 1111 "-"
void delay1ms(uint i)
{

uchar j;
while(i--)
{
for(j=0;j<115;j++) //1ms基准延时程序
{
;
}
}
}
void display(unsigned char i)
{
P27=0; //选通最有端的数码管显示
P0=table[i]; //显示i参数传来的字型码
}

unsigned char temp;
void main(void)
{
unsigned char n=0;
P1=0XFf;
count = 0; flag = 0;
OP = 0;
OUT = 0;
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1;//开始计数
IT0=1;
EX0=1;
EA=1;
iraddr1=0x00;
iraddr2=0x01;



while(1)
{


P1=0xff; //先向P1口写1;端口读状态
P1=0xf0;

temp=P1;
if(temp!=0xf0)
{
delay1ms(700);
if(temp!=0xf0)
{
P1=0xfe;
temp=P1;
switch(temp)
{
case(0xee):senddat[n]=0,display(0),++n;break;
case(0xde):senddat[n]=1,display(1),++n;break;
case(0xbe):senddat[n]=2,display(2),++n;break;
case(0x7e):senddat[n]=3,display(3),++n;break;

}

P1=0xfd;
temp=P1;
switch(temp)
{
case(0xed):senddat[n]=4,display(4),++n;break;
case(0xdd):senddat[n]=5,display(5),++n;break;
case(0xbd):senddat[n]=6,display(6),++n;break;
case(0x7d):senddat[n]=7,display(7),++n;break;
}

P1=0xfb;
temp=P1;
switch(temp)
{
case(0xeb):senddat[n]=8,display(8),++n;break;
case(0xdb):senddat[n]=9,display(9),++n;break;
case(0xbb):display(10),n=0,SendIRdata(senddat),delay(); break;



// case(0x7b):senddat=table[11];break;
}

/*P1=0xf7;
temp=P1;
switch(temp)
{
case(0xe7):senddat=table[12];break;
case(0xd7):senddat=table[13];break;
case(0xb7):senddat=table[14];break;
case(0x77):senddat=table[15];break;
}

*/
}

}

//SendIRdata(senddat);
//delay() ;

//P1=0XFE;

}


}

/* do{

delay();
while(KEY);

DelayMs(10);

if(!KEY)
{
SendIRdata(senddat);
P1=0XFE;
}
else
{

DelayMs(1);
}
P1=0XFF;
}while(1);
}
//外部中断0处理
void exint(void) interrupt 0
{

// IE0=0;
}*/

//定时器0中断处理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
count++;
if (flag==1)
{
OP=~OP;
}
else
{
OP = 0;
}
OUT = OP;
}
void SendIRdata(char *p_irdata)
{
int i;
char irdata; //发送9ms的起始码
endcount=340;
flag=1;
count=0;
do{}while(countendcount=170 ;
flag=0;
count=0;
do{}while(count//发送十六位地址的前八位
irdata=iraddr1;
for(i=0;i<8;i++)
{ //先发送0.56ms的38KHZ红外波即编码中0.56ms的低电平
endcount=20;
flag=1;
count=0;
do{}while(count//if(irdata&0X01) //判断二进制数个位为1还是0
if(irdata-(irdata/2)*2)
{
endcount=80; //1为宽的高电平
}
else
{
endcount=40; //0为窄的高电平
}
flag=0;
count=0;
do{}while(countirdata=irdata>>1;
}
//发送十六位地址的后八位
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=20;
flag=1;
count=0;
do{}while(count// if(irdata&0X01)
if(irdata-(irdata/2)*2)
{
endcount=80;
}
else
{
endcount=40;
}
flag=0;
count=0;
do{}while(countirdata=irdata>>1;
}
//发送八位数据
irdata=p_irdata[0];
for(i=0;i<8;i++)
{
endcount=20;
flag=1;
count=0;
do{}while(countif(irdata-(irdata/2)*2)
//if(irdata&0X01)
{
endcount=81;
}
else
{
endcount=40;
}
flag=0;
count=0;
do{}while(countirdata=irdata>>1;
}
//发送后八位数据
irdata=p_irdata[1];
for(i=0;i<8;i++)
{
endcount=20;
flag=1;
count=0;
do{}while(count//if(irdata&0x01)
if(irdata-(irdata/2)*2)
{
endcount=80;
}
else
{
endcount=40;
}
flag=0;
count=0;
do{}while(countirdata=irdata>>1;
}
endcount=20;
flag=1;
count=0;
do{}while(countflag=0;
}
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{

while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
void delay()
{
int i,j;
for(i=0;i<400;i++)

{
for(j=0;j<100;j++)
{
}
}
}

相关文档
最新文档