码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-12-27 17:49:37      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

工作方式一讲解:

(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页

 

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

标签:

原文地址:http://www.cnblogs.com/shengruxiahua/p/5080287.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!