我想写一个这样的程序,不断向sm0038发射红外线,一旦收不到红外线,51单片机利用定时器开始计时.

2024-12-04 08:40:23
推荐回答(3个)
回答1:

//////////////////////////////////////
//晶振频率为6MHz 一个机器周期2us //
//实现按键地址码、指令码的数码管显示//
//2010-06-01 //
//////////////////////////////////////
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
bit overflag,dataover;//开始接收数据,数据处理完毕

uchar timedata;//定时器0溢出次数
uchar chubus[33];//33Byte数据 timedata组成的数组
uchar jieguos[4];//地址码,地址反码,数据码,数据反码;

void initial()//初始化
{
IT0=1;EX0=1;//负边沿触发

TMOD=0x01;ET0=1;TR0=1;//模式1,十六位定时器
TH0=0xff;TL0=0x06;//0.5ms溢出

EA=1; //开总中断
}

void time0() interrupt 1//定时器0中断
{TH0=0xff;TL0=0x06;
timedata++;
}

void ex0() interrupt 0//外部中断0,接收数据
{
static bit startflag;//开始接收
static uchar i;

if(startflag)
{
if(timedata<32&&timedata>=16) i=0;
chubus[i]=timedata;
timedata=0;
i++;
if(i==33)

}
else
{
startflag=1;
timedata=0;
}
}

void chulidata()
{
uchar chubu;//初步数据
uchar jieguo;//结果数据
uchar x,y,z=1;
for(x=0;x<4;x++)//处理四组数据
{
for(y=1;y<=8;y++)//处理一组数据8Byte
{
chubu=chubus[z];
jieguo=jieguo>>1;
if(chubu>3) jieguo=jieguo|0x80;//大于1.5mS为1
z++;
}
jieguos[x]=jieguo;
jieguo=0;
}
dataover=1;

}

void delay(uint z)
{
uint x ,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void display()
{
uchar gao,gao1;
uchar di,di1;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
gao1=table[jieguos[0]/16];
di1=table[jieguos[0]%16];
gao=table[jieguos[2]/16];
di=table[jieguos[2]%16];

dula=1;
P0=gao1;
dula=0;
P0=0xff;
wela=1;
P0=0x7e;
wela=0;
delay(2);

dula=1;
P0=di1;
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(2);//地址码

dula=1;
P0=gao;
dula=0;
P0=0xff;
wela=1;
P0=0x77;
wela=0;
delay(2);

dula=1;
P0=di;
dula=0;
P0=0xff;
wela=1;
P0=0x6f;
wela=0;
delay(2);//指令码

}

void main()
{
initial();//初始化
while(1)
{

if(overflag)//数据接收完毕
{
chulidata();//处理数据,完成标志dataover
overflag=0;
}
if(dataover)
{
display();//数码管显示
}
}
}

回答2:

sm0038 是个接收头,能对遥控器(电视遥控器行的)发出的调制红外线解调出脉冲编码.
你把sm0038的输出(收到红外线输出负脉冲)接51的INT0脚(要加上拉4.7K),
简单思路:
主程序中不断调用1秒子程序,并计数,只要能计到120次就报警发声,
中断程序设为下沿检测,只要有中断,就把计数器清0.

回答3:

sm0038 只能接收和解调38K的红外信号,一般的万能电视遥控就是38K的,也就说只能用电视遥控,不是随便给个红外线就可以的。编写红外解码程序关键在于计算时间,时间计算得准确就成功一半了