/****************************************************************
程序名稱: 將遙控接收頭接收到的按鍵編碼通過定時器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];
}
}
}
}
|