📄 d_485.lst
字号:
C51 COMPILER V7.50 D_485 04/27/2009 15:18:14 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE D_485
OBJECT MODULE PLACED IN d_485.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE d_485.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*************************************************************************************************
2 * 文 件 名:485.c
3 * 功 能:485主机通信模块
4 * 硬件条件: 1.CPU型号:ATMEL2051
5 * 2.晶振:11.0592
6 * 作 者:zwb
7 * 日 期:2009年04月24号
8 *************************************************************************************************/
9 //-----------------------函数声明,变量定义--------------------------------------------------------
10 #include <reg51.h>
11 #include <INTRINS.h>
12 #include <string.h>
13 #define unchar unsigned char
14 #define COUNT 10 // 定义接收缓冲区大小
15 unsigned char Receive_buffer[COUNT]; //定义接收缓冲区
16 unsigned char Rateflow_buffer[COUNT];//瞬时流量缓冲区
17 unsigned char Veloflow_buffer[COUNT];//瞬时流速缓冲区
18 unsigned char Percentageflow_buffer[COUNT];//流量百分比缓冲区
19 unsigned char Resistanceflow_buffer[COUNT];//流体电阻值缓冲区
20 unsigned char Positive_buffer[COUNT];//正向总量缓冲区
21 unsigned char Opposite_buffer[COUNT];//反向总量缓冲区
22 unsigned char Alarm_buffer[COUNT];//报警状态缓冲区
23 unsigned char Diameter_buffer[COUNT];//管道直径缓冲区
24 unsigned char Set_buffer[COUNT];//参数设置缓冲区
25 unsigned char point; //定义接收数据个数指示变量
26 unsigned char COM_dzdata[2];//定义主机发送地址和命令
27
28
29 //============================================================================
30 //函数功能;延时子程序
31 // ===========================================================================
32 void delay(void)
33 {
34 1 unchar i=124;
35 1 while(i--);
36 1 }
37 //--------------------------------------------------------------------------------------------------
38 // 函数名称: UART_init()串口初始化函数
39 // 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
40 // 串口接收中断允许,发送中断禁止
41 //--------------------------------------------------------------------------------------------------
42 void UART_init(void)
43 {
44 1 //初始化串行口和波特率发生器
45 1 SCON =0x98; //选择串口工作方式2,打开接收允许
46 1 TMOD =0x40; //定时器1工作在方式2
47 1 PCON = 0x80;
48 1 TH1 =0xfa; //实现波特率9600(系统时钟11.0592MHZ)
49 1 TR1 =1; //启动定时器T1
50 1 ET1 =0;
51 1 PS=1; //设计串行口中断优先级
52 1 EA =1; //单片机中断允许
53 1 ES=0; //禁止串行口中断
54 1 }
55 //--------------------------------------------------------------------------------------------------
C51 COMPILER V7.50 D_485 04/27/2009 15:18:14 PAGE 2
56 // 函数名称: com_longerrup()串口接收中断处理函数
57 // 函数功能: 接收包括起始位'S'在内的十位数据到数据缓冲区
58 //--------------------------------------------------------------------------------------------------
59 com_interrupt(void) interrupt 4 using 3
60 {
61 1 unchar RECEIVR_buffer;
62 1 if(RI) //处理接收中断
63 1 {
64 2 RI=0; //清除中断标志位
65 2 RECEIVR_buffer=SBUF; //接收串口数据
66 2 if( point==0) //如果还没有接收到起始位
67 2 { if(point>0&&point<10) //判断是否接收够十位数据
68 3 Receive_buffer[point++]=RECEIVR_buffer;//不够,把接收到的数据放入接收缓存区
69 3 }
70 2 else point=0; //缓冲区已满,清除缓存区内数据重新接收
71 2 }
72 1 if(TI) //处理发送中断
73 1 {TI=0;}
74 1 }
75
76 //--------------------------------------------------------------------------------------------------
77 // 函数名称: CLU_checkdata()计算校验位函数
78 // 输入变量: 无
79 // 输出变量: checkdata,包括起始位在内的前九位数据的校验和
80 // 函数功能: 计算校验和
81 //--------------------------------------------------------------------------------------------------
82 unsigned char CLU_checkdata(void)
83 { //计算校验位
84 1 unchar point,checkdata=0;
85 1 for(point=2;point<7,TI=1;point++)
86 1 {
87 2 checkdata=checkdata^Receive_buffer[point];
88 2 }
89 1 return(checkdata);
90 1 }
91 //====================================================================
92 //函数名称:SurveyData(void)
93 //输入变量:测量数据
94 //输出变量:无
95 //函数功能:存放从机发来的测量数据
96 //====================================================================
97
98 void SurveyData(void)
99 {
100 1 unchar i;
101 1 i=COM_dzdata[1];
102 1 switch(i)
103 1 {
104 2 case 0x00:memcpy(Rateflow_buffer,Receive_buffer,10); break;
105 2 case 0x01:memcpy(Veloflow_buffer,Receive_buffer,10); break;
106 2 case 0x02:memcpy(Percentageflow_buffer,Receive_buffer,10); break;
107 2 case 0x03:memcpy(Resistanceflow_buffer,Receive_buffer,10); break;
108 2 case 0x04:memcpy(Positive_buffer,Receive_buffer,10); break;
109 2 case 0x05:memcpy(Opposite_buffer,Receive_buffer,10); break;
110 2 case 0x06:memcpy(Alarm_buffer,Receive_buffer,10); break;
111 2 case 0x07:memcpy(Diameter_buffer,Receive_buffer,10); break;
112 2
113 2 default:break;}
114 1 }
115
116 //- - - - - - - - - - - - - - ------------------------------------------------------------------ --------
117 //函数名称:发送命令
C51 COMPILER V7.50 D_485 04/27/2009 15:18:14 PAGE 3
118 //函数功能:主机发送通信命令
119 // --------------------------------------------------------------------------------------------------
120 void send_COM (void)
121 {
122 1 unchar i;
123 1 for(i=0;i<2;i++)
124 1 {
125 2 SBUF=COM_dzdata[i];
126 2 _nop_();
127 2 _nop_();
128 2 _nop_();
129 2 _nop_();
130 2 _nop_();
131 2 }
132 1 ES=1; //允许串行口中断
133 1
134 1 }
135 //=====================================================================
136 //函数名称:Converse_data
137 //函数功能:转换数据类型
138 //输入函数:字符型接收到的数据
139 //输出函数:长整形数据
140 //==================================================================
141 void Converse_data(void)
142 { unchar i;
143 1 i=COM_dzdata[1];
144 1 switch(i)
145 1 {
146 2 case 0: Rateflow_buffer[2]=(Rateflow_buffer[2]>>4)*10+(Rateflow_buffer[2]&0x0f);
147 2 Rateflow_buffer[3]=(Rateflow_buffer[3]>>4)*10+(Rateflow_buffer[3]&0x0f);
148 2 Rateflow_buffer[4]=(Rateflow_buffer[4]>>4)*10+(Rateflow_buffer[4]&0x0f);break;
149 2 case 1: Veloflow_buffer[2]=(Veloflow_buffer[2]>>4)*10+(Veloflow_buffer[2]&0x0f);
150 2 Veloflow_buffer[3]=(Veloflow_buffer[3]>>4)*10+(Veloflow_buffer[3]&0x0f);
151 2 Veloflow_buffer[4]=(Veloflow_buffer[4]>>4)*10+(Veloflow_buffer[4]&0x0f);break;
152 2 case 2: Percentageflow_buffer[2]=(Percentageflow_buffer[2]>>4)*10+(Percentageflow_buffer[2]&0x0f);
153 2 Percentageflow_buffer[3]=(Percentageflow_buffer[3]>>4)*10+(Percentageflow_buffer[3]&0x0f);break;
154 2 case 3: Resistanceflow_buffer[2]=(Resistanceflow_buffer[2]>>4)*10+(Resistanceflow_buffer[2]&0x0f);
155 2 Resistanceflow_buffer[3]=(Resistanceflow_buffer[3]>>4)*10+(Resistanceflow_buffer[3]&0x0f);break;
156 2 case 4: Positive_buffer[2]=(Positive_buffer[2]>>4)*10+(Positive_buffer[2]&0x0f);
157 2 Positive_buffer[3]=(Positive_buffer[3]>>4)*10+(Positive_buffer[3]&0x0f);
158 2 Positive_buffer[4]=(Positive_buffer[4]>>4)*10+(Positive_buffer[4]&0x0f);
159 2 Positive_buffer[5]=(Positive_buffer[5]>>4)*10+(Positive_buffer[5]&0x0f);
160 2 Positive_buffer[6]=(Positive_buffer[6]>>4)*10+(Positive_buffer[6]&0x0f);break;
161 2 case 5: Opposite_buffer[2]=(Opposite_buffer[2]>>4)*10+(Opposite_buffer[2]&0x0f);
162 2 Opposite_buffer[3]=(Opposite_buffer[3]>>4)*10+(Opposite_buffer[3]&0x0f);
163 2 Opposite_buffer[4]=(Opposite_buffer[4]>>4)*10+(Opposite_buffer[4]&0x0f);
164 2 Opposite_buffer[5]=(Opposite_buffer[5]>>4)*10+(Opposite_buffer[5]&0x0f);
165 2 Opposite_buffer[6]=(Opposite_buffer[6]>>4)*10+(Opposite_buffer[6]&0x0f);break;
166 2 default:break;}
167 1
168 1 }
169 //--------------------------------------------------------------------------------------------------
170 // 函数名称: 主函数
171 // 函数功能: 调度个子函数,完成通信过程
172 //--------------------------------------------------------------------------------------------------
173 void main(void)
174 {
175 1 unchar checkdata;
176 1 do
177 1 {
178 2 UART_init(); //初始化串口
179 2 send_COM ();
C51 COMPILER V7.50 D_485 04/27/2009 15:18:14 PAGE 4
180 2 if(point==9) //判断数据是否接收完成
181 2 {
182 3 checkdata=CLU_checkdata(); //调用求校验和函数
183 3 if(checkdata==Receive_buffer[8]) //判断校验和是否正确
184 3 {
185 4 point=0;
186 4 SurveyData();
187 4 Converse_data();
188 4 }
189 3 }
190 2 }
191 1 while(1);
192 1 }
193
194
195
196
197
198
199
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 642 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 103 ----
IDATA SIZE = ---- ----
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 + -