用C语言编写的红外发射与接收程序

用C语言编写的红外发射与接收程序,第1张

给你一段430单片机遥控器解码的程序吧,也就是接收部分

毕竟世界太现实只能这么帮你

#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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12017877.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存