|
作者FREE ;/*============================================================================= ; 通用ASK信号解码接收程序 ; ;1. 接收数据位数最多为40(5*8)位. ;2. 由定时器对time进行渐增,在TCC中断程序中加入"INC TIME". ;3. 宽脉冲最大允许时间和最小允许时间的计算方式: ; ; 脉冲允许时间=TCC 中断时间(us)*设定数据 ; ;4. 在接收到完整的数据后建立rx_data_ok标志. ;5. 该子程序由主程序调用. ;6. 数据格式:rx_data5.7为最高位,rx_data1.0为最低位. ;7. 主程序在收到完整的数据后应清空接收数据缓冲区后,才能调用再次接收. ;/============================================================================*/ ;//mcu == emc bit_counter == 0x10 rx_data5 == 0x11 rx_data4 == 0x12 rx_data3 == 0x12 rx_data2 == 0x12 rx_data1 == 0x12 Rx_status == 0x13 time == 0x14 port6 == 6 #define max_time_h 50 ;//宽脉冲最大允许时间 data*TCC_time #define min_time_h 40 ;//宽脉冲最小允许时间 #define max_time_l 20 ;//窄脉冲最大允许时间 #define min_time_l 10 ;//窄脉冲最小允许时间 #define rx_bit_counter 12 ;//设定接收的位数 #define inport port6.0 #define in_bit Rx_status.0 #define time_bit Rx_status.1 #define rx_start RX_STATUS.2 #define h_time RX_STATUS.3 #define l_time RX_STATUS.4 #define rx_bit RX_STATUS.5 #define rx_data_ok RX_STATUS.6 RX() ;//程序开始 if in_bit==inport goto RX_EXIT; ;//输入无变化则退出 endif in_bit=inport; ;//有变化则记录输入电平 if time<MIN_TIME_L ;//检查输入脉冲宽度,50us产生一次中断 goto RX_ERROR; endif if time>MAX_TIME_H ;//低于MIN_TIME_L则退出,高于MAX_TIME_H则退出 goto RX_ERROR endif if time<=MAX_TIME_L ;//如果输入脉冲宽度>=MIN_TIME_L,并且<=MAX_TIME_L time_bit=0; ;//则认为输入电平为0 else if time>=MIN_TIME_H time_bit=1; ;//如果输入脉冲宽度>=MIN_TIME_H,并且<=MAX_TIME_H else ;//则认为输入电平为1 goto RX_ERROR; ;//否则认为数据出错 endif endif ;//check_in: if rx_start==0 ;//检查有没有收到启动位 if time_bit==0 ;//如果输入电平为窄脉冲高电平 if in_bit==1 ;//则认为收到启动位 rx_start=1 endif endif goto RX_EXIT1 ;//否则退出,等待重新接收 endif if in_bit==1 ;//记录低电平时间 l_time=time_bit; goto RX_EXIT1; else h_time=time_bit; ;//记录高电平时间 endif if l_time==0 ;//如果输入电平及时间为1 0,则为逻辑0 if h_time==1 rx_bit=0; else goto RX_ERROR; endif else if h_time==0 rx_bit=1; ;//如果输入电平及时间为0 1则为逻辑1 else goto RX_ERROR; ;//否则接收出错 endif endif ;//save_bit: bc 0x3,0 rlc rx_data1 rlc rx_data2 rlc rx_data3 rlc rx_data4 rlc rx_data5 if rx_bit==1 rx_data1=rx_data1 1 endif if --bit_counter!=0 goto RX_EXIT1; ;//未接收完数据位则继续 else ;//检查接收到的数据 rx_data_ok=1 goto RX_EXIT endif RX_ERROR: rx_start=0; ;//清除启动标志位 rx_data_ok=0 bit_counter=rx_bit_counter ;//重置接收位 rx_data1=0; ;//清空接收数据缓冲区 rx_data2=0 rx_data3=0 rx_data4=0 rx_data5=0 RX_EXIT1: time=0; ;//计时器清0 RX_EXIT: return; ;//返回
|