繁体中文
高级搜索
 
首页 | 电子技术应用 | 行业最新动态 | 行业最新产品 | 软件资料下载 | 电路图纸欣赏 | 博客文章精选 | 电子精品论坛 | 电子技术贴吧

当前位置:首页 >> 电子技术应用 >> 其他-------应用 >> ASK信号解码接收程序
ASK信号解码接收程序
作者:   来源: 发表时间:2007-02-14  字号:  

作者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; ;//返回


!注意:如果您发现此文章出现影响您的阅读的状况,请从浏览器地址栏里复制本文的链接到留言本报告给站长解决!
  • 上一篇: 触摸屏原理
  • 下一篇: IBM采用自成形材料绝缘 芯片提速三分之一

  • >> 联系我们请给我们留言·留言本
    本站所有提供的信息软件资料均来自网络,版权及著作权归原作者所有,如果无意中侵犯了您的相关权利或触及法律法规,请给我们留言, 我们将在24小时内删除。
      浙ICP备05071687号  电子技术精品网