发表于:2010/12/26 11:52:53
#0楼
下面这个程序利用单片机的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
硬件连接如附件
本来程序发送的是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