亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? main.c

?? 單片機tcpip_c51源程序.rar
?? C
字號:
// 本程序的晶體為 22.1184mHz
// 本程序的缺省IP    192.168.0.7
// 本程序的缺省mask  255.255.255.0
// 本程序的缺省mac	 0x1234567890ab
// 本程序的缺省gate  0.0.0.0(無網關)
// 本程序的缺省端口號port  9000
// 本程序的缺省remote_ip  192.168.0.1

//#include <reg52.h>
#include <absacc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <intrins.h>
#include "24c02.h"
#include "ethernet.h"
#include "ip.h"
#include "udp.h"


//波特率 是在smod=1 的情況下計算的
#define FALSE       0
#define TRUE        1
#define false       0
#define true        1

#define BPS600      0x40
#define BPS1200	    0xA0	
#define BPS2400	    0xD0	
#define BPS4800	    0xE8
#define BPS9600	    0xF4
#define BPS14400	0xF8
#define BPS19200	0xFA
#define BPS28800	0xFC
#define BPS38400	0xFD

#define timer_5ms_value  0xDC00
#define timer_10ms_value 0xB800
#define timer_20ms_value 0x7000

#define rom_ip			0x00
#define rom_mask		0x04
#define rom_gate		0x08
#define rom_remote_ip	0x0c
#define rom_mac			0x10
#define rom_port        0x16

#define ARP_TX      1               /* Client state: sending ARP */
#define ARP_RX      2               /*               received ARP */
#define CLIENT_DONE 3               /*               completed */

#define HIGH(x) (x &0xff00)>>8
#define LOW(x) (x &0xff)
sbit watch_dog=0xb5;
#define BCASTADDR     0xff,0xff,0xff,0xff,0xff,0xff     // broadcast address
BYTE bcast[MACLEN]={BCASTADDR}; 	//  該變量為源廣播地址mac
BYTE code default_mac[MACLEN]={0x12,0x34,0x56,0x78,0x90,0xab};  
bit  uart_receive_enable;          	// 串口接收允許標志
bit  uart_receiving;				// 串口正在接收標志
bit  uart_received_finished;		// 串口接收完成標志
bit  uart_trans_willing;				// 串口將要發送標志
bit  uart_trans_finished;			// 串口發送完成標志,表示串口處于發送空閑狀態

unsigned char uart_receive_buf[250];	// 接收緩沖區
unsigned char uart_trans_buf[250];		// 發送緩沖區
unsigned char uart_trans_count;			// 發送數據計數器
unsigned char uart_receive_count;		// 接收的數據計數器
unsigned char uart_trans_length;		// 將要發送的數據長度

unsigned char uart_char_space;		// 串口幀內間隔計數器(10ms) 最大為60ms
unsigned char  uart_frame_space;	// 串口幀間間隔計數器(10ms) 最小為80ms
unsigned char  data dog;					// 看門狗計數器(10ms)  最大為120 ms
#define clear_watchdog() watch_dog=1; _nop_();_nop_();_nop_();_nop_();dog=0;watch_dog=0  
bit being_echo;				        // 網絡要求遠端返回數據標志,表示要判斷網絡超時
bit remote_echo;
bit first_arp; 
unsigned int   net_overtime_count;  // 網絡發送超時計數器

ETHERFRAME etherframe;
NODE  locnode;                      /* My Ethernet and IP addresses */
NODE  remnode;                       /* Remote node */

extern BYTE mymac[MACLEN];			//  該變量為ethernet.c 用源地址mac
void system_init(void);
void flush_gate_mac();
void do_uart_process(void);
int do_net_process(ETHERFRAME *efp,int rxlen);
int udp_receive(ETHERFRAME *efp, int len);
void send_ip(void);
unsigned long runtime;
void system_init(void)
{
	EA=0;			
	SCON=0xD2;					// SM0,SM1,SM2,REN,TB,RB,TI,RI 
								// 9位數據位,一位停止位,允許串行中斷 
 	PCON=0x80;	            	// SMOD=1, 波特率加倍
	TMOD=0x21;              	// GATE  C/T M1 M0 GATE C/T M1 M0 
	                        	// 定時器1在自動裝入方式,0 位16位方式
	TCON=0x50;              	// TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
						// 定時器運行狀態,不允許外部中斷
	TH1=BPS4800;
	TL1=BPS4800;
	TH0=HIGH(timer_10ms_value);					//16位10ms 定時器
	TL0=LOW(timer_10ms_value);
	IE=0x92;		        	// EA ?  ? ES ET1 EX1 ET0 EX0	
	IP=0x02;
	clear_watchdog();
}


void main(void)
{
	int rxlen;
 	int ret;
	unsigned char temp[6];
	clear_watchdog();
	delay_ms(2);
	system_init();          		//設置單片機的定時器 T0 (10ms),及 串口的波特率4800bps
	uart_receiving=FALSE;			// 串口正在接收標志 為 false
	uart_receive_enable=TRUE;		// 串口接收允許為   TRUE
	uart_received_finished=FALSE;	// 串口接收完成標志 為 false
	uart_trans_count=0;				// 串口發送完成字節數
	uart_trans_willing=0;			// 串口將要發送請求標志
    uart_trans_finished=TRUE;		// 串口發送完成,處于發送空閑狀態
    uart_char_space=0;
	uart_frame_space=0;
	// 因為8051 單片機的Keil C編譯器編譯結果整數高位字節在前 
	// 在讀取24c02 中的數據時,讀一個整數為順序讀取其中連續的2個字節
	//       				   讀一個長整數為順序讀取其中連續的4個字節		
	read24c02(temp,rom_ip,4);		//讀取本機的ip
	locnode.ip=*((LWORD*)temp);
	
 				//如果IP未設置,設置IP為 192.168.0.7
	if (locnode.ip==0xffffffff || locnode.ip==0x0) locnode.ip=0xc0a80007;

	read24c02(temp,rom_mask,4);	//讀取本機的ip掩碼
	locnode.mask=*((LWORD*)temp);
				//如果IP掩碼未設置,設置IP掩碼為 255.255.255.0
	if (locnode.mask==0xffffffff ||locnode.mask==0x00)	locnode.mask=0xffffff00;
	read24c02(temp,rom_gate,4);	//讀取本機的缺省網關的ip
	locnode.gate=*((LWORD*)temp);
				//如果IP網關未設置,設置IP網關為 0.0.0.0(不存在網關)
	if (locnode.gate==0xffffffff)	locnode.gate=0x0;
	read24c02(mymac,rom_mac,6);	    //讀取本機的網卡物理地址
		//如果mac未設置,設置mac 為 0x1234567890ab
	if (!memcmp(mymac,bcast,6)) 
	  	 memcpy(mymac,default_mac,6);                
	memcpy(locnode.mac,mymac,6);
	read24c02(temp,rom_port,2);	//讀取本機的UDP端口號
	locnode.port=temp[0]*256+temp[1];
	if ((locnode.port==0xffff)||(locnode.port==0x0000))
			locnode.port=9000;
	remnode.port=locnode.port;
	read24c02(temp,rom_remote_ip,4);	//讀取本機的控制中心的ip,主動報警時用
	remnode.ip=*((LWORD*)temp);
	if (remnode.ip==0xffffffff || remnode.ip==0x0) remnode.ip=0xc0a80002;
	uart_trans_length=0;
	clear_watchdog();
	resetnic();
	net_overtime_count=0;
	runtime=0;
	first_arp=1;
	flush_gate_mac();
	while (1)
	{
		if (dog>=60) {  clear_watchdog(); }
		if (uart_received_finished)
				do_uart_process();
	   			// 只在串口發送完成后才處理網絡接收
	    		// 旨在保證在單發送緩沖區情況下不會覆蓋,
	    		// 在多發送緩沖區的情況下不會溢出。
	    if (uart_trans_finished)
			if ((rxlen=get_ethernet(&etherframe))>0)
			{
					ret=do_net_process(&etherframe,rxlen);
					if (ret==ARP_RX)
					{
						being_echo=false;				//  表示ARP全過程完成,對方返回了其MAC
						net_overtime_count=0;			//  清除等待網絡響應延時計數器,為下一次處理初始化
					}
     	 		    if (ret==CLIENT_DONE)				// 表示應用的UDP數據包接收完成
					{
					}
			}
		if (runtime>=120000)			//120000 *10ms =20 minute
		{
				runtime=0;
				first_arp=1;
				flush_gate_mac();		//刷新網關的物理地址mac
		 }
	}
}		
/*************************************************************************/
// 通過計數器uart_char_space 判斷串口60MS沒有新數據到達就認為一幀數據接收完成
// 在網絡要求遠端返回數據狀態下,網絡超時計數器加 1(10ms)
/*************************************************************************/

void timer0_interrupt(void)  interrupt 1
{
	TL0=TL0+LOW(timer_10ms_value);				//reload timer0
	TH0=TH0+HIGH(timer_10ms_value);
	if (uart_receiving)
	{
		if (uart_char_space<6)
			uart_char_space++;
		else
		{
			uart_receiving=false;
			uart_receive_enable=false;
			uart_received_finished=true;
			uart_frame_space=0;
		}
		uart_frame_space=0;
	}
	else
	{
		if (!uart_receive_enable)
		{
			uart_frame_space++;
			if (uart_frame_space>8)
			{
				uart_frame_space=0;
				uart_receive_enable=true;
			}
		 }
	}
	if (uart_trans_willing)
	{
			uart_trans_willing=false;
			TI=1;
	}
	
    if (being_echo)
    {
    	     net_overtime_count++;
    	     if (net_overtime_count>18000)
    	     {
    	     	being_echo=0;
    	     	if (first_arp)
    	     		first_arp=0;
    	     	else	
    	     		remote_echo=1;
    	     	net_overtime_count=0;
    	     }
    }	     	
     	runtime++;
	dog++;
}

/*************************************************************************/
//    串口中斷程序,該程序在認為串口的接收是終端在響應串口的發送
//    在串口未發送完成之前,不處理完羅接收的數據
/*************************************************************************/
void uart_interrupt(void)  interrupt 4 
{
	if (RI)
	{
		RI=0;
		if ((!uart_received_finished)&& uart_receive_enable)
		{
			if (!uart_receiving)
			{
				uart_receiving=1;
				uart_receive_count=0;
				uart_receive_buf[uart_receive_count++]=SBUF;
			}
			else
			{
				uart_char_space=0;
				uart_receive_buf[uart_receive_count++]=SBUF;
		 	}
		}
	}
	if (TI)
	{
		TI=0;
		if (uart_trans_count<uart_trans_length)
		{
				ACC=uart_trans_buf[uart_trans_count++];
				TB8=P;
				SBUF=ACC;
		}
		else
		{
				uart_trans_finished=1;
				uart_trans_count=0;
				uart_trans_length=0;
		}
				
	}
}

//*******************************************************************************
/* Receive a UDP datagram: return non-0 if client state-change */
int udp_receive(ETHERFRAME *efp, int len)
{
    UDPKT *udp;
    int ret=0;
    NODE loc, rem;
    udp = (UDPKT *)efp->edata;
    getudp_srce(efp, &rem);                         /* Get srce & dest nodes */
    getudp_locdest(efp, &loc);
    if (loc.port == locnode.port)                   /* Client response */
    {
        //    	UDP 將數據拷貝至串口接收緩沖區,置接收完成標志(在合并方式)
        //		UDP 將數據拷貝至串口發送緩沖區,置發送標志(在模塊方式)
        EA=0;
        memcpy(uart_trans_buf+uart_trans_length,udp->udpdata,len);
        uart_trans_length=uart_trans_length+len;
        uart_trans_finished=0;
        if (uart_trans_count==0)
        			uart_trans_willing=1;
		EA=1;        
        ret = CLIENT_DONE;                          /* ..and exit */
    }
    else if (loc.port == ECHOPORT)                  /* Echo req: resend data */
        udp_transmit(efp, &loc, &rem, udp->udpdata, len);
    return(ret);
}

/*****************************************************************/
//本機的網絡處理子程序
//
/*****************************************************************/
int do_net_process(ETHERFRAME *efp,int rxlen)
{
	ARPKT *arp;
	IPKT  *ip;
	ICMPKT *icmp;
	NODE node;
	int txlen;
	int len;
	int ret=0;
	ip=(IPKT *)efp->edata;
	if (is_arp(efp,rxlen))
 	{
            arp = (ARPKT *)efp->edata;
              
            if (arp->op==ARPREQ && arp->dip==locnode.ip)
            {                                       /* ARP request? */
                node.ip = arp->sip;                 /* Make ARP response */
                memcpy(node.mac, arp->smac, MACLEN);
                txlen = make_arp(efp, &locnode, &node, ARPRESP);
                put_ethernet(efp, txlen);              /* Send packet */
            }
            if (arp->op==ARPRESP && arp->dip==locnode.ip)
            {                                       /* ARP response? */
                memcpy(remnode.mac,arp->smac, MACLEN);
                being_echo=0;
                if (first_arp)
                    first_arp=0;
                else 
                    remote_echo=1;
                ret = ARP_RX;
            }
	}
    else if ((rxlen=is_ip(efp, rxlen))!=0)    /* IP datagram? */
                 if (ip->i.dip==locnode.ip || ip->i.dip==BCASTIP)
					
          {
            getip_srce(efp, &node);
            if ((len=is_icmp(ip, rxlen))!=0)        /* ICMP? */
            {
                icmp = (ICMPKT *)ip;
                if (icmp->c.type == ICREQ)          /* Echo request? */
                {
                    len = (WORD)max(len, 0);       /* Make response */
                    txlen = make_icmp(efp, &locnode, &node, ICREP,
                                      icmp->c.codetype, (WORD)len);
                    put_ethernet(efp, txlen);          /* Send packet */
                }
//                else if (icmp->c.type == ICUNREACH)
//                    printf("\r\nICMP: destination unreachable\r\n");
            }
            else if ((len=is_udp(ip, rxlen))!=0)    /* UDP? */
            {
                ret = udp_receive(efp, max(len, 0));
            }
        }
        return (ret);
}

//**********************************
void flush_gate_mac()
{			
	int ret;
	remote_echo=0;
	remnode.mac[0]=0xff;
	remnode.mac[1]=0xff;
	remnode.mac[2]=0xff;
	remnode.mac[3]=0xff;
	remnode.mac[4]=0xff;
	remnode.mac[5]=0xff;
	ret=make_arp(&etherframe,&locnode, &remnode, ARPREQ);		//請求網關或控制主機的物理地址
	put_ethernet(&etherframe,ret);
	being_echo=1;
}
//************************************************
void do_uart_process(void)
{
	if (being_echo==0)			// 1 arp wait response
	{
	        if (remote_echo==0)
	        {
   			if (!memcmp(remnode.mac, bcast, MACLEN))
   				flush_gate_mac();
   			else
	 		 	send_ip();
   		}		
		else
		{
			 remote_echo=0;
	 		 send_ip();
 	 	}	 
	 }
}

//************************************************
void send_ip(void)
{
	int ret;
    memcpy((BYTE *)&etherframe+sizeof(ETHERHDR)+sizeof(IPHDR)+sizeof(UDPHDR),uart_receive_buf,uart_receive_count);
	remnode.port=locnode.port;
	ret=make_udp(&etherframe, &locnode,&remnode,(WORD)(uart_receive_count));
	uart_received_finished=0;  
	uart_receive_count=0;
  	put_ethernet(&etherframe,ret);
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
极品少妇xxxx精品少妇| 丝袜诱惑亚洲看片| 99久久精品一区| 亚洲精品综合在线| 欧美日韩在线播| 亚洲成人资源网| 欧美xingq一区二区| 国产精品12区| 国产精品久久久久9999吃药| 一本大道久久a久久精品综合| 一区二区在线免费| 91精品久久久久久蜜臀| 久久精工是国产品牌吗| 国产日韩欧美精品综合| 91在线云播放| 天堂午夜影视日韩欧美一区二区| 日韩视频在线你懂得| 国产成人在线影院| 一片黄亚洲嫩模| 日韩欧美国产综合| 成人性生交大片免费看视频在线| 国产精品嫩草久久久久| 91国产丝袜在线播放| 美女视频一区在线观看| 久久人人爽人人爽| 91黄色在线观看| 国产一区在线视频| 亚洲已满18点击进入久久| 欧美一区二区三区系列电影| 丁香激情综合五月| 亚洲大片免费看| 国产精品美女一区二区三区| 91超碰这里只有精品国产| 国产风韵犹存在线视精品| 亚洲bdsm女犯bdsm网站| 久久久国产综合精品女国产盗摄| 欧美亚洲一区三区| 成人午夜视频网站| 青青草97国产精品免费观看| 国产精品久久久久久亚洲伦| 91麻豆精品国产综合久久久久久| 成人免费高清在线| 久久99深爱久久99精品| 亚洲老司机在线| 国产人久久人人人人爽| 制服丝袜国产精品| 色综合天天综合色综合av| 精品一区二区三区在线视频| 亚洲亚洲人成综合网络| 国产精品久久毛片| 26uuu久久综合| 91精品免费观看| 欧美性大战久久久久久久 | 欧美成人综合网站| 欧美亚洲动漫精品| 91无套直看片红桃| 国产白丝精品91爽爽久久| 日韩福利电影在线观看| 亚洲激情男女视频| 中文字幕亚洲综合久久菠萝蜜| 精品毛片乱码1区2区3区| 欧美日韩中文另类| 日韩精品中文字幕在线不卡尤物| 91麻豆国产在线观看| 粉嫩高潮美女一区二区三区| 精品一区二区三区免费播放| 青青草国产成人av片免费 | 美国毛片一区二区| 亚洲国产日韩在线一区模特| 亚洲免费观看在线视频| 国产精品白丝在线| 国产欧美视频一区二区| 精品国产乱码久久久久久影片| 欧美一区二区精品| 日韩欧美在线一区二区三区| 91精品在线一区二区| 884aa四虎影成人精品一区| 欧美日韩精品欧美日韩精品一| 欧美亚男人的天堂| 欧美日本国产一区| 正在播放亚洲一区| 精品理论电影在线观看| 精品福利av导航| 久久久久综合网| 日本一区二区三区在线观看| 欧美国产日产图区| 亚洲三级视频在线观看| 一区二区三区欧美日| 亚洲va欧美va天堂v国产综合| 亚洲成av人影院在线观看网| 日日噜噜夜夜狠狠视频欧美人| 三级欧美韩日大片在线看| 欧美在线播放高清精品| 欧美性生交片4| 宅男在线国产精品| 久久综合中文字幕| 国产人伦精品一区二区| 亚洲天堂免费在线观看视频| 亚洲精品视频在线| 亚洲福利电影网| 精品一区二区免费视频| 不卡视频免费播放| 欧美日韩视频在线观看一区二区三区 | 久久久久久97三级| 亚洲色图视频网站| 蜜臀av一区二区| 成人在线综合网站| 欧美日韩国产首页| 久久视频一区二区| 一区二区三区视频在线看| 蜜芽一区二区三区| 成人午夜视频在线观看| 欧美日韩亚洲另类| 久久久精品综合| 亚洲女女做受ⅹxx高潮| 麻豆精品在线观看| 91在线视频播放地址| 日韩欧美三级在线| 亚洲日本青草视频在线怡红院| 日韩精品欧美精品| 99热这里都是精品| 欧美mv日韩mv| 亚洲一区二区成人在线观看| 国内精品久久久久影院色| 欧美专区日韩专区| 国产日韩精品视频一区| 五月婷婷久久丁香| 成人app网站| 精品国产亚洲一区二区三区在线观看| 国产精品高潮呻吟久久| 男女激情视频一区| 在线视频亚洲一区| 国产欧美日韩在线| 精品综合久久久久久8888| 欧美性欧美巨大黑白大战| 久久久久亚洲蜜桃| 美腿丝袜亚洲三区| 欧美日韩视频在线观看一区二区三区| 欧美经典三级视频一区二区三区| 日韩成人一区二区三区在线观看| av一区二区三区四区| 久久这里只精品最新地址| 日日骚欧美日韩| 欧洲视频一区二区| 亚洲欧美一区二区三区孕妇| 国产精品自拍av| 精品国内二区三区| 日韩国产精品大片| 欧美肥妇bbw| 午夜精品福利一区二区蜜股av| 91在线porny国产在线看| 欧美国产日韩在线观看| 国产精品一区二区三区四区| 日韩一区二区视频在线观看| 亚洲小说春色综合另类电影| 日本高清成人免费播放| 国产精品久久久久久久浪潮网站| 国产一区二区不卡在线| 日韩欧美的一区二区| 免费欧美在线视频| 日韩欧美国产一区在线观看| 免费成人在线观看视频| 91精品国产麻豆国产自产在线 | 成人18精品视频| 国产亚洲精久久久久久| 精品一区二区三区免费| 日韩精品中文字幕在线一区| 秋霞电影网一区二区| 91精品国产麻豆| 蜜桃av一区二区在线观看| 婷婷综合五月天| 亚洲人成精品久久久久久| 久久嫩草精品久久久精品一| 国产欧美日韩麻豆91| 国产一区二区三区在线观看免费 | 欧美性大战久久久久久久蜜臀| 亚洲视频小说图片| 在线免费观看日韩欧美| 一区二区高清在线| 在线播放日韩导航| 久久99热这里只有精品| 久久影视一区二区| 成人午夜av影视| 亚洲美女在线一区| 欧美丰满少妇xxxbbb| 精品一区二区免费看| 国产精品污污网站在线观看| 91蝌蚪porny成人天涯| 亚洲国产日韩精品| 日韩欧美中文一区二区| 国产精品一区二区你懂的| 国产精品家庭影院| 欧美日韩色一区| 免费看日韩a级影片| 国产欧美中文在线| 欧美中文字幕一区| 激情综合一区二区三区| 亚洲欧美视频在线观看| 欧美一区午夜精品| 成人永久免费视频|