本帖最后由 1988020566 于 2013-5-14 23:01 编辑
-----------------------------------------------------------------------------
说明:
硬件连接如图3,P1.0作为发送引脚,P1.1作为接收引脚,二者共用捕获比较模块0
Tbit1 是1位时间间隔数据(T1),Tbit_5是半位时间间隔数据。(由公式1得出)
RTbuff 是接收发送缓冲字单元,存放接收和发送的数据
Counter 是收发过程中使用的计数器
;------------------------------------------------------------------------------
发送子程序
MOV | &TAR,&CCR0 | ; 将当前定时器值存入CCR中(T0) | ADD | #Tbit1,&CCR0 | ; 将1位时间间隔加入CCR中(T0+T1) | RLA | RTbuff | ; 将带发送的字节数据左移一位,构造最低位为起始位 | BIS | #0200h, RTbuff | ; 将停止位数据放入待发送字的第10位 | MOV | #10,Counter | ; 初始化数据帧计数器为10 | MOV | #OUTMOD0+CCIE,&CCTL0 | ; 标记发送状态,打开捕获比较中断,启动发送 | RET | | ; 返回 | ;------------------------------------------------------------------------------
接收准备子程序
MOV | #08,Counter | ; 初始化接收数据计数器为8(接收一个字节数据) | MOV | #SCS+CCIS0+OUTMOD0+CM1+CAP+CCIE,&CCTL0 | ;初始化捕获比较控制字, | | | ; 设定为下降沿捕获模式,标记接收状态,打开中断,启动接收 | RET | | ; 返回 |
;------------------------------------------------------------------------------捕获比较模块0的中断服务程序
;------------------------------------------------------------------------------
| ADD | #Tbit1,&CCR0 | ; 将1位时间间隔加入CCR0中 | | BIT | #CCIS0,&CCTL0 | ; 判断接收、发送状态 | | JNZ | UART_RX | ; 是接收状态,转接收处理 | UART_TX | CMP | #00h,Counter | ; 是发送状态,判断帧发送是否结束 | JNE | TX_Next | ; 没有结束,转入发送 | BIC | #CCIE,&CCTL0 | ; 帧发送结束,关闭中断 | RETI | | ; 中断返回 | TX_Next | RRA | RTbuff | ; 待发送位移入进位位C | JC | TX_One | ; 该位为1?跳转 | BIS | #OUTMOD2,&CCTL0 | ; 该位为0,发送0 | JMP | TX_nxt2 | ; 跳转继续处理 | TX_One | BIC | #OUTMOD2,&CCTL0 | ; 该位为1,发送1 | TX_nxt2 | DEC | Counter | ; 发送帧计数器减1 | RETI | | ; 中断返回 | ; | UART_RX | BIT | #CAP,&CCTL0 | ; 判断是否是捕获到起始位 | JZ | RX_Bit | ; 接收的不是起始位,转入处理 | RX_Start | BIC | #CAP,&CCTL0 | ; 捕获到起始位,将状态转为比较模式 | ADD | #Tbit_5,&CCR0 | ; 再增加半位时间间隔(T0+T1.5),以实现1.5 时间间隔 | RETI | | ; 中断返回 | RX_Bit | BIT | #SCCI,&CCTL0 | ; 将接收到的位存入进位位C | RRC | RTbuff | ; 将接收到位,移入收发缓冲字 | RX_Test | DEC | Counter | ; 接收数据计数器减1 | JNZ | RX_Next | ; 判断是否接收了所有数据位,没有跳转到后续处理 | BIC | #CCIE,&CCTL0 | ; 接收到所有数据位,关闭捕获比较中断 | RX_Next | RETI | | ; 中断返回 |
|