找回密码
 注册
关于网站域名变更的通知
查看: 1032|回复: 5
打印 上一主题 下一主题

求助:关于串口TI的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-9 09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 十一月 于 2019-4-9 10:33 编辑
  u$ f. w1 |$ c% |6 {* y6 q; T2 g  \: M( h0 n
关于串口TI的问题9 d( ~) j  k0 x. g1 f# ~
& s& l5 {( U6 P% U+ q2 A% W

7 W8 E( M+ j/ p" ^! K有两个问题 在这里请求大神支援
% i0 C! p  L; B4 z1
* I6 c9 ^2 O5 B1 c4 ^#include <reg52.h>
. o  i8 `% N" B8 dvoid main()
* U1 u1 g& O, _) O5 p{" N' Q! x. N+ M; R0 h
while (1)' L; n- ]3 W5 b
SBUF='2';9 r8 l7 K5 C" t2 P
}
0 e/ F; @- t% M3 i, P" G# K& x  x
, x) N& y  l% l2问:资料说“当向SBUF写入完毕,TI会硬件置1”,但是写入单片机之后,串口助手一个数据都没能接受,不是应该能接受一个‘s’吗?* d7 N; L+ U4 Z& x* Y( O
#include <reg52.h>6 b  J  T  w0 b6 k6 i/ T
void main()
. t4 o3 L$ i" `+ O" `/ D" ]( V{
) A+ f( W( `; R. a& A: mwhile (1). {) A9 B( V# \& \8 E4 f$ w; n5 L
{
' ?+ s4 V" G: DSBUF='2';$ ?2 c* v3 X3 i! K
while(!TI);4 h9 E% n8 ~$ g  w, B/ O8 l& _
TI=0;
  X7 v* W/ b, r) h" g1 z; i: P5 F}
, i* |/ S  j! l" M" l1 t7 O* Q

该用户从未签到

2#
发表于 2019-4-9 09:57 | 只看该作者
TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。
: O& z4 w' M& q1 j
/ m& v0 U) O6 U, }0 y" d2 W1.不明白你的程序是什么意思?想表明什么问题
' G$ i( M! d) J2 B2.串口没有初始化,通信频率没有设置
" N9 e, |$ o8 J, L: c//将程序烧写到板子后要重置一下,消除串口干扰; a% G# h3 O  q
#include<reg52.h>
% Q9 c  \: Y" a% L2 O3 p6 Kvoid main()
: S5 z8 `8 y' R8 i# |{- l, B, D& d6 Q9 e* B$ j) g3 l  n* Q
  TMOD=0x20;//设置定时器1为工作方式2
% E/ |* t- e' j3 }! w' u* f  TH1=0xFD; //装入初值 , 晶振11.0592MHz 通信频率9600
8 L5 ]" n' O7 w" d  TL1=0xFD;: J9 V0 O. r8 P% P" a+ K5 J
  TR1=1;  a0 e, ]( a: c6 K5 r3 h
  REN=1;! i3 q; G! q# N
  SM0=0;9 u( ]( B5 M: a3 }# T- r
  SM1=1;! e# H5 C. p$ L/ n! N

; c9 Z" R6 \3 e! X) n+ ]$ T  while(1)
0 e, u  w& t; a9 {7 D+ k  {) q( ^6 K5 \3 [0 [6 b0 A! \% m
    SBUF='A';
2 V+ @6 D. U; G$ ~0 D    while(!TI);1 J9 }+ L- M5 A7 F  ?/ V3 o  `: P* y
    TI=0;: x4 T7 d) j9 T% w$ k: P+ v
  }
8 c# {) q. r1 T7 ]9 @+ k1 s. V. B}
2 _6 r% \2 _% G6 j" H' r- c* I5 S( u

$ x6 B; E* Q4 N% D+ M3 G  B" G2 n9 M. k7 @8 t5 Y- w7 w9 Q$ O
串口程序初始化步骤2 t* K& h' A& s  H" L' m$ }3 I" M4 U
确定T1的工作方式(编程TMOD寄存器);% O+ ^) ^5 o- k( i* r" q3 q
计算T1的初值,装载TH1、TL1;/ D- |5 ]  I5 C- h2 [+ z
启动T1(编程TCON中的TR1位);' o- ^: I0 w7 a6 H. ]
确定串行口控制(编程SCON寄存器);1 p& r( z" h0 F( Z+ ?$ d
如果串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。' B9 G' Q8 w" _" _% c+ i( e- {2 t5 @

点评

第二个程序没有串口程序初始化,但是不应该在while(!TI)处进行死循环吗?我重置了以后,不应该会收到一个’A‘?但是我没有收到; 是不是说如果没有初始化就不会进入中断,没有进入中断 TI 就不会硬件置1?  详情 回复 发表于 2019-4-9 10:04

该用户从未签到

3#
 楼主| 发表于 2019-4-9 10:04 | 只看该作者
helendcany 发表于 2019-4-9 09:574 n7 [/ I5 Z2 ~
TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内 ...
4 N1 b! K. T1 G
第二个程序没有串口程序初始化,但是不应该在while(!TI)处进行死循环吗?我重置了以后,不应该会收到一个’A‘?但是我没有收到;
) L) n8 }$ t, M3 x3 `5 ?' P+ M5 ]是不是说如果没有初始化就不会进入中断,没有进入中断 TI 就不会硬件置1?7 d4 n+ O3 [$ u8 _4 a

点评

1.程序用的是串行口工作方式1,那么定时器1就被作为波特率发生器,TR1=1用来启用工作方式2.TH1 TL1 用来指定波特率,还有这个值是根据晶振和波特率计算出来的 3.串行口都没有工作,TI估计不起作用吧,不应该进入死  详情 回复 发表于 2019-4-9 10:28

该用户从未签到

4#
发表于 2019-4-9 10:28 | 只看该作者
十一月 发表于 2019-4-9 10:04
3 B2 X  P' P9 e- d7 P第二个程序没有串口程序初始化,但是不应该在while(!TI)处进行死循环吗?我重置了以后,不应该会收到 ...

* U7 ]4 }& h- t7 o- ~3 Z; s1.程序用的是串行口工作方式1,那么定时器1就被作为波特率发生器,TR1=1用来启用工作方式2.TH1 TL1 用来指定波特率,还有这个值是根据晶振和波特率计算出来的
% [9 b8 ~# N% k: ]3.串行口都没有工作,TI估计不起作用吧,不应该进入死循环吧(这个我也不懂)- j( ?5 D! C6 }* D9 Z8 b
可以想一下,波特率没有设置,单片机怎么知道你的串口调试程序以什么的波特率来接收数据呢?又怎么会出来'A'?6 V$ n0 a( o7 s, Z3 ?$ [9 t

! G4 w7 a  }8 m6 {2 o5 i7 ~- L* h1 \

点评

谢谢你的回答  详情 回复 发表于 2019-4-9 10:33

该用户从未签到

5#
 楼主| 发表于 2019-4-9 10:33 | 只看该作者
helendcany 发表于 2019-4-9 10:28
, Z8 _: ^# B. o: Y2 R: B1.程序用的是串行口工作方式1,那么定时器1就被作为波特率发生器,TR1=1用来启用工作方式2.TH1 TL1 用来 ...

% H- R# t# y( h2 k+ O谢谢你的回答  ~4 V3 j. j# k& j8 L% \8 E
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-24 01:19 , Processed in 0.125000 second(s), 29 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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