?? main.lst
字號:
C51 COMPILER V7.06 MAIN 12/07/2004 08:46:36 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c DEBUG OBJECTEXTEND
stmt level source
1 /*********************************************************************
2 *文件名稱: main.c
3 *文件標識:
4 *摘 要: 主程序, 串口工作在中斷方式的接收和發送,可通過串口顯示相關信息以及輸入信息
5 *
6 *********************************************************************/
7
8 /**********************************************************************************************/
9
10 #include "net_cfg.h"
11 //#include "global.c" //全局變量以及以太網底層驅動程序
12 //#include "uart.c" //串口相關的程序
13 //#include "arp.c" //地址解析程序
14 //#include "udp.c" //
15 //#include "icmp.c" //ping操作的程序
16 //#include "tcp.c" //
17 //#include "input.c" //串口服務器數據接收程序
18 //=============================================================================================
19
20 sfr ckcon=0x8f;
21
22
23 main()
24 {
25 1 unsigned char i;
26 1 ckcon=0x01;
27 1 AUXR = 0x00;
28 1 RESET=0;
29 1 Delay_MS(60);
30 1 RESET=1;
31 1 Delay_MS(60);
32 1 RESET=0;
33 1 /*********************************************************************************
34 1 用戶可在下面的程序中修改IP地址,只要輸入您要設定的IP地址和網關地址分別代替下面程序中
35 1 字符串的值即可
36 1 *********************************************************************************/
37 1 My_Ip_Address.dwords = IP_SETTING;//函數的參數就是IP地址,可以直接設定
38 1 Gateway_Ip_Address.dwords = GATEWAY_SETTING; //可在此設置合適的網關值
39 1 Mask_Ip_Address.dwords=IP_MARK_SETTING; //255.255.255.0,子網掩碼
40 1
41 1 /********************************************************************************/
42 1
43 1 initial_system();
44 1
45 1 Printf_String("\r\n**************WWW.Teamkit.COM***************");
46 1 Printf_String("\r\n**************歡迎使用本實驗系統*****(**********");
47 1 Printf_String("\r\n**********這是一個TCP/IP的實驗程序***************");
48 1 Printf_String("\r\nLocalHost IP = ");
49 1 Printf_IPStr(My_Ip_Address);
50 1 Printf_String("\r\nGateWay IP = ");
51 1 Printf_IPStr(Gateway_Ip_Address);
52 1 Printf_String("\r\nSubNet Mask= ");
53 1 Printf_IPStr(Mask_Ip_Address);
54 1 Printf_String("\r\n");
55 1
C51 COMPILER V7.06 MAIN 12/07/2004 08:46:36 PAGE 2
56 1 while(1)
57 1 {
58 2 //超時處理把Tcp_Timeout清零Tcp_Timeout每10ms由定時器置位
59 2 if(Tcp_Timeout)Process_Tcp_Timeout();//處理TCP超時,Tcp_Timeout標志在中斷中置位
60 2 //Process_Tcp_Timeout()每10ms處理一次
61 2 if(BiSecond)
62 2 { //兩秒處理一次
63 3 BiSecond=0;
64 3 if(TCP1024.State==0) //本地機處于監聽狀態
65 3 process_command(); //處理串口輸入,可引發本地發起通訊
66 3 Process_Ping();
67 3 Process_Udp_Command(); //
68 3 Gateway_Arp_Request(); //對網關的IP進行解析
69 3 }
70 2
71 2 for(i=0;i<5;i++)
72 2 {//檢查是否有新的數據包收到,如果有將置位have_new_packet,并將數據包接收進由RxdNetBuff指向的緩沖區
73 3 if(Rec_NewPacket())
74 3 {
75 4 if(RxdNetBuff.EtherFrame.NextProtocal==0x0806) //表示收到一個arp請求包
76 4 {
77 5 if(RxdNetBuff.ArpFrame.Operation==0x0001) //表示收到的數據包是一個ARP請求報文
78 5 {
79 6 Arp_Answer();
80 6 } //對ARP請求報文進行回答
81 5 else if( RxdNetBuff.ArpFrame.Operation==0x0002) //表示收到的數據包是一個ARP回答報文
82 5 {
83 6 Arp_Process();
84 6 }//對ARP回答報文進行處理
85 5 }
86 4 else if(RxdNetBuff.EtherFrame.NextProtocal==0x0800) //表示收到的數據包是一個IP數據報
87 4 if((RxdNetBuff.IpFrame.VerandIphLen&0xf0)==0x40) //表示收到的IP數據報是IPv4版本
88 4 if(VerifyIpHeadCrc()) //IP首部校驗和正確
89 4 { //這時表示正確地接收到一個ip包,下面按照IP的下層協議類型進行相應處理
90 5 switch(RxdNetBuff.IpFrame.NextProtocal)
91 5 {
92 6 case 1: //表示收到的IP數據報為ICMP查詢報文(本程序僅對PING操作進行處理)
93 6 if(RxdNetBuff.IcmpFrame.type==8) //表示收到的ICMP報文是一個ping的請求包
94 6 {
95 7 Ping_Answer();
96 7 } //PING回答
97 6 else if(RxdNetBuff.IcmpFrame.type==0) //表示收到的ICMP報文是一個ping的應答包
98 6 {
99 7 Ping_Echo();
100 7 } //PING操作的信息在本地回顯,本程序通過串口實現
101 6 break;
102 6 case 6: //IPFrame的下層協議字段為6表示下層協議為TCP,表示收到TCP報文
103 6 Process_Tcp();
104 6 break;
105 6 case 0x11: //IPFrame的下層協議字段為17表示下層協議UDP,表示收到UDP報文
106 6 Process_Udp();
107 6 break;
108 6 default:;
109 6 }
110 5 }
111 4 }
112 3 }
113 2 }
114 1 }
115
116 /**********************************************************************
117 **函數原型: void timer0() interrupt 1
C51 COMPILER V7.06 MAIN 12/07/2004 08:46:36 PAGE 3
118 **入口參數: 無
119 **出口參數: 無
120 **返 回 值: 無
121 **說 明: 中斷函數,10ms中斷一次,進行ARP老化處理,設置TCP超時
122 ************************************************************************/
123 void timer0() interrupt 1
124 {
125 1 //工作在16位定時模式,中斷時間為10毫秒中斷一次,誤差小于千分之1,晶振使用22.1184Mhz
126 1 tl0=9;
127 1 th0=184;
128 1 Msec++;
129 1 Tcp_Timeout=1; //置位TCP超時標志
130 1 if(Msec==100){ //100分頻,就是1秒一次
131 2 Msec=0;
132 2 Sec++;
133 2 BiSecond=1; //置位兩秒標志
134 2 if(Sec==60){Sec=0; //每分鐘一次
135 3 Min++;
136 3 if(Min==60)Min=0;
137 3 //網關和PING操作對象主機的以太網地址生存時間每秒減一,實際上是ARP老化操作簡單處理
138 3 if(Gateway_IP_TTL>0)Gateway_IP_TTL=Gateway_IP_TTL-1;
139 3 if(Ping_IP_TTL>0)Ping_IP_TTL=Ping_IP_TTL-1;
140 3 }
141 2
142 2 }
143 1
144 1 }
145
146 /**********************************************************************
147 **函數原型: void serial(void) interrupt 4
148 **入口參數: 無
149 **出口參數: 無
150 **返 回 值: 無
151 **說 明: 串口中斷函數:中斷函數在接收中斷處理中將接收數據放到接收緩沖區
152 ** : 接收緩沖區ComRxdBuf大小可根據需要進行調整,由兩個指針管理
153 ComRxdWrite和ComRxdRead進行管理;在發送中斷處理中將數據由發送
154 緩沖區輸出到串口,輸出緩沖區由指針ComTxdRead和ComTxdWrite管理.
155 在global.c定義了一組對緩沖區進行操作的程序.
156 ************************************************************************/
157 void serial(void) interrupt 4
158 { unsigned char temp;
159 1 if(ti) { //串口發送中斷處理
160 2 ti=0;
161 2 if(ComTxdRead!=ComTxdWrite)//發緩區有數據,繼續發送數據
162 2 {sbuf=ComTxdBuf[ComTxdRead];
163 3 ComTxdRead++;
164 3 if(ComTxdRead==COM_TXD_BUFF_SIZE)
165 3 ComTxdRead=0;
166 3 ComTxdBufempty=0;
167 3 }
168 2 else
169 2 {ComTxdBufempty=1;}
170 2 }
171 1 if (ri){ //串口接收中斷處理
172 2 ri=0;
173 2 temp=sbuf;
174 2 ComRxdBuf[ComRxdWrite]=temp;
175 2 if(!TcpConnected)
176 2 { Printf_Char(temp);}
177 2 ComRxdWrite++;
178 2 if(ComRxdWrite==COM_TXD_BUFF_SIZE)
179 2 ComRxdWrite=0;
C51 COMPILER V7.06 MAIN 12/07/2004 08:46:36 PAGE 4
180 2 if(temp==0x0d)
181 2 {if(!TcpConnected)
182 3 {Printf_Char(0x0a);}
183 3 }
184 2
185 2 }
186 1 }
187
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 621 ----
CONSTANT SIZE = 228 ----
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 + -