本帖最后由 hfbjjs 于 2012-5-6 04:01 编辑
SN8F26E61 与 PC 机串行通信实践:
近来, SN 的 8F26E,27E 系列应用机会多起来了! 其性价比也有了很大提升! 从指令系统, 芯片资源,中断分开进入对应地址,都与传统 8P 系列芯片有了不少变化, 尤其它的 UART 功能,让人眼前一亮!
对新功能的认识,除了认认真真阅读芯片手册之外, 最重要的就是实践,下面,就用 26E61 进行 UART 通信实践.
在芯片进行过系统初始化后, 对 UART 也进行一次初始化,:
UART 的初始化子程序:
;====================================================
B_CSH_UART:
B0BCLR FURXPEN ; 禁止UART RX 奇偶校验位功能。
MOV A,#101B ; 设置UART 波特率。
B0MOV URRX,A; 设置UART 前置分频器URS[2:0]。
;// MOV A,#0E6H ----- 这个不行!
MOV A,#0E7H ; 设置UART 波特率8 位缓存器。
B0MOV URCR,A
B0BSET FURXEN ; 使能UART RX 功能和引脚。
B0BCLR FURXIRQ ; 清UART RX 中断标志。
B0BSET FURXIEN ; 使能UART RX 中断功能。
B_CSH_TX:
B0BCLR FUTXPEN ; 禁止UART TX 奇偶校验位功能。
B0BSET FUTXEN ; 使能UART TX 功能和引脚。
B0BCLR FUTXIRQ ; 清UART TX 中断标志。
B0BCLR FUTXIEN
RET
;=========================================================
说明: UART 的初始化定义了使用中断来接收 PC 机的通信, 收到后立即把内容发送回给 PC 机. 使用内部 16M/4 RC 振荡器,波特率使用 9600 ,这里出现一个问题,按照手册方法, URRX=010B,URCR=0E6H 就是设置波特率=9600 .结果通信效果不好,老是出错,于是,怀疑内部振荡器不够精确,把 URCR=0E7H 后,效果特好!
UART 的接收中断位于地址 0011H 处,放置一条指令跳到其它位置去执行这个中断.
ORG 0011H
JMP B_ISR_UART_RX ;到其它位置去执行
;---------------------------------------------------------------------------------------------
B_ISR_UART_RX: ;// UART 的接收中断子程序.
BS1 FURXIRQ ;是否 UART_RX 中断?
RETI ;不是则退出
ZB0 FURXIRQ
BS0 FUFMER ;1=UART frame 错误
RETI ;接收错误退出
B0BTS0 FURXBZ ; 检查URXBZ 位
JMP $-1
MOV_ UTXD,URXD ;把收到的内容返回给 PC 机
BS0 FUTXBZ ; 检查UTXBZ 位。
JMP $-1 ; UTXBZ=1,TX 发送过程中。
RETI
;===========================================================
在 PC 机自动发送周期为 500mS时, 双向通信获得成功! 无论中文汉字,数字,字母,均无一错误!----- 上面子程序 8F27E ,8F26E 系列通用! 可以直接拷贝到其它需要的项目去!
实际运行效果图如下:
仅供参考! |