📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 05/27/2008 11:02:09 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN .\RUN\main.obj
COMPILER INVOKED BY: D:\Keil7_06\C51\BIN\C51.EXE main.c OBJECT(.\RUN\main.obj)
stmt level source
1 /*********************************************************************
2 * Copright(c) 2004,张会福 湖南科技大学计算机学院
3 * All rights reserved.
4 *
5 *文件名称: main.c
6 *文件标识:
7 *摘 要: 主程序, 串口工作在中断方式的接收和发送,可通过串口显示相关信息以及输入信息
8 *
9 *当前版本: V1.0
10 *完成日期: 2004.4.1
11 *
12 *
13 *********************************************************************/
14
15 /**********************************************************************************************/
16
17 #include "net_cfg.h"
18 //#include "global.c" //全局变量以及以太网底层驱动程序
19 //#include "uart.c" //串口相关的程序
20 //#include "arp.c" //地址解析程序
21 //#include "udp.c" //
22 //#include "icmp.c" //ping操作的程序
23 //#include "tcp.c" //
24 //#include "input.c" //串口服务器数据接收程序
25 //=============================================================================================
26
27 sfr ckcon=0x8f;
28
29
30 main()
31 {
32 1 unsigned char i;
33 1 ckcon=0x01;
34 1 AUXR = 0x00; //使能P89C668的外部数据区
35 1 RESET=0;
36 1 Delay_MS(60);
37 1 RESET=1;
38 1 Delay_MS(60);
39 1 RESET=0;
40 1 /*********************************************************************************
41 1 用户可在下面的程序中修改IP地址,只要输入您要设定的IP地址和网关地址分别代替下面程序中
42 1 字符串的值即可
43 1 *********************************************************************************/
44 1 My_Ip_Address.dwords = IP_SETTING;//函数的参数就是IP地址,可以直接设定
45 1 Gateway_Ip_Address.dwords = GATEWAY_SETTING; //可在此设置合适的网关值
46 1 Mask_Ip_Address.dwords=IP_MARK_SETTING; //255.255.255.0,子网掩码
47 1
48 1 /********************************************************************************/
49 1
50 1 initial_system();
51 1
52 1 Printf_String("\r\n**********欢迎来到单片网络验世界***************");
53 1 Printf_String("\r\n当前的 IP = ");
54 1 Printf_IPStr(My_Ip_Address);
55 1 Printf_String("\r\n网关的 IP = ");
C51 COMPILER V7.06 MAIN 05/27/2008 11:02:09 PAGE 2
56 1 Printf_IPStr(Gateway_Ip_Address);
57 1 Printf_String("\r\n子网掩码 Mask= ");
58 1 Printf_IPStr(Mask_Ip_Address);
59 1 Printf_String("\r\n");
60 1
61 1 while(1)
62 1 {
63 2 //超时处理把Tcp_Timeout清零Tcp_Timeout每10ms由定时器置位
64 2 if(Tcp_Timeout)Process_Tcp_Timeout();//处理TCP超时,Tcp_Timeout标志在中断中置位
65 2 //Process_Tcp_Timeout()每10ms处理一次
66 2 if(BiSecond)
67 2 { //两秒处理一次
68 3 BiSecond=0;
69 3 if(TCP1024.State==0) //本地机处于监听状态
70 3 process_command(); //处理串口输入,可引发本地发起通讯
71 3 Process_Ping();
72 3 Process_Udp_Command(); //
73 3 Gateway_Arp_Request(); //对网关的IP进行解析
74 3 }
75 2
76 2 for(i=0;i<5;i++)
77 2 {//检查是否有新的数据包收到,如果有将置位have_new_packet,并将数据包接收进由RxdNetBuff指向的缓冲区
78 3 if(Rec_NewPacket())
79 3 {
80 4 if(RxdNetBuff.EtherFrame.NextProtocal==0x0806) //表示收到一个arp请求包
81 4 {
82 5 if(RxdNetBuff.ArpFrame.Operation==0x0001) //表示收到的数据包是一个ARP请求报文
83 5 {
84 6 Arp_Answer();
85 6 } //对ARP请求报文进行回答
86 5 else if( RxdNetBuff.ArpFrame.Operation==0x0002) //表示收到的数据包是一个ARP回答报文
87 5 {
88 6 Arp_Process();
89 6 }//对ARP回答报文进行处理
90 5 }
91 4 else if(RxdNetBuff.EtherFrame.NextProtocal==0x0800) //表示收到的数据包是一个IP数据报
92 4 if((RxdNetBuff.IpFrame.VerandIphLen&0xf0)==0x40) //表示收到的IP数据报是IPv4版本
93 4 if(VerifyIpHeadCrc()) //IP首部校验和正确
94 4 { //这时表示正确地接收到一个ip包,下面按照IP的下层协议类型进行相应处理
95 5 switch(RxdNetBuff.IpFrame.NextProtocal)
96 5 {
97 6 case 1: //表示收到的IP数据报为ICMP查询报文(本程序仅对PING操作进行处理)
98 6 if(RxdNetBuff.IcmpFrame.type==8) //表示收到的ICMP报文是一个ping的请求包
99 6 {
100 7 Ping_Answer();
101 7 } //PING回答
102 6 else if(RxdNetBuff.IcmpFrame.type==0) //表示收到的ICMP报文是一个ping的应答包
103 6 {
104 7 Ping_Echo();
105 7 } //PING操作的信息在本地回显,本程序通过串口实现
106 6 break;
107 6 case 6: //IPFrame的下层协议字段为6表示下层协议为TCP,表示收到TCP报文
108 6 Process_Tcp();
109 6 break;
110 6 case 0x11: //IPFrame的下层协议字段为17表示下层协议UDP,表示收到UDP报文
111 6 Process_Udp();
112 6 break;
113 6 default:;
114 6 }
115 5 }
116 4 }
117 3 }
C51 COMPILER V7.06 MAIN 05/27/2008 11:02:09 PAGE 3
118 2 }
119 1 }
120
121 /**********************************************************************
122 **函数原型: void timer0() interrupt 1
123 **入口参数: 无
124 **出口参数: 无
125 **返 回 值: 无
126 **说 明: 中断函数,10ms中断一次,进行ARP老化处理,设置TCP超时
127 ************************************************************************/
128 void timer0() interrupt 1
129 {
130 1 //工作在16位定时模式,中断时间为10毫秒中断一次,误差小于千分之1,晶振使用22.1184Mhz
131 1 tl0=9;
132 1 th0=184;
133 1 Msec++;
134 1 Tcp_Timeout=1; //置位TCP超时标志
135 1 if(Msec==100)
136 1 { //100分频,就是1秒一次
137 2 Msec=0;
138 2 Sec++;
139 2 BiSecond=1; //置位两秒标志
140 2 if(Sec==60)
141 2 {
142 3 Sec=0; //每分钟一次
143 3 Min++;
144 3 if(Min==60)Min=0;
145 3 //网关和PING操作对象主机的以太网地址生存时间每秒减一,实际上是ARP老化操作简单处理
146 3 if(Gateway_IP_TTL>0)Gateway_IP_TTL=Gateway_IP_TTL-1;
147 3 if(Ping_IP_TTL>0)Ping_IP_TTL=Ping_IP_TTL-1;
148 3 }
149 2
150 2 }
151 1 }
152
153 /**********************************************************************
154 **函数原型: void serial(void) interrupt 4
155 **入口参数: 无
156 **出口参数: 无
157 **返 回 值: 无
158 **说 明: 串口中断函数:中断函数在接收中断处理中将接收数据放到接收缓冲区
159 ** : 接收缓冲区ComRxdBuf大小可根据需要进行调整,由两个指针管理
160 ComRxdWrite和ComRxdRead进行管理;在发送中断处理中将数据由发送
161 缓冲区输出到串口,输出缓冲区由指针ComTxdRead和ComTxdWrite管理.
162 在global.c定义了一组对缓冲区进行操作的程序.
163 ************************************************************************/
164 void serial(void) interrupt 4
165 {
166 1 unsigned char temp;
167 1 if(ti)
168 1 { //串口发送中断处理
169 2 ti=0;
170 2 if(ComTxdRead!=ComTxdWrite)//发缓区有数据,继续发送数据
171 2 {
172 3 sbuf=ComTxdBuf[ComTxdRead];
173 3 ComTxdRead++;
174 3 if(ComTxdRead==COM_TXD_BUFF_SIZE)
175 3 ComTxdRead=0;
176 3 ComTxdBufempty=0;
177 3 }
178 2 else
179 2 {
C51 COMPILER V7.06 MAIN 05/27/2008 11:02:09 PAGE 4
180 3 ComTxdBufempty=1;
181 3 }
182 2 }
183 1 if (ri)
184 1 { //串口接收中断处理
185 2 ri=0;
186 2 temp=sbuf;
187 2 ComRxdBuf[ComRxdWrite]=temp;
188 2 if(!TcpConnected)
189 2 {
190 3 Printf_Char(temp);
191 3 }
192 2 ComRxdWrite++;
193 2 if(ComRxdWrite==COM_TXD_BUFF_SIZE)
194 2 ComRxdWrite=0;
195 2 if(temp==0x0d)
196 2 {
197 3 if(!TcpConnected)
198 3 {
199 4 Printf_Char(0x0a);
200 4 }
201 3 }
202 2 }
203 1 }
204
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 603 ----
CONSTANT SIZE = 126 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
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 + -