新聞中心

        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 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 密山市| 西贡区| 罗田县| 平远县| 莱芜市| 宣武区| 惠水县| 兴安县| 板桥市| 穆棱市| 建始县| 屯门区| 扎兰屯市| 通渭县| 论坛| 万全县| 民和| 大埔区| 宣汉县| 保靖县| 邛崃市| 武穴市| 土默特左旗| 永丰县| 沙田区| 渝北区| 余姚市| 新巴尔虎左旗| 昔阳县| 秦安县| 丰城市| 武隆县| 阿坝| 衡阳市| 宽甸| 靖江市| 南雄市| 云南省| 南投县| 塔城市| 承德市|