PIC单片机模拟异步串行通讯UART源程序

发布者:心有所属最新更新时间:2020-02-10 来源: eefocus关键字:PIC单片机  模拟异步串行通讯  UART 手机看文章 扫描二维码
随时随地手机看文章

简介:用TMR0实现定时查询。任何带中断的PIC上都可以实现。可用此法扩展多个串口。

;|--------------------------------------------------------------|

;|  Implement duplex USART base on normal I/O pin              |

;|  Using TIMER0 interrupt for bit timing                      |

;|  Tested on PIC16F83 running at 4MHz                          |

;|  Written by Paul Zhang, Microchip Tech Inc                  |

;|  6 Aug, 2000                                                |

;|  All rights reserved                                        |

;|--------------------------------------------------------------|

    errorlevel    -302    ;no bank warning

    errorlevel    -301    ;no default file warning

   

    list      p=16F83    ;define processor

    #include     ;

    __CONFIG  _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

    ;code protect        =    OFF

    ;watchdog        =    OFF

    ;power-up delay timer    =    ON

    ;oscillator mode    =    XT

;===============================

;define RAM variables

    cblock    0x0c        ;GPR start from 0x0c

w_temp                ;W context saving during interrupt

status_temp            ;STATUS context saving during interrupt

pclath_temp            ;PCLATH context saving during interrupt

USART_F                ;containing flags for USART

RX_BUFF                ;USART received data buffer

TX_BUFF                ;USART transmitting data buffer

RX_SLICE            ;RX bit-timing control

TX_SLICE            ;TX bit-timing control

RX_bcnt                ;RX received bit counting

TX_bcnt                ;TX transmitting bit counting

RX_STA                ;RX STATE-MACHINE controller

TX_STA                ;TX STATE-MACHINE controller

    endc

;===============================

;pre-definition for readability

#define    RX_PIN    PORTA,2        ;assign RX pin

#define    TX_PIN    PORTA,3        ;assign TX pin

#define    TXEN    USART_F,0    ;USART transmit enable

#define    TXBUSY    USART_F,1    ;USRAT transmit is in progress

#define    RXBF    USART_F,2    ;USART receive buff full

#define    RXBUSY    USART_F,3    ;USART receive is in progress

#define    RX_ERR    USART_F,4    ;USART receive error

#define    TX_ERR    USART_F,5    ;USART transmit error

;===============================

;define constant

#define    OSC_FREQ    .4000    ;oscillator frequency in KHz

#define    BAUDRATE    .2400

#define TMR0CONST    .118    ;256-OSC_FREQ*1000/4/(BAUDRATE*3) + 2

;===============================

;for my personal style

#define    skp0    btfsc

#define    skp1    btfss

;**********************************************************************

        ORG    0x000

        clrwdt

          goto    MAIN        ; go to beginning of program


;=======================================

;Interrupt service routine

        ORG    0x004        ; interrupt vector location

        movwf  w_temp        ; save off current W register contents

        movf    STATUS,w    ; move status register into W register

        banksel    status_temp

        movwf    status_temp    ; save off contents of STATUS register

        movf    PCLATH,w

        movwf    pclath_temp    ; save off contents of PCLATH

        banksel    INTCON        ;select bank

        skp0    INTCON,T0IF    ;test for TMR0 interrupt

        goto    tmr0IntStart    ;do TMR0 ISR

        ;here test for any other interrupt source

        goto    int_end

tmr0IntStart                ;TIMER0 interrupt service

        bcf    INTCON,T0IF    ;clear T0IF

       

        ;====== start of RX =======

        movlw    high($)

        movwf    PCLATH        ;set PCLATH before PCL change

        movf    RX_STA,w    ;get the state value for RX

        andlw    0x03        ;for safeguard purpose

        addwf    PCL,f        ;switch to STATE

        goto    rxStartChk    ;check for START bit

        goto    rxReceiveBit    ;receive DATA bit

        goto    rxIdle        ;wait for idle

        goto    rxEnd        ;do nothing

rxStartChk    ;check for START bit

        skp0    RX_PIN        ;test RX pin for START bit

        goto    rxEnd        ;not found

        ;start bit found. do following

        movlw    .8

        movwf    RX_bcnt        ;count for 8 bits incoming data

        movlw    .4

        movwf    RX_SLICE    ;wait 4 time-slice for 1st data bit

        movlw    .1

        movwf    RX_STA        ;switch to STATE 1 for 1st data bit sampling

        goto    rxEnd

rxReceiveBit    ;receive DATA bit

        decfsz    RX_SLICE,f    ;wait of bit timing

        goto    rxEnd

        ;time to sample incoming data bit

        rrf    RX_BUFF,f    ;right shift for new bit space

        bcf    RX_BUFF,7    ;pre-set to 0

        skp0    RX_PIN        ;incoming data bit test

        bsf    RX_BUFF,7    ;set if data bit = 1

        movlw    .3        ;3 slice for data bit timing

        movwf    RX_SLICE    ;bit timing for next data bit

        decfsz    RX_bcnt,f    ;see if 8-bit completed

        goto    rxEnd

        ;bit receive completed, do follwoing

        movlw    .2

        movwf    RX_STA        ;set to STATE 2 for idle waiting

        bsf    RXBF        ;set receive buffer full

        movf    RX_BUFF,w    ;display data on PORTB

        movwf    PORTB

        goto    rxEnd

rxIdle        ;wait for idle

        skp0    RX_PIN        ;try to find STOP bit

        clrf    RX_STA        ;back to STATE 0 for next byte

        goto    rxEnd

        ;====== End of RX =========

rxEnd

        ;====== start of TX =======

        ;do TX, if transmit is engaged

        skp1    TXEN        ;skip if TXEN set, do TX

        goto    tmr0IntEnd    ;not in transmit mode

        movf    TX_SLICE,f    ;see if in bit-timing delay

        skpnz            ;

        goto    txDo        ;bit-timing completed

        decfsz    TX_SLICE,f    ;keep bit-timing delay

        goto    txEnd

txDo

        ;Transmit STATE-MACHINE control

        movlw    high($)

[1] [2]
关键字:PIC单片机  模拟异步串行通讯  UART 引用地址:PIC单片机模拟异步串行通讯UART源程序

上一篇:PIC16F877A串口发送字符串问题
下一篇:PIC16f877A AD转换LED显示8位值

推荐阅读最新更新时间:2024-11-09 01:25

s3c2440的UART功能测试
/* 文件名称:UART.c /* 实现功能:最基本的UART发送与接收 /* 作者:无jianqi /* 版本:1.0 #include 2440addr.h //包含2440相关寄存器的设置 #include def.h //四个LED对应GPB5.6.7.8。 #define LED1 5 #define LED2 6 #define LED3 7 #define LED4 8 #define BAUD 115200 //波特率 #define Bit(x) (1《x) //将某位置位 #define Output(x) (1《2*x) //将对应IO置为输出 #
[单片机]
基于STM32模拟UART串口通信
UART工作原理 UART即通用异步收发器,是一种串行通信方式。数据在传输过程中是通过一位一位地进行传输来实现通信的,串行通信方式具有传输线少,成本底等优点,缺点是速度慢。串行通信分为两种类型:同步通信方式和异步通信方式。 但一般多用异步通信方式,主要因为接受和发送的时钟是可以独立的这样有利于增加发送与接收的灵活性。异步通信是一个字符接着一个字符传输,一个字符的信息由起始位、数据位、奇偶校验位和停止位组成。 每一个字符的传输靠起始位来同步,字符的前面一位是起始位,用下降沿通知收方开始传输,紧接着起始位之后的是数据位,传输时低位在前高位在后,字符本身由5~8位数据位组成。 数据位后面是奇偶校验位,
[单片机]
基于STM32<font color='red'>模拟</font><font color='red'>UART</font>串口通信
STM32 UART/USART 的差别
stm32中 uart 是比较常用的, 在使用 HAL时发现了 uart / usart, 原来用一直都没有太注意, 现在有闲时整理一下. 1、UART:universal asynchronous receiver and transmitter通用异步收发器, 仅需要 RX / TX 接口. 2、USART:universal synchronous asynchronous receiver and transmitter通用同步异步收发器, 除了 TX/RX 之外, 还额外需要一个 CLK 的 PIN 脚. 也就是说:UART的一般只能用于异步串行通讯,而名称为USART的既可以用于同步串行通讯,也能用于异步串行通讯。 在
[单片机]
基于STM32的模拟UART串口通信工作原理
UART工作原理 UART即通用异步收发器,是一种串行通信方式。数据在传输过程中是通过一位一位地进行传输来实现通信的,串行通信方式具有传输线少,成本底等优点,缺点是速度慢。串行通信分为两种类型:同步通信方式和异步通信方式。 但一般多用异步通信方式,主要因为接受和发送的时钟是可以独立的这样有利于增加发送与接收的灵活性。异步通信是一个字符接着一个字符传输,一个字符的信息由起始位、数据位、奇偶校验位和停止位组成。 每一个字符的传输靠起始位来同步,字符的前面一位是起始位,用下降沿通知收方开始传输,紧接着起始位之后的是数据位,传输时低位在前高位在后,字符本身由5~8位数据位组成。 数据位后面是奇偶校验位,最后是停止位,停止位是用高
[单片机]
基于STM32的<font color='red'>模拟</font><font color='red'>UART</font>串口通信工作原理
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved