《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

纯软件单片机串口(二)(ASM)
程序匠人 发表于 2005-8-17 18:06:00  阅读全文 | 回复(0) | 引用通告 | 编辑

     纯软件单片机串口(二)
      这是另外一个使用中断查寻的程序!
      www.ubicom.com or www.scenix.com
      到UBICOM看看,那里的串口都是纯软件的

      SEND_READ    EQU     01H    ;Bit for write(0) or read(1)
      SEND_ENDS    EQU     02H    ;Bit for communiciating(1) or ends(0) 
      READ_ENDS    EQU     03H    ;Bit for reading(1) or ends(0)
      READ_INT     EQU     04H    ;Bit intettupt sending to reading
      BUAD_RAM_H   EQU     30H    ;Communite buad TH
      BUAD_RAM_L   EQU     31H    ;Communite buad TL
      SEND_TIME    EQU     32H    ;Send int times count
      READ_TIME    EQU     33H    ;Read int times count
      SEND_CODE    EQU     34H    ;Byte  that  may be send
      READ_CODE    EQU     35H    ;Read  ends value byte
      READ_BUFF    EQU     36H    ;Read  bit  RRC
      SEND_COUNT   EQU     37H    ;Send  bit  count
      READ_COUNT   EQU     38H    ;Read  bit  count
      SEND_FLAG    EQU     39H    ;Send  byte flag (0-->start send)
      READ_FLAG    EQU     3AH    ;Read  byte flag (0-->check start bit)
      TXD_LINE     EQU     P3.1;P1.6   ;TXD  line
      RXD_LINE     EQU     P3.0;P3.2   ;RXD  line
      BUAD_H       EQU     0FFH   ;9600   4800   2400   1200   600    300
      BUAD_L       EQU     0C3H   ;FFE0   FFC0   FF80   FF00   FE00   FC00

                      ORG     0000H
                      SJMP    MAIN
                      ORG     000BH
                      LJMP    COMM_INT
                      ORG     0040H
      MAIN:           MOV     IE,#00H
                      MOV     SP,#62H
                      MOV     P1,#0FFH
                      MOV     P3,#0FFH

                      MOV     R1,#30H         ;Clr   CPU   RAM
                      MOV     R2,#30H
             LOOP:    MOV     @R1,#00H
                      INC     R1
                      DJNZ    R2,LOOP

                      MOV     BUAD_RAM_H,#BUAD_H
                      MOV     BUAD_RAM_L,#BUAD_L
                      MOV     TMOD,#01H
                      MOV     TH0,BUAD_RAM_H
                      MOV     TL0,BUAD_RAM_L
                      SETB    TR0
                      SETB    ET0
                      SETB    PT0
                      SETB    EA
                      SETB    SEND_ENDS
                      SETB    READ_ENDS
                      LCALL   SEND_TEST_CODE
                      LCALL   TEST1


      LOOP0:          MOV     R1,#40H
                      MOV     R2,#00H
                      MOV     READ_FLAG,#00H
                      SETB    SEND_READ
      LOOP1:          ;SETB    READ_ENDS
                      JB      READ_ENDS,$
                      SETB    READ_ENDS
                      MOV     A,READ_CODE
                      MOV     @R1,A
                      INC     R1
                      INC     R2
                      CJNE    A,#3FH,NEXT1
                      SJMP    NEXT2
      NEXT1:         CJNE    R2,#20H,LOOP1

      NEXT2:         MOV     R1,#40H
      LOOP2:         MOV     SEND_FLAG,#00H
                      MOV     SEND_CODE,@R1
                      CLR     SEND_READ
                      JB      SEND_ENDS,$
                      SETB    SEND_ENDS
                      JB      READ_INT,LOOP3
                      INC     R1
                      DJNZ    R2,LOOP2
                      SJMP    LOOP0
      LOOP3:         CLR     READ_INT
                      MOV     R1,#40H
                      MOV     R2,#00H
                      SJMP    LOOP1


                      ;LCALL   SEND_TEST_CODE
                      MOV     SEND_CODE,READ_CODE
                      CLR     SEND_READ
                      MOV     SEND_FLAG,#00H
                      SETB    SEND_ENDS
                      JB      SEND_ENDS,$
                      SJMP    $
                      SJMP    $
      ;**********************************************
      TEST1:          MOV     READ_FLAG,#00H
                      SETB    SEND_ENDS
      MM1:            MOV     SEND_CODE,#3DH
                      MOV     SEND_FLAG,#00H
      MM3:            ;CLR     SEND_READ
                      JB      SEND_ENDS,$
                      SETB    SEND_ENDS

                      JNB     READ_INT,MM1
                      CLR     READ_INT

                      SETB    READ_ENDS

                      JB      READ_ENDS,$

                      MOV     R7,#00H
                      DJNZ    R7,$
                      MOV     SEND_CODE,READ_CODE
                      MOV     SEND_FLAG,#00H
                      SJMP    MM3
                      RET

      ;******************************
      SEND_TEST_CODE: MOV     R6,#61H
                      MOV     R7,#1AH
           SEND_LOOP: MOV     SEND_CODE,R6
                      CLR     SEND_READ
                      MOV     SEND_FLAG,#00H
                      SETB    SEND_ENDS
                      INC     R6
                      JB      SEND_ENDS,$
                      DJNZ    R7,SEND_LOOP
                      RET

      ;*********************************************************************
      ;* SEND_READ    EQU     01H    Bit for write(0) or read(1)           *
      ;* SEND_ENDS    EQU     02H    Bit for communiciating(1) or ends(0)  *
      ;* READ_ENDS    EQU     03H    Bit for reading(1) or ends(0)         *
      ;* SEND_TIME    EQU     30H    Send  int  times count                *
      ;* READ_TIME    EQU     30H    Read  int  times count                *
      ;* READ_BUFF    EQU     31H    Read  bit  RRC                        *
      ;* SEND_COED    EQU     32H    Byte  that  may be send               *
      ;* READ_CODE    EQU     32H    Read  ends value byte                 *
      ;* SEND_COUNT   EQU     33H    Send  bit  count                      *
      ;* READ_COUNT   EQU     33H    Read  bit  count                      *
      ;* BUAD_RAM_H   EQU     34H    Communite buad TH                     *
      ;* BUAD_RAM_L   EQU     35H    Communite buad TL                     *
      ;* SEND_FLAG    EQU     36H    Send  byte flag (0-->start send)      *
      ;* READ_FLAG    EQU     37H    Read  byte flag (0-->check start bit) *
      ;* TXD_LINE     EQU     P1.4   Data TXD  line                        *
      ;* RXD_LINE     EQU     P1.3   Data RXD  line                        *
      ;* When send: SETB SEND_ENDS   //  CLR  SEND_READ                    *
      ;*            MOV  SEND_CODE,(Byte that will be send)                *
      ;*            MOV  SEND_FLAG,#00H                                    *
      ;*      if COMM_ENDS is 0 that completed send communiciation.        *
      ;*      if COMM_FLAG isn't 03H the send communiciating has been      *
      ;*         interrupted by read communiciation.                       *
      ;* When read: SETB  READ_ENDS   //    SETB  SEND_READ                *
      ;*            MOV  READ_FLAG,#00H                                    *
      ;*      if READ_ENDS is 0 that completed read communiciation         *
      ;*         and the value is READ_CODE.                               *
      ;*********************************************************************
      COMM_INT:       PUSH    ACC
                      PUSH    PSW
                      MOV     A,TL0                   ;================
                      ADD     A,BUAD_RAM_L
                      MOV     TL0,A                   ;================
                      MOV     TH0,BUAD_RAM_H          ;================
                      JB      SEND_READ,READ_DATA     ;0 Send  or  1 Read

                      JB      RXD_LINE,COMM_NEXT0     ;Read first
                      CLR     SEND_ENDS               ;Close send
                      SETB    TXD_LINE
                      SETB    READ_INT

                      MOV     READ_FLAG,#01H          ;Start read
                      SETB    SEND_READ
                      POP     PSW
                      POP     ACC
                      RETI
                ;********  Send communicating   **********
        COMM_NEXT0:   DJNZ    SEND_TIME,COMM_EXIT
                      MOV     SEND_TIME,#03H
                      MOV     A,SEND_FLAG             ;Process send flag
                      CJNE    A,#01H,COMM_NEXT1       ;Loop  send
                      MOV     A,SEND_CODE
                      RRC     A
                      MOV     TXD_LINE,C
                      MOV     SEND_CODE,A
                      DJNZ    SEND_COUNT,COMM_EXIT    ;Loop  end
                      INC     SEND_FLAG
                      POP     PSW
                      POP     ACC
                      RETI
        COMM_NEXT1:   CJNE    A,#00H,COMM_NEXT2       ;Send  start bit
                      CLR     TXD_LINE                 ;1 start_bit low
                      INC     SEND_FLAG
                      MOV     SEND_COUNT,#08H
                      MOV     SEND_TIME,#03H
                      SJMP    COMM_EXIT
        COMM_NEXT2:   CJNE    A,#02H,COMM_EXIT        ;Send stop bit
                      SETB    TXD_LINE
                      INC     SEND_FLAG
                      CLR     SEND_ENDS               ;completed communicate
                      SETB    SEND_READ               ;Setup read status
      COMM_EXIT:      POP     PSW
                      POP     ACC
                      RETI
               ;*********  Read communicating  **********
      READ_DATA:      MOV     A,READ_FLAG
                      CJNE    A,#02H,READ_NEXT1       ;Read a byte
                      DJNZ    READ_TIME,READ_EXIT
                      MOV     READ_TIME,#03H
                      MOV     A,READ_BUFF
                      MOV     C,RXD_LINE
                      RRC     A
                      MOV     READ_BUFF,A
                      DJNZ    READ_COUNT,READ_EXIT    ;Completed read
                      MOV     READ_CODE,A             ;Write read data byte
                      INC     READ_FLAG               ;Setup  for  next  byte
                      MOV     READ_TIME,#02H
                      POP     PSW
                      POP     ACC
                      RETI
      READ_NEXT1:    CJNE    A,#00H,READ_NEXT2
                      JB      RXD_LINE,READ_EXIT      ;Check  RXD(RXD_LINE)
first
                      CLR     SEND_ENDS
                      INC     READ_FLAG
                      POP     PSW
                      POP     ACC
                      RETI
        READ_NEXT2:   CJNE    A,#01H,READ_NEXT3
                      JB      RXD_LINE,CHECK_ERROR    ;Check start bit  twice
                      INC     READ_FLAG               ;Setup  for  read  data
                      MOV     READ_COUNT,#08H
                      ;MOV     A,TL0                   ;=============
                      ;ADD     A,#05H
                      ;MOV     TL0,A                   ;=============
                      MOV     READ_TIME,#03H    ;
                      POP     PSW
                      POP     ACC
                       RETI
        CHECK_ERROR:  MOV     READ_FLAG,#00H          ;fail  quit
                      POP     PSW
                      POP     ACC
                      RETI
      READ_NEXT3:    DJNZ    READ_TIME,READ_EXIT      ;Wait stop bit
                      MOV     READ_TIME,#03H
                      MOV     READ_FLAG,#00H
                      CLR     READ_ENDS
                      ;CLR     SEND_READ
      READ_EXIT:      POP     PSW
                      POP     ACC
                      RETI
              END

 

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!