毕竟世界太现实只能这么帮你
#ifndef _IR_
#define _IR_
char t0,t1,t2
uchar IR
void DelayIR()
{
uint i=130
while(i--)
}
void init_port2(void)
{
P2DIR&=~BIT0
P2SEL&=~BIT0
P2IES|=BIT0
P2IE|=BIT0
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR(void)
{
char CounterIR
P2IES&=~BIT0
if(P2IFG&BIT0)
{
P2IFG&=~BIT0
}
CounterIR=0
while(!(P2IN&BIT0))
{
DelayIR()
CounterIR++
}
if(CounterIR>85)
{
if(CounterIR<95)
{
t1++
for(char k=0k<17k++)
{
CounterIR=0
while((P2IN&BIT0)&&(CounterIR<50))
{
DelayIR()
CounterIR++
}
CounterIR=0
while((!(P2IN&BIT0))&&(CounterIR<10))
{
DelayIR()
CounterIR++
}
}
for(char j=0j<8j++)
{
CounterIR=0
while((P2IN&BIT0)&&(CounterIR<25))
{
DelayIR()
CounterIR++
}
IR<<=1
if(CounterIR>11)
IR|=BIT0
CounterIR=0
while((!(P2IN&BIT0))&&(CounterIR<10))
{
DelayIR()
CounterIR++
}
}
if((IR!=0xff)&&(IR!=0x00))
{
if(!(flag&dataflag))
{
if(IR==0x22)
{
flag|=runflag
}
else
{
Tar[0]=Tar[1]
Tar[1]=Tar[2]
Tar[2]=Tar[3]
Tar[3]=Tar[4]
switch (IR)
{
//case 0x22 : flag|=runflagbreak
case 0x68 : Tar[4]=0flag|=dataflagbreak
case 0x30 : Tar[4]=1flag|=dataflagbreak
case 0x18 : Tar[4]=2flag|=dataflagt2++break
case 0x7a : Tar[4]=3flag|=dataflagbreak
case 0x10 : Tar[4]=4flag|=dataflagbreak
case 0x38 : Tar[4]=5flag|=dataflagbreak
case 0x5a : Tar[4]=6flag|=dataflagbreak
case 0x42 : Tar[4]=7flag|=dataflagbreak
case 0x4a : Tar[4]=8flag|=dataflagbreak
case 0x52 : Tar[4]=9flag|=dataflagbreak
default : break
}
}
}
}
IR=0
}
}
for(int m=0m<250m++)
DelayIR()
P2IES|=BIT0
}
#endif
请采纳。
#include<reg51.h>#include<intrins.h>
#define NOP _nop_()
#define KEY_PRESS
#include "WIN24C02.H"
unsigned char code table[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71}
///////////////////////////////
#define uchar unsigned char
uchar times=0
uchar dis_buf[4]={0}
uchar key_flag=0
uchar key_cnt=0
uchar exint_flag=0
uchar buzzer_cnt=0
uchar int_flag=0
unsigned int int_cnt=0
///////////////////////////////////
sbit ir_Induction=P1^0
sbit ming=P3^7
sbit ir_s=P3^2
sbit iic_sda=P0^5
sbit iic_clk=P0^4
unsigned int ir_num=0
sfr isp_wdt = 0xE1
sfr isp_data= 0xE2
sfr isp_addrh = 0xE3
sfr isp_addrl = 0xE4
sfr isp_cmd = 0xE5
sfr isp_trig= 0xE6
sfr isp_contr = 0xE7
/*****************************************/
/***************STC89CXX_EEPROM扇区擦除程序*************************/
void STC89CXX_EEPROM_Erase(unsigned char t_addr)
{
isp_addrh = t_addr //可以不要 扇区里任意一个字节的地址都是扇区地址,无需求首地址,单片机会自己处理
isp_addrl = 0
// EA=0//关中断
isp_contr = 0x81
isp_cmd = 3 //扇区擦除,要某字节为空,必须擦除1个扇区
isp_trig = 0x46//先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
isp_trig = 0xb9//送完0xb9后 ISP/IAP 立即被触发启动
// EA = 1
// 开中断
}
/***********************************************/
void STC89CXX_EEPROM_Char_Write(unsigned int Write_addr ,unsigned int Write_data)
{
isp_data = (Write_data>>8)&0xff
isp_addrh = Write_addr/256//送地址高位
isp_addrl = Write_addr%256 //地址低位
// EA = 0/* 关中断 */
isp_contr = 0x81
isp_cmd = 2 //送扇区命令
isp_trig = 0x46
isp_trig = 0xb9
isp_data = Write_data&0xff
isp_addrl = (Write_addr+1)%256
isp_contr = 0x81
isp_cmd = 2 //送扇区命令
isp_trig = 0x46
isp_trig = 0xb9
// EA = 1
/* 开中断 */
}
/**************************************************************/
unsigned int STC89CXX_EEPROM_Char_Read(unsigned int Read_addr)
{
unsigned int temp=0
isp_addrh = Read_addr/256 //送地址高字节
isp_addrl = Read_addr%256 //送地址低字节(从0开始到num-1为止)
// EA = 0 /* 关中断 */
isp_contr = 0x81 /*20M,是0x80 orl 1 */
isp_cmd = 1 // 1表示字节读
isp_trig = 0x46 //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
isp_trig = 0xb9 //送完0xb9后 ISP/IAP 立即被触发启动
temp= (isp_data<<8)
isp_addrl = (Read_addr+1)%256
isp_contr = 0x81 /*20M,是0x80 orl 1 */
isp_cmd = 1 // 1表示字节读
isp_trig = 0x46 //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
isp_trig = 0xb9
temp|=isp_data
// EA = 1 //空指令
/* 开中断 */
return(temp)
}
static void iic_start()
{
iic_sda=1
iic_clk=1
NOP
iic_sda=0
iic_clk=0
}
static void iic_stop()
{
iic_clk=0
iic_sda=0
iic_clk=1
NOP
iic_sda=1
}
static void iic_write_byte(uchar dat)
{
uchar i
for(i=0i<8i++)
{
iic_clk=0
iic_sda=dat&0x80
NOP
iic_clk=1
NOP
dat<<=1
}
iic_clk=0
}
static uchar recive_ack()
{
uchar i=0
iic_clk=0
NOP
//iic_sda=1
NOP
iic_clk=1
NOP
NOP
while(iic_sda)
iic_clk=0
// if(i==200)
// return 0
//else
return 1
}
static void send_ack()
{
uchar i=0
iic_sda=1
NOP
iic_clk=0
NOP
iic_sda=0
NOP
iic_clk=1
NOP
iic_clk=0
iic_sda=1
}
void iic_write(uchar addr,uchar dat)
{
iic_start()
iic_write_byte(0xa0)
recive_ack()
iic_write_byte(addr)
recive_ack()
iic_write_byte(dat)
recive_ack()
iic_stop()
}
static uchar iic_read_byte()
{
uchar i
uchar dat=0
for(i=0i<8i++)
{
// iic_sda=0
dat<<=1
iic_clk=0
NOP
iic_clk=1
NOP
dat|=iic_sda
}
iic_clk=0
return dat
}
uchar iic_read(uchar addr)
{
uchar dat
iic_start()
iic_write_byte(0xa0)
recive_ack()
iic_write_byte(addr)
recive_ack()
iic_start()
iic_write_byte(0xa1)
recive_ack()
dat=iic_read_byte()
iic_stop()
return dat
}
void delay(unsigned int z)
{
unsigned int x,y
for(x=zx>0x--)
{
for(y=100y>0y--)
}
}
void iic_writes(uchar addr,void *buf,uchar num)
{
uchar i
uchar *pt=(uchar *)buf
for(i=0i<numi++)
{
iic_write(addr+i,pt[i])
delay(10)
}
}
void iic_reads(uchar addr,void *buf,uchar num)
{
uchar i
uchar *pt=(uchar *)buf
for(i=0i<numi++)
{
pt[i]=iic_read(addr+i)
//delay(3)
}
}
sbit KEY1=P3^6
unsigned char i_com=0x88
//unsigned char flag=0
void timer0_init()
{
TMOD=0x11
TH0=0xfd
TL0=0x80
ET0=1
TR0=1
TH1=0xfd
TL1=0x80
ET1=1
TR1=1
}
void ch_value( )
{
dis_buf[0]=(ir_num/1000)%10
dis_buf[1]=(ir_num/100)%10
dis_buf[2]=(ir_num/10)%10
dis_buf[3]=(ir_num)%10
}
void timer0_isq()interrupt 1
{
TH0=0xf8
TL0=0x84
P2=0xff
P0= (8>>(times))
P2=table[dis_buf[times]]
times=++times%4
}
void display()
{
P2=0xff
P0= (i_com>>(0))
P2=table[dis_buf[0]]
delay(3)
P2=0xff
P0= (i_com>>(1))
P2=table[dis_buf[1]]
delay(3)
P2=0xff
P0= (i_com>>(2))
P2=table[dis_buf[2]]
delay(3)
P2=0xff
P0= (i_com>>(3))
P2=table[dis_buf[3]]
delay(3)
}
void int_0() interrupt 0
{
// EA=0
//display()
exint_flag=1
int_flag=1
EX0=0
ir_num++
#ifdef KEY_PRESS
// IE0=0
#endif
// EA=1
}
void timer1_isq()interrupt 3
{
TH1=0xfa
TL1=0x84
if(key_flag&&(++key_cnt==10))
{
if(KEY1)
{
key_flag=0
}
key_cnt=0
}
if(int_flag&&(++int_cnt==20))
{
#ifdef KEY_PRESS
if(ir_s)
#else
if(!ir_s)
#endif
{
int_flag=0
}
int_cnt=0
}
if(exint_flag)
{
ming=0
}
if(exint_flag&&(++buzzer_cnt==40))
{
ming=1
buzzer_cnt=0
exint_flag=0
}
}
void main()
{
delay(500)
timer0_init()
WIN24C02_init() //24c02初始化子程序
EX0=1
IT0=1
IE0=0
EA=1
PT0=1
// ir_num=STC89CXX_EEPROM_Char_Read(0x2000)
iic_reads(0x10,&ir_num,2)
//ir_num=WIN24C02_read(0x00)|(WIN24C02_read(0x01)<<8)
ch_value()
while(1)
{
if(ir_s==1)
{
ir_s=0
}
ch_value()
//display()
if(!EX0)
{
if(ir_num>=9999)
ir_num=0
iic_writes(0x10,&ir_num,2)
while(int_flag&&KEY1)//display()
//STC89CXX_EEPROM_Erase(0x20)
//STC89CXX_EEPROM_Char_Write(0x2000,ir_num)//存数据到EEPROM
// WIN24C02_write(0x00,ir_num&0xff)
// WIN24C02_write(0x01,(ir_num>>8)&0xff)
//IE0=0
ch_value()
#ifdef KEY_PRESS
IE0=0
#else
IE0=0
#endif
EX0=1
}
if(!KEY1)
{
// display()
EX0=0
ir_num=0
//STC89CXX_EEPROM_Erase(0x20)
//STC89CXX_EEPROM_Char_Write(0x2000,ir_num)//存数据到EEPROM
iic_writes(0x10,&ir_num,2)
// WIN24C02_write(0x00,ir_num&0xff)
// WIN24C02_write(0x01,(ir_num>>8)&0xff)
ch_value()
// EA=1
while(!KEY1)
IE0=0
EX0=1
}
}
}
#include <reg51.h>#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit IRIN = P3^2 //遥控输入脚
sbit BEEP = P3^7 //蜂鸣器
sbit RELAY= P3^6 //继电器
uchar IR_buf[4]={0x00,0x00,0x00,0x00}//IR_buf[0]、IR_buf[1]为用户码低位、用户码高位接收缓冲区
// IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区
uchar disp_buf[2]={0x10,0x10} //显示缓冲单元,初值为0x10(即16),指向显示码的第16个"-"
uchar code seg_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}
//0~F和"-"符的显示码(字形码)
/********以下是0.14ms的x倍延时函数********/
void delay(uchar x) //延时x*0.14ms
{
uchar i
while(x--)
for (i = 0i<13i++)
}
/********以下是延时函数********/
void Delay_ms(uint xms)
{
uint i,j
for(i=xmsi>0i--) //i=xms即延时约xms毫秒
for(j=110j>0j--)
}
/*********以下是蜂鸣器响一声函数********/
void beep()
{
BEEP=0 //蜂鸣器响
Delay_ms(100)
BEEP=1 //关闭蜂鸣器
Delay_ms(100)
}
/********以下是显示函数********/
void Display()
{
P0=(seg_data[disp_buf[0]])
P2=0x7f
Delay_ms(1)
P0=(seg_data[disp_buf[1]])
P2=0xbf
Delay_ms(1)
}
/********以下是主函数********/
main()
{
EA=1EX0=1//允许总中断中断,使能 INT0 外部中断
IT0 = 1 //触发方式为脉冲负边沿触发
IRIN=1 //遥控输入脚置1
BEEP=1RELAY=1 //关闭蜂鸣器和继电器
P0=0xffP2=0xff //P0和P2口置1
Display() //调显示函数
while(1)
{
if(IR_buf[2]==0x02) //02H键(键值码为02H)
RELAY=0 //继电器吸合
if(IR_buf[2]==0x01) // 01H键(键值码为01H)
RELAY=1 //继电器关闭
Display()
}
}
/********以下是外中断0函数********/
void IR_decode() interrupt 0
{
uchar j,k,count=0
EX0 = 0 //暂时关闭外中断0中断请求
delay(20) //延时20*0.14=2.8ms
if (IRIN==1) //等待 IRIN低电平出现
{
EX0 =1 //开外中断0
return //中断返回
}
while (!IRIN) delay(1) //等待IRIN变为高电平,跳过9ms的低电平引导码
for (j=0j<4j++) //收集四组数据,即用户码低位、用户码高位、键值数据码和键值数码反码
{
for (k=0k<8k++) //每组数据有8位
{
while (IRIN)//等待IRIN变为低电平,跳过4.5ms的高电平引导码信号。
delay(1)
while (!IRIN) //等待IRIN变为高电平
delay(1)
while (IRIN) //对IRIN高电平时间进行计数
{
delay(1) //延时0.14ms
count++ //对0.14ms延时时间进行计数
if (count>=30)
{
EX0=1 //开外中断0
return //0.14ms计数过长则返回
}
}
IR_buf[j]=IR_buf[j] >>1 //若计数小于6,数据最高位补"0",说明收到的是"0"
if (count>=6) {IR_buf[j] = IR_buf[j] | 0x80} //若计数大于等于6,数据最高位补"1",说明收到的是"1"
count=0 //计数器清0
}
}
if (IR_buf[2]!=~IR_buf[3]) //将键数据反码取反后与键数据码码比较,若不等,表示接收数据错误,放弃
{
EX0=1
return
}
disp_buf[0]=IR_buf[2] &0x0f//取键码的低四位送显示缓冲
disp_buf[1]=IR_buf[2] >>4 //右移4次,高四位变为低四位送显示缓冲
Display() //调显示函数
beep() //蜂鸣器响一声
EX0 = 1 //开外中断0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)