新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用AVR單片機模擬的串口程序

        用AVR單片機模擬的串口程序

        作者: 時間:2012-06-26 來源:網絡 收藏

        在一些應用中經常要用到雙串口,但是一般單片機只提供一個串口,其實完全可以用普通I/O口一個串口。以下的程序是我編寫的,程序中使用了單片機的定時器0,和INT0中斷。數據的發送和接收由中斷程序自動進行。程序已經過AVR仿真器仿真和實際燒片使用,證明可靠。有一點需要說明的是,此的串口為半雙工方式。
        主程序中,單片機將標準串口設置為115200bps,將模擬串口設置為19200bps。單片機將標準串口收到的數據從模擬串口發送出去,將模擬串口接收到的數據從標準串口發送回來。


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

        *********************************
        ;*title:halfduplexuartsimulatonprogram
        ;*version:1.0
        ;*programtime:2001/11/05
        ;*target:AT90S8515
        ;*design:zsmbj@beijing
        ;*****************************************************************

        *********************************
        .include"c:programfilesatmelavrstudioappnotes8515def.inc"
        ;BPS=19200
        ;F=11059200

        .equN=72

        .equtxd0=3;uart0txd
        .equrxd0=2;uart0rxd
        ;****************************************************************
        .equstack=0x0ff
        ;****************************************************************
        ;bitdefine
        .equrdr=0
        .equfe0=1
        .equtd=6
        .equbusy=7
        ;registerdefine
        .deftemp=r16
        .defsbuf0=r17
        .defstatus=r18
        .defbit_cnt=r19
        ;**********************************************************

        ****************************************
        .org0x00
        rjmpreset
        .org0x01
        rjmpint00
        .org0x07
        rjmptimer0_int
        ;**********************************************************
        .cseg
        ;**********************************************************
        ;****initial
        ;**********************************************************
        .org0x0010
        ;resetat90s8515
        reset:
        lditemp,0b00001000
        outddrb,temp

        lditemp,high(stack);stack
        outsph,temp
        lditemp,low(stack)
        outspl,temp

        lditemp,5;baud115200bpsat11.0592Mfosc
        outubrr,temp
        lditemp,0b00011000;enablerxandtx
        outucr,temp
        ;timer0set
        lditemp,0x02;ck/80.72338us
        outtccr0,temp

        lditemp,0x0a;disableoutsidesram,int0falledgemakeainterrupt
        outmcucr,temp
        lditemp,0x40
        outgimsk,temp;enableint0andint1interrupt

        lditemp,0
        movstatus,temp
        sbiportb,txd0;txd0bit=1

        sei;globleinterruptenable
        rjmpmain
        ;******************************************
        timer0_int:
        pushtemp
        intemp,sreg
        pushtemp

        lditemp,(256-N)
        outTCNT0,temp
        incbit_cnt

        sbrsstatus,td
        rjmptimer0_receive
        ;>>>>>>>>>>>>>>>>>>>>>>>>>>
        ;senddata8databitand1stopbit
        timer0_send:
        sbrcbit_cnt,3;ifbit_cnt=8thenstopbit
        rjmptimer0_send_stop
        timer0_send_data:
        sbrcsbuf0,0;txd=0
        sbiportb,txd0
        sbrssbuf0,0;txd=1
        cbiportb,txd0
        lsrsbuf0
        rjmptimer0_end
        timer0_send_stop:
        sbiportb,txd0;stopbit=1
        sbrcbit_cnt,0
        rjmptimer0_complete;ifbit_cnt=9thencomplete
        ;;;;;;;;;;;;;;;;;;;
        intemp,gifr
        sbrtemp,(1intf0)
        outgifr,temp;clrint0flag

        intemp,gimsk
        sbrtemp,(1int0)
        outgimsk,temp;enablegimsk/int0

        rjmptimer0_end


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 五常市| 南开区| 潍坊市| 广昌县| 许昌市| 且末县| 上虞市| 那坡县| 临高县| 镶黄旗| 手机| 三门县| 泰州市| 罗源县| 静乐县| 平陆县| 民和| 开阳县| 肇庆市| 集贤县| 康平县| 潮州市| 简阳市| 临城县| 广汉市| 安徽省| 合山市| 巴彦淖尔市| 苍梧县| 乾安县| 无棣县| 华阴市| 苍山县| 丹寨县| 高雄县| 常山县| 辽宁省| 抚松县| 南丰县| 天长市| 肥城市|