📄 master.lst
字号:
C51 COMPILER V7.01 MASTER 04/17/2008 18:25:35 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE MASTER
OBJECT MODULE PLACED IN master.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE master.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*c8051f内置UART地址识别硬件,UART0的地址是通过串口地址寄存器
2 SADDR0和串口地址允许寄存器SADEN0两个SFR进行编程的。
3
4 设主机发送的地址联络信号00H,01H,02H为从机地址,地址FFH是命令
5 各从机复位SM2=1的复位命令。
6
7 主机的命令如下:
8 01H 请求从机接收主机数据的命令
9 02H 请求从机向主机发送数据的命令
10 其他都按照从机向主机发送数据命令02H来执行
11
12 从机的状态字格式如下:
13 ERR 0 0 0 0 0 TRDY RRDY
14 ERR=1 表示从机接收到的命令是非法的
15 TRDY=1 表示从机已经准备好向主机发送数据
16 RRDY=1 表示从机已经准备好接收主机发送的数据
17
18 通常从机以中断方式控制与主机的通信,程序分为主机程序和从机程序,
19 约定一次传输的数据为16字节,下面以02H地址的从机为例。*/
20
21
22 #include<c8051f020.h>
23 #define uchar unsigned char
24 #define SLAVE 0x02 //从机地址
25 #define BN 16
26 uchar rbuf[16];
27 uchar idata tbuf[16]={"master transmit"};
28
29 void err(void) //发复位FFH命令
30 { SBUF0=0xff;
31 1 while(!TI0);
32 1 TI0=0;
33 1 }
34
35 uchar master(uchar addr,uchar command) //主机函数
36 {
37 1 uchar aa,i,p;
38 1 while(1)
39 1 {
40 2 SBUF0=SLAVE; //发呼叫地址
41 2 while(!TI0);TI0=0;
42 2 while(!RI0);RI0=0; //等待从机地址答复
43 2 if(SBUF0!=addr) err(); //地址错,发复位命令
44 2 else
45 2 {
46 3 TB80=0; //清地址标志
47 3 SBUF0=command; //发命令
48 3 while(!TI0);TI0=0;
49 3 while(!RI0);RI0=0; //等待从机命令答复
50 3 aa=SBUF0;
51 3 if((aa&0x80)==0x80) {TB80=1;err();} //命令出错,发复位命令
52 3 else
53 3 {
54 4 if(command==0x01) //是发送命令
55 4 {
C51 COMPILER V7.01 MASTER 04/17/2008 18:25:35 PAGE 2
56 5 if((aa&0x01)==0x01)
57 5 {
58 6 do{
59 7 p=0; //清校验和
60 7 for(i=0;i<BN;i++)
61 7 {
62 8 SBUF0=tbuf[i]; //发送一字节
63 8 p+=tbuf[i];
64 8 while(!TI0);TI0=0;
65 8 }
66 7 SBUF0=p; //发校验和
67 7 while(!TI0);TI0=0;
68 7 while(!RI0);RI0=0; //等待校验和的应答
69 7 }while(SBUF0!=0); //接收出错,重发。00h为正确,ffh为错误
70 6 TB80=1; //接收正确,置地址标志
71 6 return(0);
72 6 }
73 5 }
74 4 else ////是接收命令
75 4 {
76 5 if((aa&0x01)==0x01) //从机准备好发送
77 5 {
78 6 while(1)
79 6 {
80 7 p=0;
81 7 for(i=0;i<BN;i++)
82 7 {
83 8 while(!RI0);RI0=0;
84 8 rbuf[i]=SBUF0;
85 8 p+=rbuf[i];
86 8 }
87 7 while(!RI0);RI0=0;
88 7 if(SBUF0==p)
89 7 {
90 8 SBUF0=0x00; //校验和相同,发00h
91 8 while(!TI0);TI0=0;
92 8 break; //推出
93 8 }
94 7 else
95 7 {
96 8 SBUF0=0xff;
97 8 while(!TI0);TI0=0;
98 8 }
99 7 }
100 6 TB80=1; //置地址标志
101 6 return(0);
102 6 }
103 5 }
104 4 }
105 3 }
106 2 }
107 1 }
108
109
110
111 void main()
112 {
113 1 TMOD=0x20; //T1方式2
114 1 TH1=0xfd;
115 1 TL1=0xfd; /*传输波特率9600,设SYSDCLK=12Mhz
116 1 T1M=0(按振荡器的12分频计数),SMOD0=0*/
117 1 PCON=0x00;
C51 COMPILER V7.01 MASTER 04/17/2008 18:25:35 PAGE 3
118 1 TR1=1;
119 1 SCON0=0xf8; //UART0方式3,SM20=1,REN0=1,TB80=1
120 1 master(SLAVE,0x01);
121 1 master(SLAVE,0x02);
122 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 200 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 ----
IDATA SIZE = 16 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -