历史上的今天
返回首页

历史上的今天

今天是:2025年02月10日(星期一)

正在发生

2020年02月10日 | PIC单片机模拟异步串行通讯UART源程序

2020-02-10 来源:eefocus

简介:用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($)

推荐阅读

史海拾趣

达晶微(CREATEK)公司的发展小趣事

随着市场需求的不断变化,达晶微不断加大研发投入,推出了一系列具有创新性的产品。这些产品不仅提高了能效,降低了成本,还满足了客户对高质量、高性能半导体器件的需求。公司凭借技术创新和产品升级,赢得了客户的广泛认可。

Dalian Dlicap Corporation公司的发展小趣事

2023年12月29日,大连达利凯普科技股份公司在深圳证券交易所创业板正式挂牌上市,股票代码为301566。这一里程碑式的事件标志着公司进入了一个新的发展阶段。上市融资将为达利凯普提供更多的资金支持和发展机遇,公司将继续加大研发投入和市场拓展力度,不断推动技术创新和产业升级。同时,达利凯普也将积极履行社会责任和义务,为电子行业的发展做出更大的贡献。

请注意,这些故事概要基于现有信息整理而成,具体细节可能因时间、环境等因素而有所不同。

Digi International公司的发展小趣事

为了庆祝公司成立30周年,Digi International推出了全新的品牌标识。这一品牌升级不仅展现了公司的创新精神和市场地位,也为其未来的发展注入了新的活力。同时,品牌升级也反映了公司对市场趋势的敏锐洞察和对客户需求的深入理解。

Efficient Power Conversion公司的发展小趣事

EPC公司成立于2007年,由三位拥有六十年先进功率管理技术经验的资深工程师共同创立。公司的创始人们认识到,随着技术的不断发展,传统的硅功率技术已接近其性能极限。他们决定专注于氮化镓技术的研究与开发,这是一种新型的半导体材料,具有比硅更高的电子迁移率和更低的电阻。经过数年的研究和试验,EPC公司成功开发出了基于氮化镓的高效功率半导体器件,这一突破性的技术为公司的未来发展奠定了坚实的基础。

APC (APC by Schneider Electric)公司的发展小趣事

在电子行业的早期,电源的稳定性是许多企业和个人用户面临的一大难题。正是在这样的背景下,APC公司凭借其敏锐的市场洞察力,将重心放在小型桌面不中断电力供应(UPS)系统的电源保护及开发上。1984年,APC推出了公司的首个UPS产品,为PC、PC服务器及其网络提供了可靠的电力保障。这一创新举措不仅解决了当时的电力供应问题,更为APC在UPS电源保护领域奠定了坚实的基础。

ALLEN BRADLEY公司的发展小趣事

APC的产品和服务在全球范围内赢得了广泛认可。其InfraStruXure产品线因其集成式的电力、制冷、机架、管理和服务实现了一种开放、具有适应性且集成化的解决方案,赢得了近20个奖项。此外,APC还因其卓越的产品和业务表现,在多个年份赢得了全球100多个奖项。这些奖项不仅证明了APC在电子行业中的领先地位,也反映了其对于创新和质量的不懈追求。

问答坊 | AI 解惑

基于LabVIEW的信号输出与数据采集系统

基于LabVIEW的信号输出与数据采集系统…

查看全部问答>

论坛资料重复太多了,有办法解决吗?

本人在论坛下载下来的时候发现,竟然有很多资料内容都是一样的,只改头换面而已,既浪费芯币又浪费时间,可怜我辛苦攒来的芯币呀!晕…希望管理员重视。…

查看全部问答>

源程序--我用逻辑分析仪测试时隙,调试出的18b20

我用逻辑分析仪测试出的1820时隙,源代码 …

查看全部问答>

职业规划与职业危机

一个看上去很美的职业生涯,往往是有心人策划出来并锲而不舍地为之努力,才能成就的。然而,能在从业之初就有很明确职业规划的人,毕竟是少数,很多人的职业规划是在工作3-5年间慢慢建立起来的,甚至还有一部分人一辈子也没有明确的职业规划。   ...…

查看全部问答>

2410板子正常启动wince之后超级终端如何显示的??

小弟现在在搞wince 编译了一个内核下载到2410的开发板里面,但是现在暂时没有VGA的接口显示屏幕, 我想问一下正常启动wince在超级终端里面应该显示什么样子的??我总觉的我的有点问题ID[1] { chainInfo.dwLoadAddress: 0X00000000 chainInfo.dw ...…

查看全部问答>

Wince6.0 中文模拟器

我从这里下载wince6.0中文模拟器,然后安装到VS2005里面。最后还装了一个wince6.0。 同时也装了ActiveSync4.5. 但是这个wince6.0的中文模拟器CHSEmu Emulator,通过ActiveSync4.5 一直连接不上。 不知道是为什么?但同时我装Windows mobile 5.0 ...…

查看全部问答>

请教大家下面IC的型号和厂商?

请各位大侠和兄弟姐妹帮忙,先在此谢过了。…

查看全部问答>

利用2510-AT型自动调谐温度控制源表自动优化热电制冷器PID系数

概述 许多热电制冷器(TEC)控制器采用PI或PID(比例、积分、微分)环路实现温度控制。虽然这些环路可以提供精密的温度控制,但却要求适当的P(比例)、I(积分)、D(微分)值。在很多情况下,这些P(比例)、I(积分)、D(微分)值是通过试验和误 ...…

查看全部问答>

有关LED灯珠的COB封装相对于传统SMD封装的介绍

随着固态照明技术的不断进步,COB(chip-on-board)封装技术得到越来越多的重视,由于COB光源有热阻低,光通量密度高,眩光少,发光均匀等特性,在室内外照明灯具中得到了广泛的应用,如筒灯,球泡灯,日光灯管,路灯以及工矿灯。   本文就COB封装 ...…

查看全部问答>