A. 单片机通信为啥TI不置位哪位大侠帮忙我请客啊多谢
修改了一下,试了试接收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
B. C51单片机,串口设置后TI置1
TI 貌似不能写1,是由硬件置1,软件清零的。写1无效。
当串口发送完一个字节后,就会置1。如果开了中断,就会进入中断程序。如果不清零,就会不停地进入中断。
C. 51单片机发送字节,是把一个字节写入到subf,就会把ti置1,为什么又要把ti再置回0再开ES=1呢
单片机通过串口向外发送一个字节的数据结束后,就会将TI置1,表示发送完了,如果是开中断的话,就会产生中断,在中断子程序中继续发送下一个字节。因这次已经响应了,就应该把TI清0,表示这一次的中断已响应了,如果不清0,就会再次产生中断的,一次发送引起两次或者多次中断,就错误了。所以,一次中断后必须将本次的标志位TI清0,TI是一次有效。如果是查询方式,把要发送的数据写到SUBF后就要查询TI的状态了,当TI=1,就说明这次发送结束了,也必须将TI清0,再发送下一个字节。
在中断子程序中,通常是首先就将TI清0,而中断程序结束后再开ES=1,假如这个顺序反过了,也是可以的,只要在中断子程序中将TI清0就行,至于是否将再开ES=1,要看在中断子程序中的前面关了ES=0,从中断返回后就要开ES=1。其实这一关一开,在中断子程序中没有什么必要,如果不关,也就不用再开了,虽然没有关,在响应串口中断时也不会再响应串口中断,必须从中断返回后才能再次响应的。这只是一些人的习惯了这么写,也没有关系,只要不被误导就好。
如果是单片机接收数据,当接收到一个字节后,就会将RI置1,或者引起中断,从SBUF中读出数据,或者查询RI,再读数据。通常是采用中断的方式接收数据,这样不影响单片机执行其它程序,也不至于因为等待接收数据造成死机。
D. 我用的c8051f020,想通过串口通信向外发送一字符。但给SBUF0赋值后TI0不置位,跪求解决方法!
while(TI0==0); 这里多了一个分号 如果TI0=0的0的话就会一直循环
E. 51单片机RI和TI都是什么时候置位的,软件置位还是硬件置位
置位,就是写1,是硬件;当满足条件时,自动写1了。
清零是软件。
F. 在51单片机中,RI和TI为什么一定要用软件置零,无法用硬件置零。而其他的要要用硬件置零无法用软件置零
不是无法用硬件置零,而是硬件根本就不对RI和TI置零。
其它的,是在进入中断时,硬件就自动置零了,用软件也可以置零,但是肯定是晚了一步。
G. 单片机中的置位和清零分别是什么意思
单片机内部有各种功能的寄存器,比如PIC,C51系列8位的单片机,寄存器的宽度就是八个二进制位,一般是高位在前低位在后,例如:11000011,一共是八位,高四位数据是1100,低四位数据是0011。单片机是可以进行位操作的,一个8位的寄存器我们可以只针对其中一个位或者某些位进行操作,将寄存器相应的位赋值1(高电平)为置位,相反赋值0(低电平)为清零。...
例如c51:
置位指令:SETB,举例:SETB P3.7 ;执行过后P3.7输出为高电平
清零指令 CLR,举例:CLR P3.7 ;执行过后P3.7输出为低电平,这些操作均不影响其它的位。
以上是通过软件来实现的,有的特殊功能寄存器就可能是由硬件自动实现的,比如一些标志位,有些是具有只读属性,用于供程序提供参考。
H. 51单片机串口自收发,产生中断时TI是先于RI置位吗为什么
TI发送完数据就置位。数据位发送完,还要继续发停止位,一般是1个位的1。
接收时收到停止位才能算接收完,RI才有可能置位(某些型号的单片机还有可能要进一步识别错误,如果接收出错,有可能不置位RI)。
I. 发送数据后为什么TI不置1
{
if(TI == 1)
TI=0;
else
{ a=SBUF;
if(a=='X')
{ b=0; /*我调试了,灯没有亮,说明程序没有进来*/
flag=1;
RI=0;
}
}
}
该程序不管是单片机接收字符,还是发送字符都会进入中断。
-------------------
该程序收到干扰,也会进入中断。
但是如果收到的不是'X',就不会清除RI,退出后,RI仍然是1,是不是马上又要进入中断?
是不是永远在主程序、中断中间徘徊?
--
另外,发送时,应该等待一个字节发送完毕,再发送下一个,不可不间断的发送。。