导航:首页 > 操作系统 > 单片机红外电平捕捉信号

单片机红外电平捕捉信号

发布时间:2024-10-28 02:26:49

‘壹’ 红外感应器能反馈什么信号给单片机

输出的是个开关信号。电压非高即低。比如,前面没有物体的时候输出的是低电平。看做0。然后有了物体,输出为高电平。看做1.这样就可以了
要么就是相反的。无物体的时候是高电平,有物体的时候是低电平。

‘贰’ 求一个程序,单片机接收红外传感器发出的信号,然后再控制步进电机动作!

我有红外遥控器的程序。
你自己可以改改:
/*-----------------------------------------------
名称:遥控器红外解码液晶显示
日期:2009.5
修改:无
内容:
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include<intrins.h>

#define TURE 1
#define FALSE 0

sbit IR=P3^2; //红外接口标志
sbit RS = P2^4;//Pin4
sbit RW = P2^5;//Pin5
sbit E = P2^6;//Pin6

#define Data P0//数据端口
unsigned int hour,minute,second,count;char code Tab[16]="0123456789ABCDEF";
char data TimeNum[]=" ";char data Test1[]=" ";
/******************************************************************/
/* 变量声明 */
/******************************************************************/

unsigned char irtime;//红外用全局变量
bit irpro_ok,irok;
unsigned char IRcord[4]; //处理后的红外码,分别是 客户码,客户码,数据码,数据码反码
unsigned char irdata[33]; //33个高低电平的时间数据

/******************************************************************/
/* 函数声明 */
/******************************************************************/
void Ir_work(void);
void Ircordpro(void);
void ShowString (unsigned char line,char *ptr);
/******************************************************************/
/* 定时器0中断服务函数 */
/******************************************************************/

void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
{
irtime++; //用于计数2个下降沿之间的时间
}

/******************************************************************/
/* 外部中断0函数 */
/******************************************************************/
void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
static unsigned char i; //接收红外信号处理
static bit startflag; //是否开始处理标志位

if(startflag)
{

if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
i=0;

irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}

else
{irtime=0;startflag=1;}

}
/******************************************************************/
/* 定时器0初始化 */
/******************************************************************/
void TIM0init(void)//定时器0初始化
{

TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00; //重载值
TL0=0x00; //初始化值
ET0=1; //开中断
TR0=1;
}
/******************************************************************/
/* 外部中断初始化 */
/******************************************************************/
void EX0init(void)
{
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1; //使能外部中断
EA = 1; //开总中断
}
/******************************************************************/
/* 红外键值处理 */
/******************************************************************/

void Ir_work(void) //红外键值散转程序
{

TimeNum[5] = Tab[IRcord[0]/16]; //处理客户码并显示
TimeNum[6] = Tab[IRcord[0]%16];
TimeNum[8] = Tab[IRcord[1]/16]; //处理客户码并显示
TimeNum[9] = Tab[IRcord[1]%16];
TimeNum[11] = Tab[IRcord[2]/16]; //处理数据码并显示
TimeNum[12] = Tab[IRcord[2]%16];
TimeNum[14] = Tab[IRcord[3]/16]; //处理数据反码并显示
TimeNum[15] = Tab[IRcord[3]%16];

ShowString(1,TimeNum);//显示处理过后的码值
irpro_ok=0; //处理完成后清楚标志位

}
/******************************************************************/
/* 红外解码函数处理 */
/******************************************************************/
void Ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value;

k=1;
for(i=0;i<4;i++) //处理4个字节
{
for(j=1;j<=8;j++) //处理1个字节8位
{
cord=irdata[k];
if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
{
value=value|0x80;
}
else
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord[i]=value;
value=0;
} irpro_ok=1;//处理完毕标志位置1

}

/******************************************************************/
/* 微秒延时函数 */
/******************************************************************/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;/* Crystal frequency in 12MHz*/
while(--uscnt);
}
/******************************************************************/
/* 毫秒函数声明 */
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}

/******************************************************************/
/* 写入命令函数 */
/******************************************************************/
void WriteCommand(unsigned char c)
{
DelayMs(5);//操作前短暂延时,保证信号稳定
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/******************************************************************/
/* 写入数据函数 */
/******************************************************************/
void WriteData(unsigned char c)
{
DelayMs(5); //操作前短暂延时,保证信号稳定
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/******************************************************************/
/* 写入字节函数 */
/******************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
p=pos+0xb0; //是第二行则命令代码高4位为0xc
else
p=pos+0x80; //是第二行则命令代码高4位为0x8
WriteCommand (p);//写命令
WriteData (c); //写数据
}
/******************************************************************/
/* 写入字符串函数 */
/******************************************************************/
void ShowString (unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for (i=0;i<16;i++)
ShowChar (l++,*(ptr+i));//循环显示16个字符
}
/******************************************************************/
/* 初始化函数 */
/******************************************************************/
void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //显示光标移动位置
WriteCommand(0x0c); //显示开及光标设置
WriteCommand(0x01); //显示清屏

}
/******************************************************************/
/* 主函数 */
/******************************************************************/

void main(void)
{
EX0init(); //初始化外部中断
TIM0init();//初始化定时器

InitLcd(); //初始化液晶 DelayMs(15);
sprintf(Test1," haixiang MCU "); //显示第一行固定信息 ShowString(0,Test1);
sprintf(TimeNum,"Code ");//显示第二行固定信息 ShowString(1,TimeNum);
while(1)//主循环
{
if(irok) //如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}

if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
{
Ir_work();
}
}
}

‘叁’ 单片机如何对红外对管高低电平值进行扫描并取平均值,求各位给提供个思路,谢谢!

给你一个我曾经用过的思路,我是用做智能车路径检测的。
1、红外对管对于光照强度敏感性比较强,首先要保证环境光照尽量均匀。

2、一般对于红外信号采用AD转换的方式,由单片机A/D口读取AD值。
3、采用单片机定时中断方式,比如10ms定时中断,每进入中断一次,读取AD值,存入数组,连续存入10次或20次。下次读入的数据将按照左移位的方式将原先的数据覆盖。数组的元素个数可视精度而定。
4、舍弃掉最大值、最小值,亦可对和上次采集相差比较大的舍弃掉。最终对剩下的取平均可得到一个值。可以作为此通道的平均值。
5、其实上面只是一种取均值的方法,可以查一下相关取均值的资料,程序灵活处理。

‘肆’ 单片机PWM捕捉模式是什么意思

PWM,是脉冲宽度调制的意思,主要参数有三个,整个脉冲的宽度,高电平的宽度,占空比。这里假设高电平有效。
占空比 = 高电平的宽度 / 整个脉冲的宽度。PWM捕捉,就是同时捕捉PWM的整个脉冲的宽度以及高电平的宽度,进而可以计算得出占空比。
典型的做法,在脉冲上升沿和下降沿都执行捕捉。上升沿复位并启动定时器,下降沿捕捉定时器内容作为高电平宽度,下一个上升沿捕捉定时器内容作为整个脉冲的宽度,同时复位并重启定时器以进行下一轮捕捉。

‘伍’ 给单片机输入电平信号怎么做

  1. 如果是0 和 1 的电平输入的话,一般会先将红外信号的输出通过一个 HC7414 滞回比较器,接到单片机。

  2. 因为,红外的信号有可能处在非0 非1 的中间电压,如果不接一个滞回较器,单片机将无法识别其是0是1, 更重要的是,这时候可能会引起0和1来回无序跳变。

  3. 当然,如果在程序里以这种非0非1的状态进行过滤一上,不要7414也是可以的。 如果采用外部中断的方式的话,是一定不能省这个滞回比较器的。

  4. 因为三极管的基射极饱和电压为0.6V,所以这里计算应该是(24v-0.6v)/20k,这就是基极电阻上的电流,而100k是为了在没有输入24v时,把基极拉低使得三极管截至。你也可以把这个电阻放在20k电阻的另一端。

阅读全文

与单片机红外电平捕捉信号相关的资料

热点内容
中兴研发面试要写算法吗 浏览:64
linux系统配置文件 浏览:600
php登录网页模板 浏览:930
windownginxphp 浏览:508
resync命令 浏览:535
dos命令手册 浏览:286
硅谷编程二维数组 浏览:40
inside游戏什么时候移植安卓 浏览:943
极光安卓是什么 浏览:540
如何减少pdf文件大小 浏览:83
ios屏幕新建文件夹 浏览:297
单片机固定座 浏览:322
一名程序员的生活 浏览:989
服务器电源卡插头如何拔 浏览:487
三水资料加密怎么选 浏览:800
android收不到udp广播 浏览:383
如何免费开手游非官方服务器 浏览:648
全译本和编译 浏览:55
安卓系统如何清理垃圾 浏览:373
word转换pdf转换在线 浏览:199