单片机通信为啥TI不置位?哪位大侠帮忙我请客啊多谢

用的ta89c51,向PC机单发送可是TI总是不置位数据也传不过去(接口是usb转TTL)

org 0000HAJMP MAIN;转入主程序org 0030HMAIN:MOV SCON,#50H;设置成串口1方式
MOV TMOD,#20H;波特率发生器T1工作在模式2上MOV PCON,#80H;波特率翻倍为2400x2=4800BPSMOV TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)SETB TR1;启动定时器T1 MOV A,#0AFH;将16进制的字符AF发送到串口去 MOV SBUF,A;将遥控器键值通过串口发送出去 g:JNB Ti,g;发送之后要判断Ti位是否置1,置1了才表示发送完成,然后用软件置0,否则只收到一次。MOV SBUF,A;将遥控器键值通过串口发送出去 CLR Ti
RET ;退出解码子程序end

修改了一下,试了试接收OK。

PS:还有就是主程序里不要加RET,没有LCALL及入栈指令就RET弹出堆栈指针 会让再往下的系统错乱,虽然这个并不是你这个程序的症结所在。

org 0000H

AJMP MAIN;转入主程序

org 0030H


MAIN:

LCALL DELAY100MS ;开机稳定延时


MOV SCON,#50H;设置成串口1方式

MOV TMOD,#20H;波特率发生器T1工作在模式2上

MOV PCON,#80H;波特率翻倍为2400x2=4800BPS

MOV TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)

MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)

SETB TR1;启动定时器T1

 MOV A,#0AFH;将16进制的字符AF发送到串口去

 MOV SBUF,A;将遥控器键值通过串口发送出去

 g:JNB Ti,g;发送之后要判断Ti位是否置1,置1了才表示发送完成,然后用软件置0,否则只收到一次。

 

LCALL DELAY100MS ;发送分隔延时

 MOV SBUF,A;将遥控器键值通过串口发送出去

 CLR Ti

SJMP $ ;停止

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DELAY100MS: ;@12.000MHz

PUSH 30H

PUSH 31H

MOV 30H,#195

MOV 31H,#133

   NEXT:DJNZ 31H,NEXT

DJNZ 30H,NEXT

POP 31H

POP 30H

RET

end

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-25
你的程序时好的 啊,我用软件仿真了一下,
12M晶振的情况下正常4800的波特率
而且你的发送方式11bit数据方式:起始位、8bit数据 奇偶校验位、停止位

唯一不明白的是你的 RET 指令追问

RET 忘记删除了,为了简化其它给删除了
哈哈 ,我的C51单片机通信口应该是坏的,我用c2051就可以发送。

第2个回答  2013-09-26
你看看技术手册,Ti应该是硬件置位的
相似回答
大家正在搜