单片机发射38k红外程序(c语言)

合集下载

38K红外遥控解码

38K红外遥控解码

#include <reg52.h>#define uint08 unsigned char#define uint16 unsigned intsbit IR=P3^2;uint08 a[4],k,IR_number;uint16 x;void init_int0_time0() //外部中断0与定时器中断0初始化函数{TMOD=0x01; //定义定时中断0在模式1TH0 =0x00; //0000 0000TL0 =0x00; //0000 0000TR0 =1;ET0 =1; //打开定时中断0IT0 =1; //边沿触发EX0 =1; //打开外部中断0EA =1; //打开总中断}void int0() interrupt 0{x=TH0*256+TL0; //读取两次中断时间差TH0=0;TL0=0; //恢复寄存器,准备下一次读数if(12000<=x&&x<=15000) //判断IR开始信号k =0;else if(1000<=x&&x<=2500) //判断IR信号为0/1{a[k/8]=a[k/8]>>1;if(2000<=x&&x<=2500)a[k/8]|=0x80;k++;}if(k==32&&a[2]==~a[3]) //判断读取的数据是否正确{IR_number=a[2];}}void time0(void) interrupt 1 //定时器0{}说明:a[0],a[1]为用户码,a[2]为红外遥控信号数据,a[3]为a[2]的反码,应用时在“IR_number=a[2];”这条语句前面加个判断用户码是否正确的语句,然后在主函数中读出IR_number就可以了,目的是提高解码的准确度,减少误差。

单片机红外发射(原理与设计程序)

单片机红外发射(原理与设计程序)

单片机红外发射(原理与设计程序)单片机红外发射(原理与设计程序)章节一:介绍本章节将介绍单片机红外发射的基本概念和作用,并提供一个概述。

1·1 单片机红外发射的基本概念单片机红外发射是指利用单片机来控制红外发射器发射红外信号的一种技术。

通过编写程序,单片机可以产生适合红外发射的脉冲序列,从而实现与其他设备的红外通信。

1·2 单片机红外发射的作用单片机红外发射广泛应用于遥控器、红外传感器等领域。

它可以实现人机交互、物联网设备的通信,以及自动化控制系统中的远程操作。

章节二:红外发射器的原理本章节将详细介绍红外发射器的工作原理及其组成部分。

2·1 红外发射器的工作原理红外发射器是一种将电能转换为红外辐射能的装置。

当通过红外发射器的电流改变时,会产生红外光束,用于传输信息。

2·2 红外发射器的组成部分红外发射器通常由红外发光二极管和相关的电路组成。

红外发光二极管是通过注入电流来产生红外光的元件,而电路则包括电源、驱动电路等。

章节三:单片机控制红外发射的设计程序本章节将介绍如何通过单片机来控制红外发射的设计程序。

3·1 单片机的选择根据实际需求,选择适合的单片机作为控制器。

常用的单片机有8051系列、AVR系列、PIC系列等。

3·2 编写红外发射控制程序根据红外发射器的工作原理和控制需求,编写控制程序。

程序需要设置红外发射器的脉冲宽度、频率等参数,并通过IO口输出相应的控制信号。

章节四:附件本文档涉及的附件有:1·红外发射器的数据手册●包含红外发射器的参数、引脚定义等详细信息。

2·单片机开发板原理图●包含单片机与红外发射器连接的电路设计。

法律名词及注释:1·单片机:指微型计算机的一种,是一种集成度高、功能强大的计算机芯片。

2·红外光束:指具有较长波长的电磁波,不可见于人眼,常用于遥控和红外传感器的通信。

单片机红外发射(原理与设计程序)

单片机红外发射(原理与设计程序)

单片机红外发射(原理与设计程序) 单片机红外发射(原理与设计程序)章节:1.引言1.1 目的1.2 背景2.原理2.1 红外通信基本原理2.2 单片机红外发射原理3.设计程序3.1 设置红外发射引脚3.2 初始化红外发射模块3.3 发送红外信号4.细节考虑4.1 红外信号编码4.2 发射距离与功率控制4.3 遥控码库选择5.测试与验证5.1 搭建测试平台5.2 编写测试程序5.3 测试结果与分析6.结论7.参考文献1.引言1.1 目的本文档旨在介绍单片机红外发射的原理,并提供一个设计程序的参考范本,以便于读者理解和实践。

1.2 背景红外通信在遥控器、无线键盘等电子设备中得到广泛应用。

单片机作为一种常用的嵌入式系统控制器,具有很好的灵活性和可编程性,因此在红外发射中也被广泛使用。

2.原理2.1 红外通信基本原理红外通信利用红外线传输数据,红外线具有波长长、不可见等特点,可以实现遥控信号的传输。

2.2 单片机红外发射原理单片机可以通过设置特定的引脚和相关的控制寄存器来控制红外发射模块,从而发送特定的红外信号。

3.设计程序3.1 设置红外发射引脚根据所选用的单片机和红外发射模块,确定红外发射引脚的连接方式,设置对应的引脚功能。

3.2 初始化红外发射模块在程序中初始化红外发射模块,包括设置工作模式、设置通信速率等。

3.3 发送红外信号编写发送红外信号的代码,通过控制红外发射引脚的电平变化,实现红外信号的发送。

4.细节考虑4.1 红外信号编码根据所需的红外通信协议,对红外信号进行编码。

常用的编码方式有NEC、RC5等。

4.2 发射距离与功率控制根据实际需求,调整红外发射模块的功率,以及发送的红外信号的占空比,以达到理想的发射距离和传输质量。

4.3 遥控码库选择在设计红外发射系统时,可以选择使用现有的遥控码库,减少编码工作的复杂程度。

5.测试与验证5.1 搭建测试平台搭建一个用于测试红外发射系统的测试平台,包括红外接收模块、测试设备等。

单片机红外发射原理及设计程序

单片机红外发射原理及设计程序

单片机红外发射原理及设计程序一、红外发射原理红外发射器是利用电子技术发射红外光信号的设备,其原理是通过电流和电压的作用,使红外发射二极管中的半导体材料产生拉格朗日反射(Lumogen) 效应而发射出红外光。

红外发射器主要由红外发射二极管和控制器组成。

控制器通过控制发射二极管的工作状态,即调节发射二极管的电压和电流,从而控制红外发射的功率和波长。

二、红外发射器的设计1.红外发射二极管选型选择适合的红外发射二极管至关重要。

常见的红外发射二极管有850nm和940nm两种波长,前者适用于大多数应用场景,后者适用于有特殊需求的场景。

2.红外发射驱动电路设计红外发射二极管一般工作在连续电流模式下,通过调节电流的大小来控制红外发射的功率。

可以采用可调电流源或者恒流源来驱动红外发射二极管。

可调电流源的原理是通过使用可调电阻和反馈电路,调节输出电流的大小。

恒流源的原理是通过使用运算放大器和负反馈电路,使输出电流保持不变。

3.单片机控制程序设计通过单片机来控制红外发射器的工作状态,可以实现各种功能。

以下是一个简单的红外发射程序设计示例:#include <reg52.h>sbit IR_LED = P1^0; // 红外发射器连接的IO口void delay_us(unsigned int n) // 微秒级延时函数unsigned char i;while (n--)for(i=0;i<10;i++);}void send_IR_data(unsigned char data) // 发送红外数据unsigned char i;for(i=0;i<8;i++)if(data & 0x01)IR_LED=1;//发射高电平表示逻辑1delay_us(560);IR_LED=0;delay_us(560);}elseIR_LED=1;//发射高电平表示逻辑0delay_us(560);IR_LED=0;delay_us(1700);}data >>= 1;}void mainsend_IR_data(0xAA); // 发送数据0xAAwhile(1);这个程序通过控制红外发射器连接的IO口的输出电平和延时函数,模拟了红外码的发送过程。

浅谈38K红外发射接受编码(非常好)

浅谈38K红外发射接受编码(非常好)

浅谈38K红外发射接受编码(非常好)之前做接触过一次红外遥控器,现在有空想用简单的话来聊一聊,下面有错误的地方欢迎改正指出:1:红外的概念不聊,那是一种物理存在。

以下聊38K红外发射接收,主要讲可编程的红外编码。

2:红外遥控红外遥控首先需要用来发“光”的红外发光管,还有一个接收光线的“接收管”(不是那种触发的红外对管),还有一个产生38K的信号源(可以是MCU中断实现还有就是市场上大把的红外编码IC),只需要简单的外围电路即可。

就单片机而言,为了增大红外发光管电流,需要用一个三极管驱动。

红外编码IC也只需要几个外围电路,规格书上都有提供,这里不提。

3:红外接收头(有不理解的地方可以在后面找到你想要的答案或者继续“百度”“谷歌")有必要可以看一下红外接收头内部组成的详细介绍。

接收收头分为电平头还有脉冲头。

电平型的:接收连续的38K信号,可以输出连续的低电平,时间可以无限长。

其内部放大及脉冲整形是直接耦合的,所以能够接收及输出连续的信号。

脉冲型的:只能接收间歇的38K信号,如果接收连续的38K信号,则几百ms后会一直保持高电平,除非距离非常近(二三十厘米以内)。

其内部放大及脉冲整形是电容耦合的,所以不能能够接收及输出连续的信号。

一般遥控用脉冲型的,只有特殊场合,比如串口调制输出,由于串口可能连续输出数据0,所以要用电平型的。

4:红外遥控中的载波到底是什么?(不要影响到你对其它载波的理解)第一次接触红外我看到’载波‘这个词就觉得生涩。

网上很多资料五花八门都描绘得很厉害、我们就从一下几点开始描述,相信的等会就懂:(1)38K怎么来的?这里只谈单片机给出,38K脉冲信号,占空比(脉冲的高电平比周期的值就是占空比)自己决定,既然是38K,那么脉冲的周期就是1/38000 S,记住这个不是高电平的时间长度,这个是一个脉冲的时间长度也就是一个周期,例如我们利用一个中断产生38K脉冲,占空比是1/2,我们的中断时间就要设置为 1/38000/2 S中断一次,然后通过相隔一次中断电平翻转一次就形成了一个频率为38K占空比1/2的脉冲。

自己写的51单片机的红外线遥控接收程序(C语言)

自己写的51单片机的红外线遥控接收程序(C语言)

//51单片机做的红外遥控实验(C语言)#include<reg51.h>#define u8 unsigned char#define u16 unsigned int#define ID 0x00 //本遥控器的ID号sbit ir=P3^3;code u8 seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9的段码code u8 s[]={1,0x40,0x48,0x04,0x02,0x05,0x54,0x0A,0x1E,0x0E}; u8 buf[4];bit ir_f=0;u8 nu;void delay(u16 x){while(x--);}void show(u16 x){u8 i=0,k=0;u8 s[4];kk:s[i]=x%10;if((x/10)>=1){x=x/10;i++;goto kk;}k=i+1;for(i=0;i<k;i++){P0=seg[s[i]];P2=~(8>>i);delay(300);P0=0XFF;P2=0XFF;}}void timer0_init(){TH0=0;TL0=0;TMOD|=0x01;TR0=0;}u16 low_test(){u16 t;TR0=1;while((ir==0)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0; //t=(TH*256+TL0);//机器周期数return t;}u16 high_test(){u16 t;TR0=1;while((ir==1)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0;return t;}/*u16 time_test(bit x){}*/u8 receive_8bit(){u8 d,i;u16 t;for(i=0;i<8;i++){t=low_test();t=high_test();d>>=1;if((t>=2750)&&(t<=3100)){d|=0x80;}}return d;}void ir_decode(){u16 t;u8 i;if(ir==0)//有遥控信号{t=low_test();//8295-9000us,倍频的是16590-18000if((t>=14500)&&(t<=18000))//检查引导码低电平时间{t=high_test();if((t>=8000)&&(t<=9000))//检查高电平{for(i=0;i<4;i++){buf[i]=receive_8bit();}if(buf[0]==(~buf[1]))//检查系统码是否正确{if(buf[0]==ID){if(buf[2]==(~buf[3])){//具体按键处理ir_f=1; //遥控有效}}}}}}}/*void key(){if(buf[2]==0x40){P1^=(1<<0);}if(buf[2]==0x48){P1^=(1<<1);}}*/void ir_execuse(){if(ir_f==1){switch(buf[2]){case 0x40:P1^=(1<<0);break;case 0x48:P1^=(1<<1);break;case 0x04:P1^=(1<<2);break;case 0x02:P1^=(1<<3);break;case 0x05:P1^=(1<<4);break;case 0x54:P1^=(1<<5);break;case 0x0A:P1^=(1<<6);break;case 0x1E:P1^=(1<<7);break;}ir_f=0;}}void show_d(){u8 j;for(j=0;j<10;j++){if(s[j]==buf[2]){nu=j;break;}}show(nu);}void isr_init(){EA=1;EX1=1;//外部中断,一直看3.3有没有下降沿。

STC单片机51简单的红外遥控发射程序C语言

STC单片机51简单的红外遥控发射程序C语言
for (j=0;j<43;j++) {s1=1;s1=1;Delay13us();} //高电平0.565ms无载波
}
void H(){ //红外1; 以低电平0.565ms,高电平1685表示1
uchar j;
for (j=0;j<43;j++) {s1=~s1;Delay13us();} //低电平0.565ms载波,模拟38KHZ
{
uint j;
while(1){
Delay3000ms();
//以下开始发送
for (j=0;j<692;j++) {s1=~s1;Delay13us();}//载波发送9ms的起始码
for (j=0;j<346;j++) {s1=1;Delay13us();} //无载波发送4.5ms的结果码
for (j=0;j<173;j++) {s1=1;Delay13us();} //2.25ms
for (j=0;j<44;j++) {s1=~s1;Delay13us();}//结束位
for (j=0;j<7400;j++) {s1=1;Delay13us();} //在延时96.2ms到108ms,在发送连发码
for (j=0;j<692;j++) {s1=~s1;Delay13us();}//载波发送9ms的起始码
for (j=0;j<173;j++) {s1=1;Delay13us();} //2.25ms
for (j=0;j<44;j++) {s1=~s1;Delay13us();}//结束位

单片机红外发射(原理与设计程序)

单片机红外发射(原理与设计程序)

单片机红外发射(原理与设计程序)单片机红外发射(原理与设计程序)1.引言本文档旨在介绍单片机红外发射的原理和设计程序。

红外发射是一种常用的通信手段,广泛应用于遥控器、红外传感器、无线通信等领域。

本文将从红外发射的原理入手,介绍单片机的红外发射设计和程序编写的具体步骤。

2.红外发射原理2.1 红外通信概述红外通信是一种无线通信技术,利用红外光传输信息。

它具有传输速率快、抗干扰能力强等优点,被广泛应用于遥控、数据传输等场景。

2.2 红外发射原理红外发射原理是通过控制红外发射器的开关,使其发出特定频率的红外光信号。

通常采用的红外发射器是红外发光二极管,当通过它流过的电流变化时,就会发出对应频率的红外光信号。

一般红外发射的频率为38kHz。

3.硬件设计3.1 单片机选择选择适合的单片机是进行红外发射设计的第一步。

常见的单片机有STM32、Arduino、PIC等,根据需求选择合适的型号。

3.2 电路设计a. 红外发射电路原理图设计红外发射电路时,需要将红外发射器连接到单片机的GPIO 引脚上,并加入适当的电阻和电容进行保护和调节。

b. 电路元件清单列出所需的电路元件清单,包括红外发射器、电阻、电容等。

4.程序设计4.1 开发环境配置配置所选单片机的开发环境,包括安装相应的开发工具、驱动程序等。

4.2 红外发射程序编写编写红外发射程序,实现发送特定频率的红外光信号。

可以使用相应的编程语言进行开发,如C语言、Arduino语言等。

5.附件本文档涉及的附件包括红外发射电路原理图、电路元件清单、红外发射程序源代码等。

6.法律名词及注释6.1 单片机:________一种集成电路芯片,包含中央处理单元(CPU)、内存、输入输出接口等功能。

6.2 红外光:________波长在红光和微波之间的电磁波,可见光的波长范围为380nm-780nm之间。

6.3 红外发光二极管:________一种能够发射红外光的二极管,常用于红外通信和遥控器等领域。

单片机红外发射(原理与设计程序)

单片机红外发射(原理与设计程序)

单片机红外发射(原理与设计程序)一、引言随着科技的发展和人们对智能化生活的需求增加,红外发射技术在家电遥控、无线通讯等领域得到广泛应用。

单片机是红外发射的一个重要组成部分,通过学习单片机红外发射的原理和设计相关的程序,我们可以更好地理解和应用该技术。

二、红外发射原理1. 红外通信原理红外通信是利用红外线传输信息的一种无线通信方式。

红外线是一种波长较长、能量较低的电磁波,不会对人体和周围环境产生明显危害。

通过调制红外线的频率和幅度,可以传输数字信号和模拟信号。

2. 红外发射原理红外发射是通过调制器件发射调制后的红外信号。

在单片机红外发射中,通常使用红外发射二极管作为发射器件。

通过控制单片机的输出引脚,可以使红外发射二极管发射出不同频率和占空比的红外信号。

3. 红外编码原理在红外通信中,通常需要对信号进行编码,以区分不同的按键和数据。

红外编码有多种方式,常用的有NEC编码和RC-5编码。

通过将特定的按键和数据映射成不同的编码,可以实现红外通信的多样化功能。

三、单片机红外发射设计程序1. 硬件连接,需要将红外发射二极管连接到单片机的输出引脚。

具体连接方式可参考所使用的单片机的引脚定义和电路原理图。

2. 程序设计步骤设计单片机红外发射程序的步骤如下:1. 初始化单片机的IO引脚,将输出引脚设置为输出模式。

2. 设置红外发射的调制频率和占空比。

3. 根据需要发送的数据,将数据转换成对应的红外编码。

4. 根据红外编码,控制输出引脚的电平变化,以模拟红外信号的调制。

5. 持续一定时间后,停止红外发射,将输出引脚恢复到默认状态。

3. 程序示例下面是一个简单的单片机红外发射程序示例:cinclude <reg52.h>// 红外发射引脚sbit IR_Pin = P1^0;// 发射红外信号的函数void transmitIRSignal() {// 设置调制频率和占空比//// 发送红外编码//// 控制引脚电平变化,模拟红外信号//// 停止红外发射IR_Pin = 0;}void mn() {// 初始化IO引脚IR_Pin = 0;// 发射红外信号transmitIRSignal();while(1) {//}}四、通过对单片机红外发射的原理和设计程序的学习,我们了解到红外发射是利用红外通信原理,通过控制红外发射二极管发射相应的红外信号。

红外发射程序实例

红外发射程序实例

红外发射实例一:#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit IR_OUT=P1^0 ;void delay_ms(uint ms){uint i,j;for(i=0;i<120;i++){for(j=0;j<ms;j++);}}//T1 13us产生一次中断用于产生38K载波//T0 方式1 16位用于定时void Init_Timer(void){TMOD=0x21; //T0 mode 1 T1 mode 2 TH1=256-(1000*11.0592/38.0/12)/2+0.5;//特殊TL1=TH1;ET1=1;EA=1;}//发送引导码发送方:4.5ms高电平 4.5ms低电平void Send_Start_Bit(void) //TR1的值=发送的电平{//4.5ms 1TH0=(65536-8295)/256;TL0=(65536-8295)%256;TR0=1;TR1=1;while(!TF0);TR1=0;TF0=0;TR0=0;IR_OUT=0;//4.5ms 0TH0=(65536-4146)/256;TL0=(65536-4146)%256;TR0=1;TR1=0;while(!TF0);TR1=0;TF0=0;TR0=0;IR_OUT=0;}//发送0void Send_Bit_0(void) {//0.565ms 1TH0=(65536-521)/256;TL0=(65536-521)%256; TR0=1;TR1=1;while(!TF0);TR1=0;TF0=0;TR0=0;IR_OUT=0;//0.565ms 0TH0=(65536-521)/256; TL0=(65536-521)%256; TR0=1;TR1=0;while(!TF0);TR1=0;TF0=0;TR0=0;IR_OUT=0;}//发送1void Send_Bit_1(void) {//0.565ms 1TH0=(65536-521)/256;TL0=(65536-521)%256;TR0=1;TR1=1;while(!TF0);TR1=0;TF0=0;TR0=0;IR_OUT=0;//1.685ms 0TH0=(65536-1563)/256;TL0=(65536-1563)%256;TR0=1;TR1=0;while(!TF0);TR1=0;TF0=0;TR0=0;IR_OUT=0;}void Send_over(void) //发送一个结束码,因为最后一个位只有遇到下降沿才能读取(发射端的上升沿){//0.500ms 1 //小于0.5ms 接收端很难识别到TH0=(65536-500)/256;TL0=(65536-500)%256;TR0=1;TR1=1;while(!TF0);TR1=0;TF0=0;TR0=0;IR_OUT=0;//0.500ms 0TH0=(65536-500)/256;TL0=(65536-500)%256;TR0=1;TR1=0;while(!TF0);TR1=0;TF0=0;TR0=0;IR_OUT=0;}//发送一字节 8位void Send_Char(){unsigned char i,j1,j2,j3,j4;j1=0xBE;j2=0x41;j3=0xDE;j4=0x20;Send_Start_Bit();Send_Bit_0();//发射引导吗for(i=0;i<8;i++){if(j1&0x80)Send_Bit_0();elseSend_Bit_1();j1=j1<<1;}for(i=0;i<8;i++) {if(j2&0x80)Send_Bit_0();elseSend_Bit_1();j2=j2<<1;//先发射低位}for(i=0;i<8;i++) {if(j3&0x80)Send_Bit_0();elseSend_Bit_1();j3=j3<<1;}for(i=0;i<8;i++){if(j4&0x80)Send_Bit_0();elseSend_Bit_1();j4=j4<<1;//先发射低位}Send_over();//结束符}/*void Delay10ms(void) {TH0=(65536-10000)/256;TL0=(65536-10000)%256;TR0=1;while(!TF0);TF0=0;}*/void T1_ISR(void) interrupt 3 {IR_OUT=!IR_OUT;}void main(void){Init_Timer();while(1){// Send_Start_Bit();// Send_Bit_1();Send_Char();delay_ms(1000);}}//-----------------------------------------------------------------------//T1 ISR红外发射程序实例二:*******************************/#include<reg52.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit IR=P3^2; //将IR位定义为P3.2引脚sbit RS=P2^4; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^5; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^6; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚sbit BEEP = P3^0; //蜂鸣器控制端口P36unsigned char flag;unsigned char code string[ ]= {"1602IR-CODE TEST"}; unsigned char a[4]; //储存用户码、用户反码与键数据码、键数据反码unsigned int LowTime,HighTime; //储存高、低电平的宽度unsigned int a0,a1,a2,a3,a4,a5,a6,a7;sbit p37=P3^7;/***************************************************** 函数功能:延时1ms***************************************************/ void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/***************************************************** 函数功能:延时若干毫秒入口参数:n***************************************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*********************************************************/ void beep() //蜂鸣器响一声函数{unsigned char i;for (i=0;i<100;i++){delay1ms();BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器delay(250); //延时}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。

单片机红外发射程序

单片机红外发射程序
TR0=0; //关闭定时器0
ircode=ircode>>1; //将数据右移,即从低位到高--------------------------------------------------------------------
void ir_send() //发送红外数据
void main()
{
timer0_init(); //定时0初始化
count=0; //中断计数先清0
irflag=0; //红外发射标志先置0
while(1)
{
keyscan(); //键值扫描
if(keyflag) //若有按键按下
{
else set_count=43;//35; //为0则0.565ms的低电平 (//后为12M晶振下的数值)
irflag=0; //低电平则不发射
count=0; //中断计数清0
TR0=1; //开启定时器0
while(count<set_count); //等待发送完
TMOD=0x02; //定时0 8位自动重装模式
ET0=1;
TH0=0xe6;//0xf3; //定时13us,38K红外矩形波,晶振24M (//后为12M晶振下的数值)
TL0=0xe6;
}
//---------------------------------------------------------------------------
TR0=0;
ir=1; //发射完了关闭红外发射二极管
}
//---------------------------------------------------------------------------

单片机红外发射(原理与设计程序)

单片机红外发射(原理与设计程序)

单片机红外发射(原理与设计程序)单片机红外发射(原理与设计程序)简介在现代电子产品中,红外发射技术被广泛应用于无线通信、遥控器、红外测距等方面。

单片机作为嵌入式系统的核心部件,能够通过编程实现红外发射功能。

本文将介绍单片机红外发射的原理,并给出设计程序的示例。

红外发射原理红外发射系统主要由红外发射器(IR LED)、驱动电路和单片机组成。

其工作原理如下:1. 单片机通过输出高低电平控制驱动电路的开关,从而控制红外发射器的通断;2. 当驱动电路导通时,电流通过红外发射器,红外发射器将电能转化为红外光能;3. 红外光经过透明材料(如红外透明窗口)传出;4. 红外光在空气中传播,可被红外接收器接收。

设计程序示例下面是一个基于C语言编写的单片机红外发射程序示例:include <reg51.h>define IR_LED P1_0 // 定义红外发射器引脚void delay_us(unsigned int us) // 微秒级延时函数{while (us--){// 根据实际单片机的时钟频率调整延时时间TMOD = 0x01; // 定时器 T0 工作在模式 1TL0 = 0xFC; // 初始化 T0 计数值,产生 1us 延时 TH0 = 0xFF;TR0 = 1; // 启动 T0while (TF0 == 0); // 等待 T0 溢出TF0 = 0; // 清除 T0 溢出标志TR0 = 0; // 停止 T0}void InfraredTransmit() // 红外发射函数{IR_LED = 1; // 发射红外光delay_us(1000); // 发射持续时间为1msIR_LED = 0; // 停止发射delay_us(1000); // 发射间隔为1ms}void mn(){while (1){InfraredTransmit(); // 循环发射红外光}}以上示例代码使用51单片机,通过P1_0引脚控制红外发射器的通断。

基于51单片机红外发射与接收C程序(word文档良心出品)

基于51单片机红外发射与接收C程序(word文档良心出品)
sbit key3=P3^5;
sbit LED=P1^0; //发射指示灯
sbit out=P3^7;
uchar i,a,num1;
void init()//初始化作用
{
key1=1;
key2=1;
key3=1;
}
void delay(uchar aa)
{
uchar bb,cc;
for(bb=aa;bb>0;bb--)
for(num1=8;num1>0;num1--) //原来用的是a后来出错,肯定在这里!
{
khz(40);
if(num&0x01)
delayms(93);//delay 1.5ms
else
delayms(65);//delay 1ms
num=num>>1;
}
khz(20);
}
void tishi()
if(key1==0)
{
while(!key1);
fashu(0xf3);
tishi();
}
}
if(key2==0)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
if(key2==0)
{
while(!key2);
fashu(0x3f);
while(1)
{
keyscan();
}
}
红外接收程序
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char

红外收发模块51单片机程序部分

红外收发模块51单片机程序部分

深圳市技新电子科技有限公司www.jixin.pro红外收发模块51单片机程序部分V1.0.0.0红外收发模块51单片机程序部分1、红外收发原理介绍1.1红外接收头决定了通信的频率是38KHZ红外通信模块发射红外光的频率是38KHZ,这个频率是由红外接收探头决定的,市场上还有其他频率的产品这里不讨论。

技小新的红外收发模块上面用的接收头就是这种38KHZ 的,型号是IRM-3638T。

红外发射的探头没有这个频率限制,所以可以用单片机自由控制。

1.2红外通信的流程单片机A控制红外发光管,发射38KHZ频率的光,同时遵守一定的通信规则,比如电影里常见的“摩斯密码”。

红外接收头连接着单片机B,红外接收头收到红外光后会输出一连串的高低电平到单片机B,单片机B根据“摩斯密码”的规则解码。

这样就完成了一次红外通信。

1.3红外载波调制的约定我们使用的通信方式叫做载波调制。

(1)由于发射频率是38KHZ,很容易得出发射一个信号的周期是26.3uS.(2)对于发射端:“载波发射”一个周期是,发光8.77uS+不发光17.53uS。

“载波不发射”一个周期是,26.3uS不发光。

(3)对于接收端:如果收到了一个“载波发射”信号,输出低电平26.3uS。

如果收到了一个“载波不发射”信号(其实就是没有收到信号),输出高电平26.3uS。

真正使用时候要发送一连串的“载波发射”和“载波不发射”,这样接收端输出的是连续的脉冲。

(注意,仅仅一个“载波发射”并不能让接收端正确输出。

)1.4NEC_upd6121红外通信协议。

这是很多遥控器厂商都在使用的协议。

它的协议约定如下:(1)引导码:342个连续“载波发射”+171个“载波不发射”。

接收端的反应是9mS的低电平+4.5mS的高电平。

(2)数据“0”表示为:21个连续“载波发射”+21个连续“载波不发射”。

接收端的反应是:0.56mS的低电平+0.56mS的高电平。

(3)数据“1”表示为:21个连续“载波发射”+64个连续“载波不发射”。

单片机红外线发射程序

单片机红外线发射程序

/******************************************************************** *********************红外发射接收原理:发射波形(38kHZ代替高电平) 接收波形(接受到的电平反向)38kHZ 38kHZ 发射____1__________ ______1_________||||||_____0________||||||___0_______------------->___0__| |___0__|------------->定时器工作方式在方式2中把16位的计数器拆分成两个8位计数器,底8位作计数器用以保存计数初值。

方式2适合用于比较精确的脉冲信号发生器,和波特率发生器方式2计算初值X,X=256-tfosc/12(或6)12和6是分频,一般情况下取12;t为所设计时时间单位为s,fosc为晶振单位为Hz。

计数器每加1耗费一个机器机器周期,一个机器周期等于12个振荡脉冲周期即如果震荡周期为1s计数器加一要花12s ,若晶振为fosc=12MHz计数频率为fcont=fosc/12为1MHz即计数器加1消耗1us ,每计1所华的时间为t=T=1/fcont=1(fosc/12)=12/fosc/**********************************************************/#include "reg51.h"#include "keyscan.c"sbit TR_DATA=P2^7;/***********************************************函数名:delay_ms子函数:无输入:n输出:无功能:延迟nMS子程序24MHz,n MS经滤波器检测非常精确------------------------------------------------************************************************/void delay_ms(unsigned int n){unsigned int i=218;for(;n>0;n--){while(i--);i=218;}}/***********************************************函数名:TransData子函数:无输入:_data输出:无功能:发送数据9ms38k 4ms低电平说明:开始时序:9ms38kHz方波接着4ms低电平|||||||||||||||||||||||____0___ 信号"1"时序:1ms的38kHZ方波接着1ms低电平信号"0"时序:1ms的38kHZ方波接着3ms低电平结束时序:5ms的38kHZ************************************************/void TransData(unsigned char _data){unsigned char i;TR0=1; //启动38K发生器delay_ms(9); //9ms的启动38KHz脉冲TR0=0; //关闭38K发生器TR_DATA= 0; //输出0delay_ms(5); //5ms的启动低电平for(i=0;i<8;i++){TR0=1; //启动38K发生器delay_ms(1); //产生1ms的38k脉冲供红外发射管发射TR0=0; //关闭38K发生器TR_DATA= 0; //输出0if(_data&(1<<i))delay_ms(1); //1左移i位,先发低位//如果发送1 则高低电平比为1:1 else delay_ms(3); //如果发送0 则高低电平比为1:3 }TR0=1; //启动38K发生器delay_ms(5); //5ms的结束38K方波TR0=0; //关闭38K发生器TR_DATA= 0; //输出0}//主函数void main(){unsigned char key;TMOD=0x02; //定时器T0工作方式2TH0=0xE6;TL0=0xE6; //自动重载EA=1;ET0=1;while(1){TR_DATA=0;while(!key_on()); //等待按下按键key=key_scan();if(key == 20)continue;//如果key=20结束本次循环TransData(key);while(key_on()); //等按键松开}}//定时器零产生38K方波void T0_interrupt(void) interrupt 1{TR_DATA=~TR_DATA;TR0=1;}。

51单片机的红外收发C程序_带仿真图

51单片机的红外收发C程序_带仿真图

发射部分#include <reg52.h>sbit P2_2=P2^2;sbit signalBit=P2^1; //发送信号标志位sbit LED=P3^7; //使能信号位,将E位定义为P2.2引脚unsigned char irData[]={0x14,0xeb,0xf0,0x0f}; //存放所有的控制码unsigned char mazhi[]={0x33,0x22,0xeb,0x14};unsigned char key,send_flag=0;void SendIRdata(unsigned char irdata[4]); //红外发射函数void anjian_send(unsigned char flag);void delay(unsigned int tt) //延时函数{while(--tt);}void main(void){signalBit=0;P2_2= 0;TMOD=0x12;//设定定时器1和0工作方式为1和2EX1=1;IT1=1;ET0 =1; //定时器0中断允许ET1 =1;TH0= 0xf4;TL0= 0xf4; //设定时值0为38K 也就是每隔13us中断一次周期为26us TR0= 0;//先关闭定时器0TR1= 0;IP=0X01;EA=1; //允许CPU中断LED=0;while(1){P1=0XF0;if(send_flag==1){anjian_send(key);send_flag=0;}}}void anjian_send(unsigned char flag){unsigned char zhi=flag;switch(zhi){case 0xee: SendIRdata(irData); break;case 0xbe: SendIRdata(irData); break;case 0xde: SendIRdata(irData); break;case 0x7e: SendIRdata(irData); break;case 0xed: SendIRdata(irData); break;case 0xdd: SendIRdata(irData); break;case 0xbd: SendIRdata(irData); break;case 0x7d: SendIRdata(irData); break;case 0xeb: SendIRdata(irData); break;case 0xdb: SendIRdata(irData); break;case 0xbb: SendIRdata(mazhi); break;case 0x7b: SendIRdata(mazhi); break;case 0xe7: SendIRdata(mazhi); break;case 0xd7: SendIRdata(mazhi); break;case 0xb7: SendIRdata(mazhi); break;case 0x77: SendIRdata(mazhi); break;}}/******* 定时器1中断处理***********/void isr_T1(void) interrupt 3{}/******* 定时器0中断处理38K载波发生器***********/ void timeint(void) interrupt 1{P2_2=~P2_2; //产生38k的载波信号}/**************** 中断1 键盘的扫描********************/ void Int1(void) interrupt 2{unsigned char l,h;P1=0XF0;l=P1;l=l&0xf0;if(l!=0xf0){delay(10);if(l!=0xf0){l=P1&0xf0;l=l|0x0f;P1=l;h=P1;h=h&0x0f;l=l&0xf0;key=h+l;send_flag=1;LED=~LED;}}}/********* 红外发射函数************/void SendIRdata(unsigned char *mData){unsigned char i,j;unsigned char test[4];for(i=0;i<4;i++)test[i]=mData[i];TR0=1; //开定时器T0 输出38K载波/********* 发送9ms的高电平************/TH1=0XDF; //装入初值设置波延时为9msTL1=0XE3;TR1=1; //启动T1工作定时所需时间signalBit=1; //发送信号while(!TF1);TF1=0;/********* 发送4.5ms的低电平*************/TH1=0xef;TL1=0xf0;signalBit=0;while(!TF1);TF1=0;/********* 发送用户码控制码控制反码***********/for(j=0;j<4;j++)//发送十六位地址的前八位{for(i=0;i<8;i++){//先发送0.565ms的38KHZ红外波(即编码中0.565ms的高电平)TH1=0XFE;TL1=0X70;signalBit=1;while(!TF1);TF1=0;//停止发送红外信号(即编码中的高电平)if(test[j]&0x01) //判断二进制数个位为1还是0{TH1=0XFA; // //1为宽的低电平,持续时间1.685msTL1=0X30;}else{TH1=0XFE; //0为窄的低电平,持续时间0.56msTL1=0x50;}signalBit=0;while(!TF1);TF1=0;test[j]=test[j]>>1;}}TR1=0; //发送停止位关闭定时器T0signalBit=1;delay(100);signalBit=0;TR0=0; //关闭定时器T1}检测部分#include<reg52.h> //包含单片机寄存器的头文件#define uchar unsigned char#define uint unsigned intsbit IR=P3^2; //将IR位定义为P3.2引脚sbit rs=P2^4; //寄存器选择位,将RS位定义为P2.0引脚sbit rw=P2^5; //读写选择位,将RW位定义为P2.1引脚sbit e=P2^6; //使能信号位,将E位定义为P2.2引脚sbit LED=P2^0; //使能信号位,将E位定义为P2.2引脚unsigned char code string[ ]= "1602IR-CODE TEST";unsigned char code smg[]="code:";unsigned char code MA[]="0123456789ABCDEF";unsigned char a[4]; //储存用户码、用户反码与键数据码、键数据反码unsigned int LowTime,HighTime; //储存高、低电平的宽度0-65535void delay(unsigned int tt){while(--tt);}void w_cmd(unsigned char dd){rs=0;rw=0;e=0;P0=dd;delay(50);e=1;delay(50);e=0;}void w_dat(unsigned char dd){rs=1;rw=0;e=0;P0=dd;delay(50);e=1;delay(50);e=0;}void disp_ma(uchar *p,uchar hang,uchar wei){if(hang==1)w_cmd(0x80+wei);if(hang==2)w_cmd(0xc0+wei);while(*p!='\0'){w_dat(*p);p++;}}void init_LCD(void){w_cmd(0x38);delay(1000);w_cmd(0x38);delay(300);w_cmd(0x38);//注意顺序,设置工作方式,显示模式设置delay(300);w_cmd(0x08);//注意顺序,关闭显示w_cmd(0x01);//清屏w_cmd(0x06);//光标·画面滚动模式设置w_cmd(0x0c);//显示及光标模式设}/************************************************************函数功能:对4个字节的用户码和键数据码进行解码说明:解码正确,返回1,否则返回0出口参数:dat*************************************************************/bit DeCode(void){unsigned char i,j;unsigned char temp=0; //储存解码出的数据for(i=0;i<4;i++) //连续读取4个用户码和键数据码{for(j=0;j<8;j++) //每个码有8位数字{temp=temp>>1; //temp中的各数据位右移一位,因为先读出的是低位数据TH0=0; //定时器清0TL0=0; //定时器清0TR0=1; //开启定时器T0while(IR==0) ;//如果是低电平就等待低电平计时TR0=0; //关闭定时器T0LowTime=TH0*256+TL0; //保存低电平宽度TH0=0; //定时器清0TL0=0; //定时器清0TR0=1; //开启定时器T0while(IR==1); //如果是高电平就等待TR0=0; //关闭定时器T0HighTime=TH0*256+TL0; //保存高电平宽度if((LowTime<300)||(LowTime>620))return 0; //如果低电平长度不在合理范围,则认为出错,停止解码if((HighTime>300)&&(HighTime<620)) //如果高电平时间在560微秒左右,即计数560/1.085=516次{temp=temp&0x7f; //(520-100=420, 520+100=620),则该位是0}if((HighTime>1300)&&(HighTime<1850)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次{temp=temp|0x80; //(1550-250=1300,1550+250=1800),则该位是1}}a[i]=temp; //将解码出的字节值储存在a[i]temp=0;}if(a[2]==~a[3])return 1; //解码正确,返回1else return 0;}/************************************************************函数功能:1602LCD显示*************************************************************/void Disp(void){w_cmd(0xc5); // 设置显示位置为第二行的第6个字w_dat(MA[(a[0]>>4)]);w_dat(MA[(a[0]&0x0f)]);w_dat(0x20);w_dat(MA[(a[1]>>4)]);w_dat(MA[(a[1]&0x0f)]);w_dat(0x20);w_dat(MA[(a[2]>>4)]);w_dat(MA[(a[2]&0x0f)]);w_dat(0x20);w_dat(MA[(a[3]>>4)]);w_dat(MA[(a[3]&0x0f)]);}/************************************************************函数功能:主函数*************************************************************/void main(){init_LCD(); //调用LCD初始化函数disp_ma(string,1,0);disp_ma(smg,2,0);EX0=1; //开外中断0ET0=1; //定时器T0中断允许IT0=1; //外中断的下降沿触发TMOD=0x01; //使用定时器T0的模式1TR0=0; //定时器T0关闭EA=1; //开启总中断while(1); //等待红外信号产生的中断}/************************************************************函数功能:红外线触发的外中断处理函数*************************************************************/void Int0(void) interrupt 0{EX0=0; //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号TH0=0; //定时器T0的高8位清0TL0=0; //定时器T0的低8位清0TR0=1; //开启定时器T0while(IR==0); //如果是低电平就等待,给引导码低电平计时TR0=0; //关闭定时器T0LowTime=TH0*256+TL0; //保存低电平时间TH0=0; //定时器T0的高8位清0TL0=0; //定时器T0的低8位清0TR0=1; //开启定时器T0while(IR==1); //如果是高电平就等待,给引导码高电平计时TR0=0; //关闭定时器T0HighTime=TH0*256+TL0; //保存引导码的高电平长度if((LowTime>7500&&LowTime<10000)&&(HighTime>3500&&HighTime<5000)){//次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.if(DeCode()==1) // 执行遥控解码功能Disp();//调用1602LCD显示函数}EX0=1; //开启外中断EX0}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机发射38k红外程序(c语言)
#include <AT89X51.h>
static bit OP; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
//停止发送红外信号(即编码中的高电平)
if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
{
endcount=41; //1为宽的高电平
}
else
{
endcount=15; //0为窄的高电平
irdata=iraddr1;
for(i=0;i<8;i++)
{
//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
{
count = 0;
flag = 0;
OP = 0;
P3_4 = 0;
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
ห้องสมุดไป่ตู้ TH0 = 0xFF;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送十六位地址的后八位
irdata=iraddr2;
for(i=0;i<8;i++)
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
OP = 0;
}
P3_4 = OP;
}
void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;
//发送9ms的起始码
endcount=223;
irdata=irdata>>1;
}
//发送八位数据的反码
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1;//开始计数
iraddr1=3;
iraddr2=252;
do{
delay();
SendIRdata(12);
}while(1);
flag=1;
count=0;
do{}while(count<endcount);
//发送4.5ms的结果码
endcount=117
flag=0;
count=0;
do{}while(count<endcount);
//发送十六位地址的前八位
}
//定时器0中断处理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
count++;
if (flag==1)
{
OP=~OP;
static unsigned char flag; //红外发送标志
char iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节
void SendIRdata(char p_irdata);
void delay();
void main(void)
//发送八位数据
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
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<100;j++)
{
}
}
}
相关文档
最新文档