📄 rs_main.c
字号:
case 0x10: /* 重复按键译码*/
case 0x11:
case 0x12: if(( RS_High == 0 ) && ( RS_Index == 50 ))
RS_Index ++;
else
RS_Index = 0;
break;
case 0x21: /* 帧头搜索*/
case 0x22:
case 0x23: if( RS_High == 0 )
RS_Index = 1;
else
RS_Index = 0;
break;
case 0x37: /* 帧尾搜索*/
case 0x38:
case 0x39: Error_Flag = 1;
if(( RS_Index == 33 ) && ( RS_High == 1 ))
if(( RS_CODE.KEY[0] == 0x1E ) && ( RS_CODE.KEY[1] == 0xE1 ))
if(( RS_CODE.KEY[2] ^ RS_CODE.KEY[3] ) == 0xFF )
{
KEY_DECODE = RS_CODE.KEY[3];
RS_Index = 50; /* 数据帧尾结束*/
KEY_DECODE_OK = 1;
Error_Flag = 0;
}
if( Error_Flag )
RS_Index = 0;
break;
case 0xF0: /* 重复按键译码*/
case 0xF1:
case 0xF2: if(( RS_High == 2 ) && ( RS_Index == 51 ))
{
RS_Index = 50;
KEY_DECODE_OK = 1; /* 重复按键*/
}
else
RS_Index = 0;
break;
default: RS_Index = 0; /* 误码,重新定帧*/
break;
}
/* 重新启动遥控器解码脉冲测量*/
RS_High = 0;
TH0 = 0;
TL0 = 0;
}
/********************************************************************/
/* 定时器中断0服务程序( 遥控解码) */
/********************************************************************/
void Interrupt_T0( void ) interrupt 1
{
RS_High++;
if( RS_High > ( IDLE_Cnt + 2 )) /* 1个单位为32.768ms */
{
Fresh_KEY_Flag = 1; /* 首次按键标志*/
RS_Index = 0;
RS_High = IDLE_Cnt + 2;
}
}
/********************************************************************/
/* 外部中断1服务程序( 10ms脉冲输入) */
/* 同时用于系统定时任务 */
/********************************************************************/
void Interrupt_INT1( void ) interrupt 2
{
/* 定时器复位,时间基准对齐*/
TimeSlot = PWM_INIT;
TH1 = 0xFE;
TL1 = 0x70;
/* 系统定时标志*/
System_Timer = 1;
}
/********************************************************************/
/* 定时器中断1服务程序( PWM 定时器) */
/********************************************************************/
void Interrupt_T1( void ) interrupt 3
{
unsigned char CH_Mirror;
/* 0.2ms定时器,PWM步长为0.2ms,占空比从2%起*/
TH1 = 0xFE;
TL1 = 0x70;
P1 = P1_Mirror; /*输出到端口*/
/* 计算各通道PWM 脉冲输出*/
TimeSlot --;
CH_Mirror = 0x55;
if( POWER_FLAG ) /*电源标志,ON*/
{
if( CH_Vol[0] == TimeSlot )
CH_Mirror &= 0xFE;
if( CH_Vol[1] == TimeSlot )
CH_Mirror &= 0xFB;
if( CH_Vol[2] == TimeSlot )
CH_Mirror &= 0xEF;
if( CH_Vol[3] == TimeSlot )
CH_Mirror &= 0xBF;
}
P1_Mirror = CH_Mirror | LED_Mirror; /*数据输出,0表示有效*/
}
/********************************************************************/
/* 应用程序初始化 */
/********************************************************************/
void APP_Initlization( void ) /* 应用程序初始化*/
{
/* 初始化初始亮度,保持微亮*/
CH_Vol[0] = 0;
CH_Vol[1] = 0;
CH_Vol[2] = 0;
CH_Vol[3] = 0;
Current_CH = 1;
}
/********************************************************************/
/* 通道指示灯 */
/********************************************************************/
void CH_LED_Control( void ) /* 通道指示灯*/
{
unsigned char CH_LED_Mirror;
CH_LED_Mirror = 0xAA;
if( POWER_FLAG )
CH_LED_Mirror &= 0xFD;
switch( Current_CH )
{
case 0: CH_LED_Mirror &= 0x02; /* 全亮*/
break;
case 1: CH_LED_Mirror &= 0xF7; /* 1个亮*/
break;
case 2: CH_LED_Mirror &= 0xDF; /* 高位亮*/
break;
case 3: CH_LED_Mirror &= 0xF7; /* 2个亮*/
CH_LED_Mirror &= 0xDF;
break;
case 4: CH_LED_Mirror &= 0x7F; /* 高位亮*/
break;
}
LED_Mirror = CH_LED_Mirror;
}
/********************************************************************/
/* 电源控制 */
/********************************************************************/
void CH_Power_ON ( void ) /* 电源控制*/
{
POWER_FLAG = 1; /* 电源开启*/
if(( CH_Vol[0] < VOL_MIN ) || ( CH_Vol[0] > VOL_MAX ))
CH_Vol[0] = VOL_INIT;
if(( CH_Vol[1] < VOL_MIN ) || ( CH_Vol[1] > VOL_MAX ))
CH_Vol[1] = VOL_INIT;
if(( CH_Vol[2] < VOL_MIN ) || ( CH_Vol[2] > VOL_MAX ))
CH_Vol[2] = VOL_INIT;
if(( CH_Vol[3] < VOL_MIN ) || ( CH_Vol[3] > VOL_MAX ))
CH_Vol[3] = VOL_INIT;
}
/********************************************************************/
/* 运行指示灯控制 */
/********************************************************************/
void RUN_LED_Control( void ) /* 运行指示灯控制*/
{
if( Timer_Flag )
{
LED_FLASH_Cnt ++;
if( RS_High > IDLE_Cnt ) /* 正常运行*/
{
if( LED_FLASH_Cnt == 50 )
{
RUN_LED = !RUN_LED;
LED_FLASH_Cnt = 0;
}
}
else /* 接收遥控码时间*/
{
if( LED_FLASH_Cnt == 10 )
{
RUN_LED = !RUN_LED;
LED_FLASH_Cnt = 0;
}
}
}
}
/********************************************************************/
/* 通道功率增加 */
/********************************************************************/
unsigned char VOL_INC( unsigned char VOL ) /* 通道功率增加*/
{
if( VOL < VOL_MAX )
VOL ++;
return( VOL );
}
/********************************************************************/
/* 通道功率减小 */
/********************************************************************/
unsigned char VOL_DEC( unsigned char VOL ) /* 通道功率减小*/
{
if( VOL > VOL_MIN )
VOL --;
return( VOL );
}
/* ---------------------------------------------------------------------------------------*/
/* TCON */
/* TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 */
/* TFx 定时器溢出标志,1=溢出*/
/* TRx 定时器启动标志,1=启动*/
/* IEx 外部中断申请标志,1=申请*/
/* ITx 外部中断中断模式,1=下跳沿,0=低电平*/
/* ---------------------------------------------------------------------------------------*/
/* TMOD D7~D4-定时器1, D3~D0-定时器0*/
/* GATE C/T M1 M0, GATE C/T M1 M0 */
/* GATE 门控,1=测INTx高脉冲宽度,0=计数器,不受INTx外部输入控制*/
/* C/T 定时器模式,1=计数器模式,计数Tx脉冲个数0=定时器模式*/
/* M1 M0 定时器工作模式: 0=13位计数器,1=16位计数器,2=波特率发生器*/
/* ---------------------------------------------------------------------------------------*/
/* IE */
/* EA x x ES ET1 TX1 ET0 EX0 */
/* ---------------------------------------------------------------------------------------*/
/* SCON */
/* SM0 SM1 SM2 REN TB8 RB8 TI RI */
/* SM0 SM1 通信模式,常用方式1*/
/* SM2 多机通信使能*/
/* REN 允许接收控制*/
/* TB8 发送第8位数据*/
/* RB8 接收第8位数据*/
/* TI 发送中断标志*/
/* RI 接收中断标志*/
/* ---------------------------------------------------------------------------------------*/
/* IP */
/* X X X PS PT1 PX1 PT0 PX0 */
/* ---------------------------------------------------------------------------------------*/
/* PCON */
/* SMOD X X X GF1 GF0 PD IDL */
/* SMOD 波特率加倍使能*/
/* GFx 通用标志寄存器*/
/* PD 掉电模式*/
/* IDL 待机模式*/
/* 波特率计算 */
/* 波特率=(2^SMOD/32) * (OSC/(12*(256-TH1))) */
/* TH1=256-(2^SMOD*OSC)/(384*波特率) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -