当前位置: 网站首页 > 技术应用 > 单片机应用 > 串口通讯

单片机普通 I/O 与 PC 机串行通信

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 模拟串口的方法较多,我习惯使用这种外部中断+定时器配合的方法,稳定可靠不费神!
运行状态拷贝图:----- 仅供参考!

图片关键词

点击次数:  【关闭
  • 壹零零单片机©版权所有 2008-2025 粤ICP备17151077号

Powered by  xinfuke  5.2.5 ©2008-2025  www.100mcu.com