/****************************************************************
程序名称: 将遥控接收头接收到的按键编码通过定时器0中断方式,
数码管显示出来
说明:能解码的遥控编码必须是NEC 的6221/6121/6222编码方式
同时 SE10必须要闭合,即使用12M晶体
*****************************************************************/
/*头文件*/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define _Nop() _nop_()
/*端口定义*/
#define sled_dm_port P0 /*定义LED显示的段码数据脚*/
#define sled_wm_port P2 /*定义LED显示的位码数据脚*/
sbit dac_latch_port = P3^7; /*定义DAC通道的锁存器的LE脚*/
sbit led_latch_port = P2^5; /*LED锁存器的LE脚*/
/*定义数码管显示字符跟数字的对应数组关系*/
uchar code mun_to_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
/*定义需要点亮的数码管*/
uchar code sled_bit_table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar data sled_data[8]={0xff,0xc0,0xc0,0xff,0xff,0xc0,0xc0,0xff}; /*0-7号SLED缓冲值*/
uchar data led_lighten_bit=0 ; /*LED灯点亮标志位0-7*/
sbit ir_port=P3^2; /*遥控输入脚*/
uchar ir_code[4]; /*遥控接收数据*/
uchar ir_bit=0; /*遥控接收成功*/
uchar ir_liangfa=0; /*连发码位*/
/*-----------------------------------------------
显示部分程序,采用定时器0产生中断,1MS更新一次
------------------------------------------------*/
void SLED_Disp() interrupt 1 using 3
{
TH0 = (65536-1000)/256;
TL0 = (65536-1000)/256;
sled_wm_port = 0xff; /*关闭显示*/
sled_dm_port = sled_data[led_lighten_bit]; /*输出段码数据到数码管*/
sled_wm_port = sled_bit_table[led_lighten_bit]; /*输出位码数据到数码管*/
led_lighten_bit++;
if(led_lighten_bit>=8) led_lighten_bit=0; /*8位数码管全动态输出*/
}
void T0_valueSet() /*定义中断方式,中断时间*/
{
TMOD = 0x01; /*定时0,工作在方式1*/
TH0 = (65536-1000)/256;
TL0 = (65536-1000)/256;
TR0 = 1; /*启动计数*/
EA = 1; /*开总中断*/
ET0 = 1; /*开定时器0中断*/
return;
}
//--------------------------------------
void delay_882us() /* 延时882us */
{
uint i;
i=110;
while(--i);
}
void delay_1000us() /* 延时1000us */
{
uint i;
i=125;
while(--i);
}
void delay_2400us() /* 延时2400us */
{
uint i;
i=300;
while(--i);
}
void yaokong_jieshou()
{
uchar i,j;
EA = 0;
for(i=0;i<10;i++){
delay_882us(); /*调用882微秒延时子程序*/
if(ir_port==1){
ir_bit=0;
EA=1;
return; /*检测在8820微秒内如果出现高电平就退出解码程序*/
}
}
/*以下识别连发码,和跳过4.5ma的高电平*/
while(ir_port==0); /*等待高电平避开9毫秒低电平引导脉冲*/
delay_2400us();
if(ir_port==0){
ir_bit=1;
ir_liangfa=1; /*连发码位置0*/
EA=1;
return; /*连发码退出*/
}
delay_2400us();
/*以下32数据码的读取,0和1的识别*/
for(i=4;i>0;i--){
for(j=0;j<8;j++){
while(ir_port==0); /*等待地址码第一位的高电平信号*/
delay_882us();
ir_code[i-1]=(ir_code[i-1]>>1);
if(ir_port==1){
ir_code[i-1]=(ir_code[i-1]|0x80);
delay_1000us();
}
}
}
if(ir_code[1]==(~ir_code[0])){
ir_liangfa=0; /*连发码位置0*/
ir_bit=1; /*遥控接收正确,置位1*/
}
EA = 1;
return;
}
//------------------------------------------------------------
/*主程序*/
void main()
{
T0_valueSet(); /*定义中断方式,中断时间*/
led_latch_port = 0;
dac_latch_port = 0;
while(1){
if(ir_port==0){
yaokong_jieshou();
if(ir_bit==1){ /*接收成功刷新显示*/
/*转换数据为显示字符*/
sled_data[1] = mun_to_char[ir_code[0]/0x10];
sled_data[2] = mun_to_char[ir_code[0]%0x10];
sled_data[5] = mun_to_char[ir_code[2]/0x10];
sled_data[6] = mun_to_char[ir_code[2]%0x10];
}
}
}
}
|