一 红外发射部分
/********************************************************************
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code Disp_Tab[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39, 0x5e,0x79,0x71}; //共阴极字型码
/*************************************************************
* 名称 :init()
* 功能 : 对系统进行初始化设定
* 输入 : 无
* 输出 : 无
*************************************************************/
void init(void)
{
P1=oxff;
P3^5=0;
IE=0; //关总中断与中断1
TMOD=0x20; //设定时器T1方式2自动重装模式
TH1=0xf3; //定时13us
TL0=0xf3;
EA=1; //开总中断
SCON=0; //置串行口工作方式0
}
/**************************************************************
* 名称 : main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
*************************************************************/
void main (void)
{
init(); //调用初始化子程序
Void(); //调用各功能子程序
}
2.键盘扫描子程序
sbit ir=P1^0;//红外发射管控制脚,使用12M晶振
unsigned int count, set_count; //中断计数,设定中断次数
bit irflag,keyflag; //红外发送标志位,按键标志位
unsigned char irsys[]={0x00,0xff};//16位用户码
unsigned char irdata,ircode; //发送的红外数据
Void xianshi(void)
{
uchar Key_Value; //读出的键值
while(1)
{
P1 = 0xf0;
if(P1 != 0xf0)
{
Delay_1ms(15); //按键消抖
if(P1 != 0xf0)
{
Key_Value = Keyscan();
}
}
P0 = table[Key_Value];
P2 = 0x07;
void Delay_1ms(uint i)//1ms延时
{
uchar x,j; //输入x (延时一毫秒的个数)*/
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
void delay() //延时,延时时间大概为10ms
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++);
}
uchar Keyscan(void) //按键值 实现按键的读取
{
uchar i,j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j=0; j<4; j++)
{
P1 = Buffer[j];/*以下三个_nop_();作用为让 P1 口的状态稳定*/
delay();
temp = 0x01;
for(i=0; i<4; i++)
{
if(!(P1 & temp))
{
return (i+j*4);
}
temp <<= 1;
}
}
}
3.红外编码子程序
sbit P3^5;
static bit OP; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag; //红外发送标志
void SendIRdata(char p_irdata);
void delay();
void mamn(void)
{
count = 0;
flag = 0;
OP = 0;
P3^4 = 0;
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
TH0 = 0xFF;
TL0 = 0xE8; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1;//开始计数
iraddr1=3;
iraddr2=252;
do{
unsigned char i;
delay();
SendIRdata(12);
}while(1);
}
//定时器1中断处理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE8; //设定时值为38K 也就是每隔26us中断一次
count++;
if (flag==1)
{
OP=~OP;
}
else
{
OP = 0;
}
P3^5 = OP;
}
void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;
//发送3ms的起始码
endcount=223;
flag=1;
count=0;
do{}while(count<endcount);
//发送4.5ms的结果码
endcount=117;
flag=0;
count=0;
do{}while(count<endcount);
//发送十六位地址的前八位
irdata=iraddr1;
for(i=0;i<8;i++)
{
//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
endcount=10;
flag=1;
count=0;
do{}while(count<endcount)
//停止发送红外信号(即编码中的高电平)
if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
{
endcount=41; //1为宽的高电平
}
else
{
endcount=15; //0为窄的高电平
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送十六位地址的后八位
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送八位数据
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送八位数据的反码
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}
void delay()
{
int i,j;
for(i = 0; i < 400; i++)
}
for(j = 0; j < 200; j++)
}
}
}
*****************单片机红外发射***********************************
4.显示子程序
Void mimakey(void)
sbit load=P2^6;
sbit din=P2^4;
sbit clk=P2^5 ;
#define decode_mode 0x09
#define intensity 0x0a
#define scan_limit 0x0b
#define shut_down 0x0c
#define display_test 0x0f
void write7221( unsigned char address,unsigned char dat)
{
unsigned char i;
load=0;
for(i=0;i<6;i++)
{
clk=0;
din=(bit)(address&0x80);
address<<=1;
clk=1;
}
for(i=0;i<6;i++)
{
clk=0;
din=(bit)(dat&0x80);
dat<<=1;
clk=1;
}
load=1;
}
void initial_7221(void)
{
write7221(shut_down,0x01);
write7221(display_test,0x00);
write7221(decode_mode,0xff);
write7221(scan_limit,0x07);
write7221(intensity,0x03);
}
二 接收部分
1.主程序
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code Disp_Tab[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39, 0x5e,0x79,0x71}; //共阴极字型码
/*************************************************************
* 名称 :init()
* 功能 : 对系统进行初始化设定
* 输入 : 无
* 输出 : 无
*************************************************************/
void init(void)
{
IT0=1; //负跳变中断
EX0=1; //开外部中断0
EA=1; //开总中断
P2^0=0; //关锁
P2^3=0; //关报警
SCON=0; //置串行口工作方式0
delay(); 延时
}
/**************************************************************
* 名称 : main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
*************************************************************/
void main (void)
{
init(); //调用初始化子程序
Void(); //调用各功能子程序
}
2.键盘扫描及密码修改子程序
Void mimakey(void)
{
uchar i, key;//i循环变量 key建好暂存器
bit keyok;
for (i=0;i<6;i++) {mima [i]=i+2; //设置初始密码234567
{diss [i]=i;} //在无输入时显示012345
disp(diss);
key=keyin(); //等待键按下 度键号
/******************以下为输入密码状态***********、
if((key==0x0b)&(keyok==0))
{
for(i=0;i,<6;i++) //六位密码输入
{
key=keyin(); //读一位
if(key==0x0b) break;
if(key>=0x0a) {do{key=keyin();}
while(key>=0x0a);}
mima[i]=key; //密码数字存于mima暂存器中
diss[i]=15; //没输入一位密码显示E
disp(diss);
}
if ( key!=0x0d)
{
key=keyin ();
if (key==0x0d); //六位密码输入完成时,是否确认
else
{
if (key!=0x0c)
while (keyin() !=0x0c); //等待确认键按下
while (page_rd (0,6, &diss[0]==0); //在24w02中读取密码
keyok=1;
for(i=0;i<6;i++) //比较六位密码
{
if (mima[i]!=diss[i] ) {keyok=0; break;} //密码错误是解锁状态为0
}
if(keyok==1) {right=1; error=0;}
else {right=0; error=1 ; } //当密码错误时闭锁
if(error=1) p^0=0 p^3=0;
If(i=0;i++;i=3) p^3=0;
while void delay() //延时,延时时间大概为10s
{
int i,j;
for(i=0; i<=100; i++)
}
}
}
/******************以上为输入密码状态*****************************/
/******************以下为修改密码状态*****************************/
if(keyok==1)
{
if(key0x0d)
{
keyok=0; right=0; error=1; //解锁状态设为0,闭锁
}
if ( key==0x0a ) //是设定键时,进入密码设置状态
{
for ( i=0; i<6; i++)
{
key=keyin ();
if ( key==0x0d ) break;
if ( key>=0x0a ) {do { key=keyin ();} while ( key.=0x0a ); }
mima [i]=key; //密码数字存于mima暂存器中
diss [i]=14;
disp ( diss ); //送显示
}
if ( key!=0x0d ) //6位输入完成时是否要确认,未完成则返回
{
key=keyin ();
if (key==0x0d); //按下取消键时,设置密码取消
else
{
if (key!=0x0c) while (keyin()!=0x0c); //等待确认键按下
while (page_wr (0,6,&mima[0])==0); //写入密码24w02
}
}
}
}
/*****************以上未修改密码状态*************************/
}
3.红外解码子程序
Void jiema(void)
unsigned char d_code_x(unsigned int t) {
if(t<3ms )
return 0;
else
{
if(t>3ms)
return 1;
else
return 0xff;//错误
}
}
{
unsigned int temp;
unsigned char dd_code;
if(TR0==0)
{
TH0=TL0=0;
TR0=1;
}
else
{
TR0=0;
temp=TH0*256+TL0;
TH0=TL0=0;
TR0=1;
dd_code=d_code_x(temp);
if(dd_code==0||dd_code==1)
{
code_t=(code_t<<1)+dd_code;
code_length++;
}
else
{
if(code_length>=_code_length && code_right==0)
{
code_tt=code_t;//红外代码正确
code_right=1;
}
code_length=0;
code_t=0;
}
}
}
4.显示子程序
Void mimakey(void)
sbit load=P2^6;
sbit din=P2^4;
sbit clk=P2^5 ;
#define decode_mode 0x09
#define intensity 0x0a
#define scan_limit 0x0b
#define shut_down 0x0c
#define display_test 0x0f
void write7221( unsigned char address,unsigned char dat)
{
unsigned char i;
load=0;
for(i=0;i<6;i++)
{
clk=0;
din=(bit)(address&0x80);
address<<=1;
clk=1;
}
for(i=0;i<6;i++)
{
clk=0;
din=(bit)(dat&0x80);
dat<<=1;
clk=1;
}
load=1;
}
void initial_7221(void)
{
write7221(shut_down,0x01);
write7221(display_test,0x00);
write7221(decode_mode,0xff);
write7221(scan_limit,0x07);
write7221(intensity,0x03);
}
|
|