设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 1656|回复: 0
收起左侧

C51汇编实现软串口收发的方法

[复制链接]
发表于 2018-3-5 13:35:08 | 显示全部楼层 |阅读模式
  1. ;型号:AT89C52 晶振频率:11.0592Mhz 波特率9600 无校验位 停止位1位
  2. ;软串口与硬串口不同,软串口通过移位运算以及操作I/O口电平实现。
  3. ;硬串口由配置特殊功能寄存器由硬件发出,此程序针对没有硬串口的IC使用。
  4. ;软串口波特率不宜过高,否则误码率会增加。
  5. START:
  6. CALL RXD_DATA
  7. MOV P1,A        ;将A寄存器接收到的数据送给P1口,确保收到的数据没有错误
  8. CALL TXD_DATA        ;将接收到的数据发回
  9. JMP START

  10. TXD_DATA:                        ;将A寄存器里的值通过软串口送出
  11.         PUSH B                        ;B寄存器压入堆栈
  12.         PUSH PSW                ;PSW压入堆栈
  13.         ACALL DELAY_PORT         ;延迟1/9600s
  14.         CLR TXD                        ;发送起始位 低电平
  15.         MOV B,#8                ;1字节有8位,所以这里发8个位
  16.         TXD_BIT:                ;发1比特数据
  17.         ACALL DELAY_PORT
  18.         MOV C,ACC.0                ;A寄存器第0位送C标志
  19.         MOV TXD,C                ;C标志送TXD(P3.1)
  20.         RR A                         ;A寄存器循环右移1位,发下1位
  21.         DJNZ B,TXD_BIT                ;寄存器B减1,不为0继续发位
  22.         ACALL DELAY_PORT        
  23.         SETB TXD                ;发送停止位,高电平
  24.         POP PSW                        ;PSW弹出堆栈
  25.         POP B
  26.         RET

  27.         RXD_DATA:                ;串口接收数据,如果没有数据则一直等待,结果存入A寄存器
  28.         PUSH B
  29.         PUSH PSW
  30.         CLR A                                ;A寄存器清0
  31.         MOV B,#8                        ;1字节有8位,将8送B寄存器

  32.                 WAIT_RXD_START:               
  33.                 MOV C,RXD                ;RXD(P3.0)电平送C
  34.                 JC WAIT_RXD_START        ;C为1(RXD为高电平) 则一直等待,低电平进行下一步操作

  35.                 RXD_BIT:        ;收1比特数据
  36.                 ACALL DELAY_PORT
  37.                         MOV C,RXD        ;接收电平送C标志
  38.                         MOV ACC.0,C        ;C标志送A寄存器第0位
  39.                         RR A                ;A寄存器循环右移1位,收下1位数据
  40.                 DJNZ B,RXD_BIT                ;B减1,不为0继续接收
  41.                 ;数据接收完毕
  42.                 ;ACALL DELAY_PORT
  43.                 WAIT_RXD_END:                ;等待收到停止位(高电平)

  44.                 MOV C,RXD                ;RXD(P3.0)电平送C
  45.                 JNC WAIT_RXD_END        ;C为0(RXD为低电平) 则一直等待
  46.                        

  47.         POP PSW
  48.         POP B
  49.         RET

  50. DELAY_PORT:   ;11.0592Mhz@9600Bps@AT89C52 延迟104.166667Us
  51.     MOV R6,#0DH
  52. DL0:
  53.     MOV R5,#02H
  54.     DJNZ R5,$
  55.     DJNZ R6,DL0
  56.     RET

  57. END
复制代码
您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-20 02:38 , Processed in 0.452025 second(s), 16 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表