|
//********************************************单片机红外发射*******************************************
#include "reg52.h"
sbit ir=P2^7;//红外发射管控制脚,使用24M晶振
sbit ka=P2^0;
sbit kb=P2^1;
unsigned int count, set_count; //中断计数,设定中断次数
bit irflag,keyflag; //红外发送标志位,按键标志位
unsigned char irsys[]={0x00,0xff};//16位用户码
unsigned char irdata,ircode; //发送的红外数据
//---------------------------------------------------------------------------
void delay(unsigned int a)//延时约1ms,晶振24M ,此处延时不需很精确
{
unsigned char i;
while(--a!=0)
for(i=125;i>0;i--);
}
//---------------------------------------------------------------------------
void ir_sendbyte() //红外发送一个字节数据
{
unsigned char i;
for(i=0;i<8;i++) //发送8位数据
{
set_count=35;//35; //发送编码中的0.56ms高电平
irflag=1; //启动红外发射二极管发射
count=0; //中断计数先清0
TR0=1; //开启定时器0
while(count<set_count); //等待发送完
TR0=0; //关闭定时器0
if(ircode&0x01) set_count=130;//130; //判断红外编码最低位,若为1则1.69ms的低电平
else set_count=35;//35; //为0则0.565ms的低电平
irflag=0; //低电平则不发射
count=0; //中断计数清0
TR0=1; //开启定时器0
while(count<set_count); //等待发送完
TR0=0; //关闭定时器0
ircode=ircode>>1; //将数据右移,即从低位到高位发送
}
TR0=0;
set_count=0;
count=0;
ir=1; //发射完了关闭红外发射二极管
}
//---------------------------------------------------------------------------
void ir_send() //发送红外数据
{
set_count=672;//672; //发送编码中的引导码(9ms高电平+4.5ms低电平)
irflag=1; //启动红外发射二极管发射
count=0; //中断计数清0
TR0=1;
while(count<set_count);
TR0=0;
set_count=336;//336; //发送编码中的4.5ms低电平
irflag=0; //低电平则不发射
count=0;
TR0=1;
while(count<set_count); //等待发送完
TR0=0;
ircode=irsys[0]; //发送16位用户码的前1-8位
ir_sendbyte();
ircode=irsys[1]; //发送16位用户码的前9-16位
ir_sendbyte();
ircode=irdata; //发送8位数据码
ir_sendbyte();
ircode=~irdata; //发送8位数据反码
ir_sendbyte();
}
//---------------------------------------------------------------------------
void timer0_init() //定时器初始化
{
EA=1;
TMOD=0x02; //定时0 8位自动重装模式
ET0=1;
TH0=0xf3;//0xf3; //定时13us,38K红外矩形波,晶振24M (//后为12M晶振下的数值)
TL0=0xf3;
}
//---------------------------------------------------------------------------
void main()
{
P1=0x00;
timer0_init(); //定时0初始化
count=0; //中断计数先清0
irflag=0; //红外发射标志先置0
irdata=9; //1 //55 55 55 A9
while(1) //2 //AA 55 55 53
{ //4 //55 55 55 04
ir_send(); //发送红外编码 //5 //55 55 55 49
delay(50); //6 //00 55 55 0A
} //7 //00 55 55 15
} //8 //54 55 55 4D
//----------------------------------------------------------------------- //9 //00 55 55 11
void timer0() interrupt 1 //定时器0中断 //10 //A8 55 55 13
{
count++;
if(irflag==1) ir=~ir; //有发射标志,则发射38khz的矩形波
else ir=1; //否则不发射,即相当于发射编码中的低电平
}
|
-
image022.jpg
(47.95 KB, 下载次数: 34)
-
image012.jpg
(42.82 KB, 下载次数: 44)
-
image006.jpg
(39.52 KB, 下载次数: 33)
-
硬件原理图.jpg
(175.22 KB, 下载次数: 37)
-
image024.jpg
(46.34 KB, 下载次数: 36)
-
image026.jpg
(45.54 KB, 下载次数: 36)
-
-
履带式蔽障车.rar
17.82 MB, 下载次数: 19, 下载积分: 黑币 -5
-
-
实例二、直流电机控制.rar
78.8 KB, 下载次数: 22, 下载积分: 黑币 -5
|