登录
首页 单片机论坛
回帖 发帖
正文

主题:一段并口模拟串口的汇编请教

点击:987 回复:5

下面这个程序利用单片机的P1.3口模拟成串口发送数据,
硬件连接如附件
本来程序发送的是A0,但PC机上的接收所有均为00H,其它的数也是如此
PC机的串口测试软件的波特率调节与发送的均调为4800
   newto equ P1.3;用于模拟串口的IO口
       ;同时在p0.0中闪灯
ORG    0000H
LJMP   main
main:  ;定时器的初始化工作
MOV TMOD,#21H ;定时器0的启动与工作方式2的设定
MOV TH0, #0FfH ;定时器0高8位初值
MOV TL0, #2FH ;定时器0的低8位初值;4800BPS
       mov sp,  #60H   ;堆栈位置
t2:
mov r7,#0A0H ;发送A0到模拟口
lcall sendp
t1: ;延时间隔, 暂停及关灯时间
       mov r3,#10H
       mov r4,#0ffH
       mov r5,#0ffH
d1:     setb newto     ;关灯
djnz r5,d1
       djnz r4,d1
       djnz r3,d1
jmp t2      ;间断时间后重新发送 以便观看测试数据
    ret
;;============================================================
;;将R7的数据以P0.0口发送出去!波特率未调为2400
;;============================================================
sendp: ;发送字节
       MOV    R6, #08H ;0000 1000
       SETB   TR0 ;开定时器0
clr newto ;清空P1.5口,这时准备工作?发送的前准备?是高还是低?
       clr p0.0
       LCALL  delaybps ;查是否计时到等到一个新的开始
clr c ;发送前先清空一次
sendbit:
       MOV    A, R7 ;这时的R7是什么值?是要发送的字,数据
       RRC    A ;循环右移,这时的状态是将A(只能是A)向右移一位,且被移出的一位去到了CY处
;所以后面要发送的就是C就行了!
MOV    R7, A ;将新的数放回R7以备下次发送
mov newto,C ;将进位标志的值发送到相关口
       mov p0.0 ,c
       LCALL  delaybps ;等一下个周期到
       CLR    C
djnz r6,sendbit ;减一,不为0则转移
exitsend:
setb newto ;发送完成标志
       setb p0.0
       LCALL  delaybps ;等下一个周期
       CLR    TR0 ;关闭定时器0
       RET
delaybps: ;一直等到计时到了再做工作
       JNB    TF0, delaybps ;查计时器0的溢出标志,为0则转移,且不影响标志位
;此时为标志有溢出,即时间到,重新计数
CLR    TF0 ;计时器0溢出标志清空
       MOV    TH0, #0FFH ;重置计时器0的高8位
       MOV    TL0, #2FH ;重置计时器0的低8位
       RET
;;=============================================================================
;;计时式IO口模拟串口工作完成
;;=============================================================================
   END
附件
10-12-26 11:52
发送是灯会闪,同时也收到数据,只是数据不对
估计有些地方不对,但不知原因在哪里
请各位高手指点下!
10-12-26 12:04
示波器看下波形.
10-12-27 10:19
问题不在程序,而是因为PC机的COM口电平与单片机的电平不一样,要转换
10-12-30 19:09
4楼
该帖内容不符合相关规定!
11-01-03 18:27
学习一下。。。。。
12-03-23 15:08

工控新闻

更多新闻资讯