- 壹零零单片机©版权所有 2008-2025 粤ICP备17151077号
SN 单片机普通 I/O 与 PC 机串行通信(1):
即使单片机没有专门的 UART 功能,要实现与 PC 机的 RS232 串行通信,也是不难的.
准备条件:
按照使用的波特率,准备一个自动重装的 8 位定时器,在 9600 波特率时,定时间隔=104us.
初始化这个定时器,备用状态就行,暂时不要运行.
子程序如下:
;============================================================
B_SETTC0:;TC0定时器设置:;//内部振荡器16/4MHZ,
MOV A,#60H; /2=0.5US
B0MOV TC0M,A ;设置T0 中断间隔时间。
MOV A,#48 ;;TC0M=60H,/2=0.5us,104/0.5=208,256-208=48
MOV TC0C,A
MOV TC0R,A
B0BCLR FTC0IRQ
; B0BSET FTC0ENB ;暂时不要使能TC0 定时器。
RET
;=======================================================
27E61 的 INT0 外部中断位于:
ORG 0009H
JMP B_ISR_INT0 ;一条指令到其它位置处理中断子程序
................
;============================================================
对于 RS232 来说,如果单片机不用发送到 PC 机功能,那么,就用一个可以低电平中断的引脚,在输入模式并且带内部上拉,配置好参数,备用: ;//27E61 为例:
ZB0 FP00M
MOV_ PEDGE,#10;下降沿触发
ZB0 FP00IRQ
ZB1 FP00IEN ;使能中断
ZB1 FGIE ;使能总中断
;====================================================
B_LOOP: ;主循环程序
H_WDTOF;关闭看门狗
...............
JMP B_LOOP
;=====================================================
B_ISR_INT0: ;INT0 外部中断----进行接收 PC 机经过 RS232 发送的数据.
;进入中断后,延时 104/2us 进行检测,
;这是希望在 104us 的中间位置进行检测!
ZMN TEMP,#52;//104/2/0.25=208,208/4=52
DECMS TEMP ;=2
JMP $-1 ;=2
BS0 FP00 ;检测第 1 次低电平
RETI
H_10NOP;采用间隔 10 个 NOP 指令重新检测一次,确保可靠!
BS0 FP00 ;检测第 2 次低电平
RETI
B0BCLR FTC0IRQ ; 使能TC0 定时器和中断功能。
ZMN TC0C,#48 ;TC0M=60H,/2=0.5us,104/0.5=208,256-208=48
B0BSET FTC0ENB ; 使能TC0 定时器。
Z_P00X8:
BS1 FTC0IRQ
JMP $-1
ZB0 FTC0IRQ
ZB0 SRS.7
BS0 FP00;检测第 1 次低电平
JMP @F
H_10NOP
BS0 FP00;检测第 2 次低电平
JMP Z_P00END
JMP Z_S8B0
@@:
ZB1 SRS.7
BS1 FP00;检测第 1 次高电平
JMP Z_P00END
H_10NOP
BS1 FP00;检测第 2 次高电平
JMP Z_P00END
Z_S8B0:
INCMS S8B
COM1 S8B,#8 ;接收8位到否?
JMP @F
ZM0 S8B ;满8位清零
BS1 FTC0IRQ;等待第 9 位==停止位
JMP $-1
ZB0 FTC0IRQ
ZB0 FTC0ENB;停止TC0计时器
BS1 FP00 ;等待高电平==停止位
JMP $-1
MOV A,#60H ;保存数据到 #60H 开始的 RAM 地址
ADD A,JS8C
MOV Z,A
ZM0 Y
MOV_ @YZ,SRS
INCMS JS8C
COM1 JS8C,#16 ;连续保存16个数据,容量:汉字=8,数字字母=16
RETI
ZM0 JS8C
RETI
@@:
ZB0 FC
RRCM SRS
JMP Z_P00X8
Z_P00END:;出现错误则重置有关寄存器值.
ZM0 JS8C
ZM0 SRS
ZM0 S8B
RET
;===========================================================
以上模拟 RS232 接收来自 PC 机的数据稳定可靠,非常实用.有关子程序完全可以直接使用到其它型号的单片机.
普通 I/O 模拟串口的方法较多,我习惯使用这种外部中断+定时器配合的方法,稳定可靠不费神!
运行状态拷贝图:----- 仅供参考!