51单片机 遥控接收,C语言?

有没有好的源程序?给个,
2024-11-28 23:20:29
推荐回答(2个)
回答(1):

给你代码参考

/**************************************/
//文件名:main.c
//作 者:jammy-lee
//日 期:2009-3-15
//功 能:红外线的解码,通过串口传送解码结果
/**************************************/

//头文件
#include

//宏定义
typedef unsigned char uchar;
typedef unsigned int uint;
typedef long unsigned int uint32;

//函数声明
void get_code(uint time,uchar *arry);
void SerialOutStr(uchar *Str);

uint tmp;
uchar Ir_receive = 0;
uchar i,k;
uint32 temp;
uchar k = 0;
bit flag;

sbit P3_2 = P3^2;
sbit P1_0 = P1^0;
sbit P0_0 = P0^0;

#define Ir P3_2 //红外接收端口
#define LED P0_1 //指示灯端口

//延时子程序
void delay(uchar Delay)
{ uchar i;
for(;Delay>0;Delay--)
{
for(i=0;i<123;i++);
}
}

//初始化红外线接收设备
//红外线接收使用到外部中断INT0,以及定时器T0
void Init_Ir(void)
{
//初始化外部中断INT0
EA = 1; //允许全局中断
EX0 = 1; //允许外部中断

//初始化定时器T0
TMOD |= 0x09; //定时器0工作在方式1,下降沿触发
TH0 = 0x00; //定时器0高8位
TL0 = 0x00; //定时器0低8位
TR0 = 0;
}

//初始化串口通信
void Init_serial(void)
{
SCON = 0x50; //串口工作在方式1
TMOD |= 0x20; //定时器1工作在方式2
PCON |= 0x80; //SMOD=1
TH1 = 0xfa; //初始化定时器,波特率为9600
TR1 = 1; //打开定时器1
}

//中断子程序
void int0() interrupt 0 using 0
{
char count = 32;

EX0 = 0; //禁止外部中断0
while(!Ir);
TR0 = 1; //打开定时器0

//读取32位红外编码
while(count)
{
while(Ir);
TR0 = 0; //关闭定时器0
tmp |= TH0; //读出定时器0高八位
tmp <<= 8; //右移八位
tmp |= TL0; //读取定时器0低八位

if(tmp>1100 && tmp<2000) //读高电平
{
temp |= 0x0001;
temp <<= 1;
tmp = 0;
count--;
}
else if(tmp>100 && tmp<1000)//读低电平
{
temp &= 0xFFFE;
temp <<= 1;
tmp = 0;
count--;
}
else
{
tmp = 0;
}

TH0 = 0x00; //定时器0高8位
TL0 = 0x00; //定时器0低8位

while(!Ir)
{
P0 = 0x00; //接收到红外,指示灯亮
}
TR0 = 1; //打开定时器0
}

flag = 1; //标志位
EX0 = 1; //打开外部中断0
}

//向串口输出一个字符串(非中断方式)
void Uart_char(uchar *Str)
{
SBUF = *Str; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
}

//向串口输出一个字符串(非中断方式)
void Uart_print(uchar *Str)
{
while(*Str != '\0') //判断是否到了字符串的尾部
{
Uart_char(Str); //发送字符
Str++; //字符串指针加一
}
}

//主函数
void main(void)
{

P0 = 0x00;
Init_Ir();
Init_serial();
flag = 0;
delay(10);
//Uart_print("Initiazation is successful \n");
delay(10);

//主循环
while(1)
{
P0 = 0xFF;
if(flag)
{
EX0 = 0; //关闭外部中断0
//发送四组8位红外编码
for(i=0;i<4;i++)
{
k = (uchar)temp;
Uart_char(&k);
temp >>= 8;
delay(2);
}
flag = 0;
EX0 = 1; //打开外部中断0
}
}
}

回答(2):

不可能有源码,

因为硬件结构各不相同!