?? main.c
字號:
/*********************************************************************
* Copright(c) 2003,廣州周立功單片機發展有限公司
* All rights reserved.
*
*文件名稱: main.c
*文件標識:
*摘 要: 主程序, 串口工作在中斷方式的接收和發送,可通過串口顯示相關信息以及輸入信息
*
*當前版本: V1.0
*完成日期: 2003.2.28
*
*
*********************************************************************/
/**********************************************************************************************/
#include "net_cfg.h"
//#include "global.c" //全局變量以及以太網底層驅動程序
//#include "uart.c" //串口相關的程序
//#include "arp.c" //地址解析程序
//#include "udp.c" //
//#include "icmp.c" //ping操作的程序
//#include "tcp.c" //
//#include "input.c" //串口服務器數據接收程序
//=============================================================================================
sfr ckcon=0x8f;
main()
{
unsigned char i;
ckcon=0x01;
AUXR = 0x00; //使能P89C668的外部數據區
RESET=0;
Delay_MS(60);
RESET=1;
Delay_MS(60);
RESET=0;
/*********************************************************************************
用戶可在下面的程序中修改IP地址,只要輸入您要設定的IP地址和網關地址分別代替下面程序中
字符串的值即可
*********************************************************************************/
My_Ip_Address.dwords = IP_SETTING;//函數的參數就是IP地址,可以直接設定
Gateway_Ip_Address.dwords = GATEWAY_SETTING; //可在此設置合適的網關值
Mask_Ip_Address.dwords=IP_MARK_SETTING; //255.255.255.0,子網掩碼
/********************************************************************************/
initial_system();
Printf_String("\r\n**************WWW.ZLGMCU.COM***************");
Printf_String("\r\n**********歡迎來到周立功單片機世界***************");
Printf_String("\r\n**********這是一個TCP/IP的實驗程序***************");
Printf_String("\r\nLocalHost IP = ");
Printf_IPStr(My_Ip_Address);
Printf_String("\r\nGateWay IP = ");
Printf_IPStr(Gateway_Ip_Address);
Printf_String("\r\nSubNet Mask= ");
Printf_IPStr(Mask_Ip_Address);
Printf_String("\r\n");
while(1)
{
//超時處理把Tcp_Timeout清零Tcp_Timeout每10ms由定時器置位
if(Tcp_Timeout)Process_Tcp_Timeout();//處理TCP超時,Tcp_Timeout標志在中斷中置位
//Process_Tcp_Timeout()每10ms處理一次
if(BiSecond)
{ //兩秒處理一次
BiSecond=0;
if(TCP1024.State==0) //本地機處于監聽狀態
process_command(); //處理串口輸入,可引發本地發起通訊
Process_Ping();
Process_Udp_Command(); //
Gateway_Arp_Request(); //對網關的IP進行解析
}
for(i=0;i<5;i++)
{//檢查是否有新的數據包收到,如果有將置位have_new_packet,并將數據包接收進由RxdNetBuff指向的緩沖區
if(Rec_NewPacket())
{
if(RxdNetBuff.EtherFrame.NextProtocal==0x0806) //表示收到一個arp請求包
{
if(RxdNetBuff.ArpFrame.Operation==0x0001) //表示收到的數據包是一個ARP請求報文
{
Arp_Answer();
} //對ARP請求報文進行回答
else if( RxdNetBuff.ArpFrame.Operation==0x0002) //表示收到的數據包是一個ARP回答報文
{
Arp_Process();
}//對ARP回答報文進行處理
}
else if(RxdNetBuff.EtherFrame.NextProtocal==0x0800) //表示收到的數據包是一個IP數據報
if((RxdNetBuff.IpFrame.VerandIphLen&0xf0)==0x40) //表示收到的IP數據報是IPv4版本
if(VerifyIpHeadCrc()) //IP首部校驗和正確
{ //這時表示正確地接收到一個ip包,下面按照IP的下層協議類型進行相應處理
switch(RxdNetBuff.IpFrame.NextProtocal)
{
case 1: //表示收到的IP數據報為ICMP查詢報文(本程序僅對PING操作進行處理)
if(RxdNetBuff.IcmpFrame.type==8) //表示收到的ICMP報文是一個ping的請求包
{
Ping_Answer();
} //PING回答
else if(RxdNetBuff.IcmpFrame.type==0) //表示收到的ICMP報文是一個ping的應答包
{
Ping_Echo();
} //PING操作的信息在本地回顯,本程序通過串口實現
break;
case 6: //IPFrame的下層協議字段為6表示下層協議為TCP,表示收到TCP報文
Process_Tcp();
break;
case 0x11: //IPFrame的下層協議字段為17表示下層協議UDP,表示收到UDP報文
Process_Udp();
break;
default:;
}
}
}
}
}
}
/**********************************************************************
**函數原型: void timer0() interrupt 1
**入口參數: 無
**出口參數: 無
**返 回 值: 無
**說 明: 中斷函數,10ms中斷一次,進行ARP老化處理,設置TCP超時
************************************************************************/
void timer0() interrupt 1
{
//工作在16位定時模式,中斷時間為10毫秒中斷一次,誤差小于千分之1,晶振使用22.1184Mhz
tl0=9;
th0=184;
Msec++;
Tcp_Timeout=1; //置位TCP超時標志
if(Msec==100){ //100分頻,就是1秒一次
Msec=0;
Sec++;
BiSecond=1; //置位兩秒標志
if(Sec==60){Sec=0; //每分鐘一次
Min++;
if(Min==60)Min=0;
//網關和PING操作對象主機的以太網地址生存時間每秒減一,實際上是ARP老化操作簡單處理
if(Gateway_IP_TTL>0)Gateway_IP_TTL=Gateway_IP_TTL-1;
if(Ping_IP_TTL>0)Ping_IP_TTL=Ping_IP_TTL-1;
}
}
}
/**********************************************************************
**函數原型: void serial(void) interrupt 4
**入口參數: 無
**出口參數: 無
**返 回 值: 無
**說 明: 串口中斷函數:中斷函數在接收中斷處理中將接收數據放到接收緩沖區
** : 接收緩沖區ComRxdBuf大小可根據需要進行調整,由兩個指針管理
ComRxdWrite和ComRxdRead進行管理;在發送中斷處理中將數據由發送
緩沖區輸出到串口,輸出緩沖區由指針ComTxdRead和ComTxdWrite管理.
在global.c定義了一組對緩沖區進行操作的程序.
************************************************************************/
void serial(void) interrupt 4
{ unsigned char temp;
if(ti) { //串口發送中斷處理
ti=0;
if(ComTxdRead!=ComTxdWrite)//發緩區有數據,繼續發送數據
{sbuf=ComTxdBuf[ComTxdRead];
ComTxdRead++;
if(ComTxdRead==COM_TXD_BUFF_SIZE)
ComTxdRead=0;
ComTxdBufempty=0;
}
else
{ComTxdBufempty=1;}
}
if (ri){ //串口接收中斷處理
ri=0;
temp=sbuf;
ComRxdBuf[ComRxdWrite]=temp;
if(!TcpConnected)
{ Printf_Char(temp);}
ComRxdWrite++;
if(ComRxdWrite==COM_TXD_BUFF_SIZE)
ComRxdWrite=0;
if(temp==0x0d)
{if(!TcpConnected)
{Printf_Char(0x0a);}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -