📄 rs485_com.lst
字号:
C51 COMPILER V7.06 RS485_COM 12/15/2007 21:20:16 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE RS485_COM
OBJECT MODULE PLACED IN C:\VW\CANV2\BASIC_~1\RS485\RS485_COM.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE C:\VW\CANV2\BASIC_~1\RS485\RS485_COM.C DB SB OE
stmt level source
1
2 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3 //描述:
4 // 该程序INT0按键程序+显示程序+RS485通讯 &
5 // 每按一次,数码管1-2(自右向左)显示加1,并且发送数据到485节点2; &
6 // 接收到485节点2的数据在数码管3-4(自右向左) &
7 // 485总线是半双工的 &
8 // 通讯波特率:19200 &
9 // 每次收发一个字节 &
10
11 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
12 //【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! &
13 //【声明】 作者: PIAE小组 &
14
15 #include <reg52.h>
16 #include <intrins.h>
17 #include <RS485_def.h>
18
19 void INT0_Counter( void ) interrupt 0 using 1
20 {//INT0按键为计数按键
21 1 EA = 0;
22 1 TX_data++; //按键计数单元加1,将给数据发送
23 1 TXD_flag = 1;
24 1 EA = 1;
25 1 }
26
27
28 void RS485_RXD( void ) interrupt 4 using 1
29 {//接收数据函数,在中断服务程序中调用
30 1 uchar temp;
31 1 EA = 0;//关闭所有中断
32 1 ES = 0;//关闭串口
33 1 if(RI==1)
34 1 {//在调试中发送,会收到一个多于的数据0,这可能是MAX483的性能决定的,
35 2 //所以采取了滤波的方法
36 2 RI = 0;
37 2 temp = SBUF;
38 2 if( temp == 0)
39 2 {
40 3 if(RX_data == 0)
41 3 {
42 4 RX_data = 0;
43 4 }
44 3 }
45 2 else
46 2 {
47 3 RX_data = temp;
48 3 }
49 2
50 2 RXD_flag = 1;//置接收到数据标志
51 2 }
52 1 _nop_();
53 1 ES = 1;//打开串口
54 1 EA = 1;//打开中断
55 1 }
C51 COMPILER V7.06 RS485_COM 12/15/2007 21:20:16 PAGE 2
56
57 void main(void)
58 {
59 1 CPU_init();
60 1 _nop_();
61 1 while(1)
62 1 {
63 2 NOPS;
64 2 /////////////////////// 接收处理程序/////////////////////////////////
65 2 if( RXD_flag )
66 2 {
67 3 EA = 0;//关闭CPU中断
68 3 LED_RED = !LED_RED;//指示灯状态变化
69 3 RXD_flag = 0;//清楚标志
70 3 RX_data = RX_data;//接收对方发送的数据
71 3 if(RX_data>99)
72 3 {
73 4 RX_data = 0;
74 4 }
75 3 EA = 1;
76 3 }
77 2 ///////////////////////发送处理程序/////////////////////////////////
78 2 if( TXD_flag )
79 2 {
80 3 EA = 0;
81 3 LED_GRE = !LED_GRE;//指示灯状态变化
82 3 TXD_flag = 0;
83 3 TX_data = TX_data;//
84 3 if(TX_data>99)
85 3 {
86 4 TX_data = 0;
87 4 }
88 3 RS485_wren = 1;//变为发送状态
89 3 RS485_TXD();
90 3 _nop_();
91 3 RS485_wren = 0;//返回到接收状态
92 3 _nop_();
93 3 _nop_();
94 3 EA = 1;
95 3 }
96 2 ///////////////////////数码管显示程序/////////////////////////////////
97 2 led_seg7(1,TX_data);
98 2 led_seg7(3,RX_data);
99 2
100 2 ///////////////////////数码管显示程序/////////////////////////////////
101 2 }//while 结束
102 1 }//main结束
103
104
105 void Delay(uchar delay_time)
106 {//延时程序
107 1 while(delay_time--)
108 1 {}
109 1 }
110
111
112 void CPU_init(void)
113 {//初始化CPU
114 1 RS485_wren = 0;//RS485初始化为接收模式
115 1 SCON = 0x50; //串口方式1
116 1 PCON = 0x80; //串口波特率加速
117 1 TMOD = 0x21;
C51 COMPILER V7.06 RS485_COM 12/15/2007 21:20:16 PAGE 3
118 1 TH1=0xFD; //19200bps
119 1 TL1=0xFD;
120 1 TR1 = 1;
121 1 TI = 0;
122 1 RI = 0;
123 1 PS = 1; //串口中断的优先级设为最高
124 1
125 1 IT0 = 1;//外部中断0负边沿触发
126 1 EX0 = 1;//打开外部中断0
127 1 ES = 1;//打开串口中断
128 1 EA = 1; //打开总中断
129 1 SJA1000_CS = 1;//片选无效
130 1 }
131
132 void RS485_TXD( void )
133 {
134 1 uchar k = 200;
135 1 TI = 1;
136 1 while(TI)
137 1 {
138 2 RS485_wren = 1;//RS485处于发送状态
139 2 TI = 0;//一字节发送完后清除标志位
140 2 SBUF = TX_data;
141 2 while(!TI)
142 2 {}//等待发送
143 2 TI = 0;
144 2 }
145 1 _nop_();
146 1
147 1 while( k-- )
148 1 {//这段代码时候了延时,确保485线上数据发送完毕
149 2 led_seg7(1,TX_data);
150 2 led_seg7(3,RX_data);
151 2 }
152 1 }
153
154 void led_seg7(uchar from,uchar number)
155 {//from(1_4):数码管显示起始位置(从右到左),number:显示的数
156 1 uchar digit,temp_l;
157 1 uchar temp_h=0x7f;
158 1 temp_h = _cror_(temp_h,from-1); //确定从哪一位开始显示,即确定高四位
159 1 temp_h = temp_h & 0xf0; //取高四位
160 1 temp_l = P2 & 0x0f; //取P2的低四位
161 1 P2 = temp_h | temp_l; //设定P2口
162 1
163 1 if(number==0)
164 1 {
165 2 P0 = led[0];
166 2 Delay(5);
167 2 P0 = 0xff;
168 2 }
169 1 else
170 1 {
171 2 while(number)
172 2 {
173 3 digit = number%10 ;
174 3 number /= 10;
175 3 P0 = led[digit] ;
176 3 Delay(5);
177 3 temp_h = P2 & 0xf0; //取P2的高四位
178 3 temp_h = temp_h | 0x0f; //拼装 temp_h,进行位选
179 3 temp_h = _cror_(temp_h,1);
C51 COMPILER V7.06 RS485_COM 12/15/2007 21:20:16 PAGE 4
180 3 temp_h = temp_h & 0xf0; //取高四位
181 3 temp_l = P2 & 0x0f; //取P2的低四位
182 3 P0 = 0xff;
183 3 P2 = temp_h | temp_l; //设定P2口
184 3 }//while结束
185 2 }//else结束
186 1
187 1 }
C51 COMPILER V7.06 RS485_COM 12/15/2007 21:20:16 PAGE 5
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
CPU_init . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
P0 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0080H 1
P1 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0090H 1
P2 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00A0H 1
P3 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00B0H 1
EA . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00AFH 1
IE . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00A8H 1
LED_RED. . . . . . . . . . . . . . . . ABSBIT ----- BIT 00A1H 1
LED_GRE. . . . . . . . . . . . . . . . ABSBIT ----- BIT 00A2H 1
RS485_RXD. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
temp . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 000FH 1
SJA1000_CS . . . . . . . . . . . . . . ABSBIT ----- BIT 00A0H 1
ES . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00ACH 1
RS485_TXD. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
k. . . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0000H 1
IP . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00B8H 1
RI . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0098H 1
TI . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0099H 1
PS . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00BCH 1
main . . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
RX_data. . . . . . . . . . . . . . . . PUBLIC DATA U_CHAR 0000H 1
TX_data. . . . . . . . . . . . . . . . PUBLIC DATA U_CHAR 0001H 1
SBUF . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0099H 1
PCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0087H 1
SCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0098H 1
TMOD . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0089H 1
TCON . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0088H 1
led. . . . . . . . . . . . . . . . . . PUBLIC CODE ARRAY 0000H 11
EX0. . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00A8H 1
IT0. . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0088H 1
TH1. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 008DH 1
_Delay . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0008H -----
delay_time . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
TL1. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 008BH 1
TR1. . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 008EH 1
INT0_Counter . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
RS485_wren . . . . . . . . . . . . . . ABSBIT ----- BIT 00A3H 1
T2CON. . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00C8H 1
RXD_flag . . . . . . . . . . . . . . . PUBLIC DATA BIT 0000H 1
TXD_flag . . . . . . . . . . . . . . . PUBLIC DATA BIT 0001H 1
_led_seg7. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
from . . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
number . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0005H 1
digit. . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0004H 1
temp_l . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0007H 1
temp_h . . . . . . . . . . . . . . . * REG * DATA U_CHAR 0006H 1
PSW. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00D0H 1
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 324 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 1
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILER V7.06 RS485_COM 12/15/2007 21:20:16 PAGE 6
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -