📄 rs_main.c
字号:
#include <REG51.H>
//定义端口资源
sbit Control_1 = P1^0; /* 输出到光耦,低电平选通*/
sbit Control_2 = P1^2; /* 输出到光耦,低电平选通*/
sbit Control_3 = P1^4; /* 输出到光耦,低电平选通*/
sbit Control_4 = P1^6; /* 输出到光耦,低电平选通*/
sbit Control_LED1 = P1^1; /* 输出到发光二极管,低电平点亮*/
sbit Control_LED2 = P1^3; /* 输出到发光二极管,低电平点亮*/
sbit Control_LED3 = P1^5; /* 输出到发光二极管,低电平点亮*/
sbit Control_LED4 = P1^7; /* 输出到发光二极管,低电平点亮*/
sbit BUZZER_Control = P3^6; /* 蜂鸣器,低电平蜂鸣*/
sbit RUN_LED = P3^7; /* 运行指示LED */
//键盘编码
#define KEY_SHIFT 0x06
#define KEY_TONE 0x16
#define KEY_POWER 0x86
#define KEY_1 0x7E
#define KEY_2 0x2E
#define KEY_3 0x26
#define KEY_4 0x5E
#define KEY_5 0x6E
#define KEY_6 0x56
#define KEY_7 0x9E
#define KEY_8 0xAE
#define KEY_9 0xB6
#define KEY_0 0xBE
#define KEY_ESC 0x96
#define KEY_DEC 0xDE
#define KEY_OK 0x8E
#define KEY_INC 0xCE
void Main_Initlization( void ); /* 主初始化程序*/
void Interrupt_INT0( void ); /* 遥控解码*/
void Interrupt_INT1( void ); /* 10ms定时脉冲中断*/
void Interrupt_T0( void ); /* 遥控解码*/
void Interrupt_T1( void ); /* PWM 定时器*/
void KEY_Process( void ); /* 遥控按键解码*/
void APP_Initlization( void ); /* 应用程序初始化*/
void CH_LED_Control( void ); /* 通道指示灯*/
void CH_Power_ON( void ); /* 电源控制*/
void RUN_LED_Control( void ); /* 运行指示灯控制*/
unsigned char VOL_INC( unsigned char VOL ); /* 通道功率增加*/
unsigned char VOL_DEC( unsigned char VOL ); /* 通道功率减小*/
/* 遥控器解码变量定义*/
bit KEY_DECODE_OK; /* 遥控器解码成功标志*/
bit Fresh_KEY_Flag; /* 首次按键标志*/
unsigned char KEY_DECODE; /* 解码后的键值*/
unsigned char RS_Index; /* 当前遥控码位置*/
unsigned char RS_High; /* 遥控器解码定时器高位*/
unsigned long RS_Decode; /* 解码数据*/
union URS_CODE /* 遥控码解码数据*/
{ /* 格式:设备码1E,设备反码E1*/
unsigned char KEY[4]; /* 数据码,数据反码,32bit */
unsigned long FULL_KEY;
} RS_CODE;
/* PWM 信号发生脉冲变量定义*/
unsigned char TimeSlot; /* PWM定时器*/
unsigned char CH_Vol[4]; /* 通道音量数据*/
unsigned char Current_CH; /* 当前遥控控制通道选择0~3*/
bit POWER_FLAG; /* 电源总开关标志*/
#define PWM_INIT 200 /* 初始计数值*/
#define VOL_MAX PWM_INIT-2 /* 最大值,越大,功率越大*/
#define VOL_MIN VOL_MAX-40 /* 最小值,越小,功率越低*/
#define VOL_INIT VOL_MIN + 10 /* 初始亮度*/
#define IDLE_Cnt 3 /* 空闲时间,确定新键按下*/
unsigned char P1_Mirror; /* P1口镜像寄存器*/
unsigned char LED_Mirror; /* LED镜像寄存器*/
/* 系统处理变量定义*/
bit System_Timer; /* 系统10ms定时标志,来自100Hz中断*/
bit Timer_Flag; /* 10ms定时器标志*/
unsigned char LED_FLASH_Cnt; /* LED闪烁定时器*/
unsigned char PRE_KEY; /* 前一个按键数据*/
/********************************************************************/
/* 主程序 */
/********************************************************************/
void main( void )
{
Main_Initlization( ); /* 主初始化程序*/
APP_Initlization( ); /* 应用程序初始化*/
while( 1 )
{
KEY_Process( ); /* 键盘处理*/
CH_LED_Control( ); /* 通道指示灯*/
/* 定时器服务*/
if( System_Timer )
{
System_Timer = 0;
Timer_Flag = 1;
}
/* RUN_LED闪灯程序,正常1s闪烁一次,遥控解码时,快速闪烁*/
RUN_LED_Control( );
if( Timer_Flag )
Timer_Flag = 0;
}
}
/********************************************************************/
/* 遥控按键解码处理程序 */
/********************************************************************/
void KEY_Process( void ) /* 遥控按键解码*/
{
if( KEY_DECODE_OK )
{
KEY_DECODE_OK = 0; /* 处理结束*/
switch( KEY_DECODE ) /* 根据键值散转*/
{
/* 电源总开关控制*/
case KEY_POWER: if( Fresh_KEY_Flag )
{
POWER_FLAG = !POWER_FLAG;
if( POWER_FLAG )
CH_Power_ON( );
}
break;
/* 通道电源功率增加*/
case KEY_INC: if( POWER_FLAG )
{
if( Current_CH == 0 ) /* 所有通道*/
{
CH_Vol[ 0 ] = VOL_INC( CH_Vol[ 0 ] );
CH_Vol[ 1 ] = VOL_INC( CH_Vol[ 1 ] );
CH_Vol[ 2 ] = VOL_INC( CH_Vol[ 2 ] );
CH_Vol[ 3 ] = VOL_INC( CH_Vol[ 3 ] );
}
else
CH_Vol[ Current_CH -1 ] = VOL_INC( CH_Vol[ Current_CH -1 ] );
}
break;
/* 通道电源功率减小*/
case KEY_DEC: if( POWER_FLAG )
{
if( Current_CH == 0 ) /* 所有通道*/
{
CH_Vol[ 0 ] = VOL_DEC( CH_Vol[ 0 ] );
CH_Vol[ 1 ] = VOL_DEC( CH_Vol[ 1 ] );
CH_Vol[ 2 ] = VOL_DEC( CH_Vol[ 2 ] );
CH_Vol[ 3 ] = VOL_DEC( CH_Vol[ 3 ] );
}
else
CH_Vol[ Current_CH -1 ] = VOL_DEC( CH_Vol[ Current_CH -1 ] );
}
break;
/* 遥控控制通道切换,循环切换*/
case KEY_TONE: if( Fresh_KEY_Flag )
{
Current_CH ++;
if( Current_CH > 4 )
Current_CH = 1;
}
break;
/* 通道切换,通过SHIFT + 数字键,0键表示所有*/
case KEY_0: if( Fresh_KEY_Flag )
if( PRE_KEY == KEY_SHIFT )
Current_CH = 0;
break;
case KEY_1: if( Fresh_KEY_Flag )
if( PRE_KEY == KEY_SHIFT )
Current_CH = 1;
break;
case KEY_2: if( Fresh_KEY_Flag )
if( PRE_KEY == KEY_SHIFT )
Current_CH = 2;
break;
case KEY_3: if( Fresh_KEY_Flag )
if( PRE_KEY == KEY_SHIFT )
Current_CH = 3;
break;
case KEY_4: if( Fresh_KEY_Flag )
if( PRE_KEY == KEY_SHIFT )
Current_CH = 4;
break;
case KEY_ESC: if( Fresh_KEY_Flag )
Current_CH = 0;
break;
}
Fresh_KEY_Flag = 0;
PRE_KEY = KEY_DECODE; /* 前一个键值更新*/
}
}
/********************************************************************/
/* 主初始化程序 */
/* 初始化定时器,中断模式等 */
/********************************************************************/
void Main_Initlization( void ) /*主初始化程序*/
{
TMOD = 0x19; /* 定时器1用于PWM 定时,定时器0用于遥控信号解码*/
TCON = 0x55; /* 启动两个定时器,外部中断模式为下降沿*/
TH1 = 0xF9; /* PWM 调节步长*/
TL1 = 0x7D;
TH0 = 0x00; /* 定时设置,最长约80ms, 24MHz晶振*/
TL0 = 0x00;
IE = 0x8F; /* 开放中断:INT0-遥控解码,INT1-10ms中断,T0-遥控解码, T1-PWM 发生*/
IP = 0x0C; /* 10ms外部中断优先级最高*/
}
/********************************************************************/
/* 外部中断0服务程序( 遥控解码) */
/********************************************************************/
/* 解码输出在RS_DECODE,标志为RS_DECODE_OK,首次按键为Fresh_KEY_Flag */
void Interrupt_INT0( void ) interrupt 0
{
/* 搜索帧头,帧尾,数据*/
/* 00 22数据为帧头*/
/* 00 03为数据0,00 0C为数据1*/
/* 01 38为帧尾*/
/* 00 11, 02 F1为重复标志*/
bit Error_Flag;
switch( TH0 )
{
case 0x02: /* 数据0 */
case 0x03:
case 0x04: if( RS_High == 0 )
{
RS_CODE.FULL_KEY <<= 1;
RS_Index ++;
}
else
RS_Index = 0;
break;
case 0x0B: /* 数据1 */
case 0x0C:
case 0x0D: if( RS_High == 0 )
{
RS_CODE.FULL_KEY <<= 1;
RS_CODE.FULL_KEY ++;
RS_Index ++;
}
else
RS_Index = 0;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -