(九)方式一 单工串行通信 (未能解决)已解决,但不会调试

工作方式一讲解:

(1)特点

1.8位UART接口。

2.帧结构为10位,包括起始位(为0),8位数据位,1位停止位。

3.波特率由指令设定,由T1的溢出率决定。

(2)发送操作

当执行一条“MOV SBUF,A”指令时,启动发送操作,A中的数据从TXD端实现异步发送。发送完一帧数据后自动置TI=1,请求中断。要继续发送时,TI必须由指令清零。

(3)接收操作

当置REN=1时,串行口采样RXD,当采样到1至0的跳变时,确认串行数据帧的起始位,开始接收一帧数据,直到停止位到来时,把停止位送入RB8中。置位RI请求中断。CPU取走数据后用指令清零RI。

 

 

未能成功解决,技术难点 遇到 两个 main 函数,不知道究竟该怎样调试,还是把它们一个个输入进去???????

还是以后用 实物 试一试!!!!

电路图:

2、 参考代码(由于有两个 main 不知道 该怎样解决)

 1 // 甲机串行发送
 2 #include<reg52.h>
 3 #define uint16 unsigned int
 4 #define uchar8 unsigned char 
 5 
 6 void main()
 7 {
 8      uchar8 temp = 0;
 9      TMOD = 0x20;   //  设置定时器T1 为 方式2
10      TH1= 0xfd;
11      TL1= 0xfd;
12      SCON = 0x40;
13      PCON = 0x00;
14      TR1  = 1;
15      P2   = 0xff ;
16 
17      while(1)
18      {
19        while(T1==0);
20        T1=0;
21        temp=P2;
22        SBUF = temp ;
23           
24      }
25       
26 }
27 
28 
29 // 乙机串行接收
30 #include<reg52.h>
31 #define uint16 unsigned int
32 #define uchar8 unsigned char 
33 
34 void main()
35 {
36      uchar8 temp = 0;
37      TMOD = 0x20;   //  设置定时器T1 为 方式2
38      TH1= 0xfd;
39      TL1= 0xfd;
40      SCON = 0x50;
41      PCON = 0x00;
42      TR1  = 1;
43      
44      while(1)
45      {
46        while(RI==0);
47        RI=0;
48        temp=SBUF;
49        P1=temp ;
50           
51      }
52       
53 }

郁闷啊,再来试一下

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

由于这是两个程序代码,所以要分别编译,生成 .HEX 文件

然后断开 proteus 的 远程调试按钮,分别加载到里面就可以了,注意两个hex 不要加载犯了。

 1 // 甲机串行发送
 2 #include<reg52.h>
 3 #define uint16 unsigned int
 4 #define uchar8 unsigned char 
 5 
 6 void main()
 7 {
 8      uchar8 temp = 0;
 9      TMOD = 0x20;   //  设置定时器T1 为 方式2
10      TH1= 0xfd;
11      TL1= 0xfd;
12      SCON = 0x40;
13      PCON = 0x00;
14      TR1  = 1;
15      P2   = 0xff ;
16 
17      while(1)
18      {
19        while(T1==0);
20        T1=0;
21        temp=P2;
22        SBUF = temp ;
23           
24      }
25       
26 }
甲机串行发送
 1 // 乙机串行接收
 2 #include<reg52.h>
 3 #define uint16 unsigned int
 4 #define uchar8 unsigned char 
 5 
 6 void main()
 7 {
 8      uchar8 temp = 0;
 9      TMOD = 0x20;   //  设置定时器T1 为 方式2
10      TH1= 0xfd;
11      TL1= 0xfd;
12      SCON = 0x50;
13      PCON = 0x00;
14      TR1  = 1;
15      
16      while(1)
17      {
18        while(RI==0);
19        RI=0;
20        temp=SBUF;
21        P1=temp ;
22           
23      }
24       
25 }
乙机串行接收

注意: 与 书上 图 改了 一下,把 开关移 到了 P2 口

 

成功了 ,代码要重新分析,添加注释!!!!!!!!!!!!!!!!! fuck 

再次分析: 实际上 可以把 从 甲机 RXD 到 乙机 TXD 的一根线拆掉,只保留一根线既可,因为是单向的啊,如下

 

懂了伐, 至于 工作方式1 ,要看书 123页

 

posted on 2015-12-27 16:12  无悔这一生。  阅读(543)  评论(0编辑  收藏  举报

导航