📄 红外解码程序.c
字号:
#include<INTRINS.H>
#include <AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
#define leng(x) sizeof(x)
#include "lcd1602.h"
//定义多少分钟
#define parameter 1 //比如,这里是 1 ,则表示定时为1分钟(就不用在下面程序那修改了)
sbit p32=P3^2; //红外中断引脚
sbit p11=P1^1; //控制继电器的引脚
uchar dm,i,j,k;
uchar a[4];//存储代码
uchar l,m,n,p,q;
bit flag=0;
uint counter1=0,counter2=0;
uchar code tabl[]="0123456789abcdef";
uchar code str1[]="This is IR System!";
uchar code str2[]="IR DATA IS:00";
uchar code str_on[]= "SWITCH IS: ON";
uchar code str_off[]="SWITCH IS:OFF";
/*********************************/
void init_T0(void);
void display();
//void dis_off(void);
//void dis_on(void);
void ds1ms(void);
void ds2s(void);
void ds0_9ms(void);
//主程序
void main()
{
uchar cnt=0;
IT0=1;
EX0=1;
EA=1;
dm=0;
p11=0;
lcd_init();
////////////////////////////////////////////////////////////////////////////
//此段中的内容是开机时显示的字符--用以装饰,不是必要的
///////show "This is IR System!";
write_lcd_command (DISPLAYCLR); //清屏
for(cnt=0;cnt<leng(str1);cnt++)
{
if(cnt<16)
{
write_lcd_char(cnt,0,str1[cnt]); //调用液晶显示的程序包
}
else
{
write_lcd_char(cnt-16,1,str1[cnt]);
}
}
//////////delay
cnt=100; //刚开机时的显示文字延迟时间参数,想要久一点则加大此值
while(cnt--)
{
ds2s();
}
///////////////////////////////////////////////////////////////////////////
display();
//flag=1;m=4;n=0;
while(1)
{
///////////////////////
if(flag==1) //如果接收到有效的遥控数据则执行下面的内容
{
if((m==4)&&(n==0))//如果是接收到指定的按键码,如这里是"出仓"
{
init_T0(); //开始定时s
p11=1; //显示灯点亮
//dis_on(); //液晶显示"SWITCH IS: ON";
}
display(); //显示接收到的数字
ds2s(); ds2s(); ds2s();
flag=0;
}
///////////////////////
}
}
//初始化定时器
void init_T0(void)
{
TR0=0;
TMOD=0x01;
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
counter1=0;
counter2=0;
}
//外部中断0的函数
void E0_1(void) interrupt 0
{ uchar DL,DH,a0;
EA=0;
P2=0xff;
for(k=0;k<1;k++)
{
ds0_9ms();
if (p32==1) {break;}
while(p32==0);
ds0_9ms();a0=p32;
if(a0==1)
{ while(p32==1);
for(i=0;i<4;i++)
{
for(j=1;j<=8;j++)
{
while(p32==0);
ds0_9ms();
if(p32==1)
{ ds1ms();
dm=dm|0x80;
if(j<8) dm=dm>>1;
}
else
if(j<8)dm=dm>>1;
}
a[i]=dm;
dm=0;
}
}
}
DL=0X0F&a[2];
DH=a[2];
DH=DH>>4;
m=DL;n=DH;
DL=0X0F&a[0];
DH=a[0];
DH=DH>>4;
q=DL;p=DH;
ds2s();
ds2s();
ds2s();
flag=1;
EA=1;
}
//定时器中断程序
void T0_inter(void) interrupt 1
{
TR0=0;
TH0=0X3C;
TL0=0XB0;
TR0=1;
counter1+=1;
if(counter1==200) //10S
{
counter1=0;
counter2+=1;
//if(counter2==1) //定时多少秒 counter2=1表示10秒
if(counter2==(6*parameter)) //若用这句,则可以在本文头部那里修改parameter的值,
{ //parameter的值是多少就是定时多少分钟
p11=~p11;
TR0=0;
ET0=0;
counter2=0;
display();
}
}
}
//延时程序
/*********************************/
void ds1ms(void)
{
unsigned char i,j;
for(i=2;i>0;i--)
for(j=230;j>0;j--) ;
}
void ds2s(void)
{
unsigned char i,j,k;
for(i=12;i>0;i--)
for(j=80;j>0;j--)
for(k=10;k>0;k--) ;
}
/*********************************/
void ds0_9ms(void)
{
unsigned char j,k;
for(j=18;j>0;j--)
for(k=20;k>0;k--) ;
}
/*********************************/
//显示程序
/*********************************/
void display()
{
uchar i;
write_lcd_command (DISPLAYCLR); //清屏
for(i=0;i<leng(str2);i++)
{
write_lcd_char(i,0,str2[i]);
}
write_lcd_char(11,0,tabl[n]);
write_lcd_char(12,0,tabl[m]);
if(flag==0)
for(i=0;i<leng(str_off);i++)
{
write_lcd_char(i,1,str_off[i]);
}
else
for(i=0;i<leng(str_on);i++)
{
write_lcd_char(i,1,str_on[i]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -