📄 复件 (2) exmple_1.c
字号:
//C51单片机红外线编解码遥控源程序
/*******************************************
* 程序描述:红外遥控RC5码解码程序,经串口发送
* 目标cpu:lpc932
* 晶振:11.0592M
* 硬件描述:一体化接收头接P20.指示LED接P26
* 编译器:KEIL 7.05
* 日期:2005/9/24
* 作者:刘玉宏(liu1234)
*******************************************/
#include <reg51.h>
#define UCHAR unsigned char
#define UINT unsigned int
void delay(UCHAR i);
sbit LED_GREEN=P1^0;
sbit LED_RED=P1^1;
// sbit Key=P2^0;
// 波特率发生器的初值(115200波特率)XTAL 11.0592M
#define BRGR1_DATA 00
#define BRGR0_DATA 0x50
sbit WAY_0 = P2^0;
sbit LED_RECIEVE= P2^6;
unsigned char bdata buffer;//发往串口的缓冲器
sbit way0=buffer^0;
unsigned char irtype; //RC5一帧的各段的标志
unsigned char count; //红外接收位寄存器
unsigned char end; //红外一帧接收结束标志
void t0_service(void) interrupt 1 using 1
{
//第一次进入中断,为定时1/4位的时间445us
//以后则定时一位时间1.778ms进入中断
way0=~WAY_0; //一体化解码后,有载频的部分变为低电平
TH0=0xD9;//1.778ms
TL0=0x98;
//TH0=0xDb;//lg
//TL0=0xf8;
count++;
if((irtype==0)&&(count==3)) //起始码部分2个1和翻转位
{
TI=0;
SBUF=buffer;
count=0;
irtype=1;
buffer=0;
}
else if((irtype==1)&&(count==5)) //5位地址
{
TI=0;
SBUF=buffer;
count=0;
irtype=2;
buffer=0;
}
else if((irtype==2)&&(count==6)) //6位命令
{
TI=0;
SBUF=buffer;
count=0;
irtype=3;
buffer=0;
}
else if(irtype==3) //等最后半位结束,实际延时1位时间
{
TI=0;
count=0;
irtype=0;
buffer=0;
end=1;
TR0=0; //解码结束,定时器停止
return;
}
buffer=buffer<<1;
}
void main(void)
{
TMOD|=0x01; //t0方式1
EA=1; //允许T0中断
while(1)
{
buffer=0;
irtype=0;
count=0;
end=0;
TH0=0xf6;//445us
TL0=0x63;//下帧第一段开始作准备
//TH0=0xf8;//lg
//TL0=0xfa;
while (WAY_0);//等待低电平,一帧的开始
TR0=1; //开始定时,红外接收
LED_RECIEVE=0;//led点亮
while(!end); //等一帧解码结束
LED_RECIEVE=1;//熄灭led
}
}
/*
实测数据
连按音量+ 06 00 10 06 00 10 06 00 10 06 00 10
放开后再按音量+ 07 00 10 07 00 10 07 00 10
06/07正是翻转码的作用
我家LG电视遥控器实测码
待机=0c;图像增强=13;静音=0d;i/ii=23;音响增强=24
0-9=00-09;tv/av=28;菜单=3b;确定=25;节目=20/21;
音量=11/10;橙键=37;音响模式=16;绿键=26;光程眼=12;
图像模式=0E;画面比率=33;快速回看=32;睡眠关机=26;
节目清单=34;
-------------------------------------------
同维电视卡遥控器
-/--=0a;搜索=1e;微调=2b/2c;存储=29;屏显=0f;
自动搜索=26;对比度=1c/1d;色彩=14/15;
亮度=12/13;删除=38;制式=2d;其余同上
-------------------------------------------
非常奇怪的是LG遥控器的晶振原来是3.645,我换为3.58
电视正常遥控,而我的程序无法正确解码,定时时间要缩短大约
120us才可以.
---------------------------------------------
*/
void delay(UCHAR i) //延时程序
{
UCHAR j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
/*程序1
#include <reg51.h>
sbit LED=P3^0;
sbit Key=P3^7;
//帧数据放数组Data里
unsigned char Data[4]={0x00,0xff,0x1f,0xe0};
void Transmit(int c1,int c2); //发射子程序
//****************************************
main()
{unsigned char i,j;
while(1)
{while(Key); //没键按下,等待
Transmit(340,565); //发射引导码
for(i=0;i<4;i++)
for(j=0;j<8;j++) //发射帧数据
{if((Data[i]>>j)&1)
Transmit(19,205); //'1'码
else Transmit(19,70); //'0'码
}
Transmit(19,17);
while(!Key); //等待释放按键
}
}
//****************************************
void Transmit(int c1,int c2) //c1为高电平宽度
{unsigned char i; //c2为低电平宽度
do{LED=1; //产生38kHz载波
for(i=8;i>0;i--); //延时18us
LED=0;
}while(--c1);
LED=1;
while(--c2);
}
程序1*/
/*;程序2
#include<reg51.h>
sbit Rec=P3^1;
unsigned char i,ch;
unsigned int t;
main()
{
TMOD=0x01;
TR0=1;
while(1)
{
while(Rec); //等待接收信号//twp 等待P3^1为低电平0 则跳出循环,往下运行计算高电平的宽度
t=(TH0<<8)+TL0; //取得脉冲宽度
if(t>200&&t<800); //是'0'码
else if(t>1100&&t<1800) //'1'码
{if(i>24)//取出最后一字节
ch|=1<<(i-25); //twp 只接收最后一字节
}
else //非0、1码,重新解码
{ch=0;i=0;}
if(i++==32) P1=ch;//twp 将接收的码放到P1变量
while(!Rec);
TL0=0; //重新计时
TH0=0;
}
程序2*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -