📄 irda1.c
字号:
//---红外发送---
//-----头文件引用-----
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#define C8279 XBYTE[0xF239] //定义8279命令口地址
#define D8279 XBYTE[0xF238] //定义8279数据口地址
#define uchar unsigned char
#define uint unsigned int
//-----宏声明-----
uchar code ledseg[]={0x3f,0x06,0x5b,0x4F,0x66,0x6D,0x7D,0x07,0x7F,//显示'0,1,2,3,4,5,6,7,8'
0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40};//'9,a,b,c,d,e,f, ,-'
uchar idata diss[8]; //定义显示缓冲区
uchar idata fsdat[4]={0x00,0xff,0x55,0xaa}; //定义发送数据数组
uchar key; //键值变量
bit bdata kbz; //定义键标志
bit bdata B_firstbz,B_againbz; //定义第一次B键、重复B键标志
bit bdata ruptbz; //定义中断标志
sbit FSCOM=P1^6; //定义发送口
//-----初始化-----
void first()
{
C8279=0x00; //置8279工作方式
C8279=0x2f; //置键盘扫描速率
C8279=0xc1; //清除LED显示
while(C8279&0x80); //等待清除结束
TMOD=0x01; //置定时器工作方式
ET0=1;
EA=1;
diss[7]=fsdat[0]/16; //初始显示送缓冲区
diss[6]=fsdat[0]%16;
diss[5]=fsdat[1]/16;
diss[4]=fsdat[1]%16;
diss[3]=0x10;
diss[2]=0x10;
diss[1]=0x11;
diss[0]=0x11;
}
//-----中断程序-----
void ctc0() interrupt 1
{
TR0=0;
ruptbz=1; //置中断标志
}
//-----取键-----
void getkey()
{
if((C8279&0x07)==0x00) //无键按下
{kbz=0;} //置无键标志
else
{
kbz=1; //置有键标志
C8279=0x40; //读FIFO RAM命令
key=D8279; //读键值
key=(key&0x3f); //取键盘数据低6位
}
}
//----显示-----
void disp()
{
uchar i;
for(i=0;i<8;i++)
{
C8279=i+0x80;
D8279=ledseg[diss[i]];
}
}
//-----A键处理-----
void keya()
{
uchar m;
for(m=2;m>0;m--)//取数据的高低位
{
do
{
getkey();
}while(kbz==0);
diss[m-1]=key;
disp();
}
fsdat[2]=diss[1]*16+diss[0];//数据保存
fsdat[3]=~fsdat[2];
}
//-----键控-----
void inkey()
{
do
{
do
{
getkey(); //取键
}while(kbz==0);
if(key==0x0a)
{
do
{
keya(); //A键处理
Loop:do
{
getkey(); //取键
}while(kbz==0);
}while(key==0x0a);
if(key==0x0b)
{
B_firstbz=1; //置第一次B键标志
B_againbz=0;
return;
}
else
{
diss[1]=key; //取数据高位
disp();
do
{
getkey(); //取键
}while(kbz==0);
diss[0]=key; //取数据低位
disp();
fsdat[2]=diss[1]*16+diss[0];//保存输入键值
fsdat[3]=~fsdat[2];
goto Loop;
}
}
if(key==0x0b)
{
if(B_firstbz==1)
{
B_firstbz=0;
B_againbz=1; //置重复B键标志
return;
}
}
}while((key!=0x0a)&&(key!=0x0b));
}
//-----载波-----
void carrier_wave()
{
uchar i;
FSCOM=1; //8us(1)
for(i=0;i<1;i++);
FSCOM=1;
FSCOM=1;
FSCOM=0; //18us(0)
for(i=0;i<2;i++);
}
//-----发送数据-----
void transdat()
{
uchar i,j,k;
for(i=0;i<255;i++) //发送引导码9200us(H)
{
carrier_wave();
}
for(i=0;i<99;i++) //发送引导码9200us(H)
{
carrier_wave();
}
if(B_againbz==1) //判是否为持续码
{ //发送持续码2200us(L)
FSCOM=0;
TH0=0xf8; //设置定时器初值
TL0=0x54;
TR0=1;
while(ruptbz==0); //等待时间到
ruptbz=0;
for(i=0;i<26;i++) //发送结束码680us(H)
{
carrier_wave(); //载波
}
FSCOM=0;
return;
}
else
{ //发送引导码4400us(L)
FSCOM=0;
TH0=0xf0; //设置定时器初值
TL0=0x68;
TR0=1;
while(ruptbz==0); //等待时间到
ruptbz=0;
for(k=0;k<4;k++) //发送32位数据编码
{
for(j=0;j<8;j++)
{
for(i=0;i<26;i++) //发送数据码680us(H)
{
carrier_wave();//载波
}
FSCOM=0;
if((_cror_(fsdat[k],j)&0x01)==0x01)//判数据位是否为‘1’?
{
TH0=0xfa; //为‘1’定时1600uS(L)
TL0=0x6d;
TR0=1;
while(ruptbz==0);//等待时间到
ruptbz=0;
}
else // 为‘0’定时500us(L)
{
TH0=0xfe;
TL0=0x64;
TR0=1;
while(ruptbz==0);//等待时间到
ruptbz=0;
}
}
}
for(i=0;i<26;i++) //送结束码680us(H)
{
carrier_wave();
}
}
}
//-----主程序-----
main()
{
first(); //初始化
while(1)
{
disp(); //显示
inkey(); //键控
transdat(); //发送
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -