main.c

来自「工厂环境污染控制数据采集器」· C语言 代码 · 共 2,994 行 · 第 1/5 页

C
2,994
字号
				break;
		case 29:
				intvar1=CONTROL_TLV2556(1,3,0x00);
				if(intvar1<3000)
				{
						IO_STATUS|=0x04;
				}
				else
				{
						IO_STATUS&=~0x04;
				}
				break;
		case 30:  //INPUT 4
				CONTROL_TLV2556(1,4,0x00);
				break;
		case 31:
				intvar1=CONTROL_TLV2556(1,4,0x00);
				if(intvar1<3000)
				{
						IO_STATUS|=0x08;
				}
				else
				{
						IO_STATUS&=~0x08;
				}
				break;
		default:break;
	}
	
}



void init_RTC(void)
{
	RTC_AMR=0;
	RTC_CIIR=0;
	RTC_CCR=0x11;  //select 32.768KHz
	//RTC_PREINT
}

unsigned char READ_RTC_SECOND(void)
{
	return RTC_SEC;
}

unsigned char READ_RTC_MINUTE(void)
{
	return RTC_MIN;
}

unsigned char READ_RTC_HOUR(void)
{
	return RTC_HOUR;
}

unsigned char READ_RTC_DAY(void)
{
	return RTC_DOM;
}

unsigned char READ_RTC_MONTH(void)
{
	return RTC_MONTH;
}

unsigned int READ_RTC_YEAR(void)
{
	return RTC_YEAR;
}

unsigned char * READ_RTC(void)
{
	char rt[6];
	rt[0] = (char)READ_RTC_YEAR();
	rt[1] = READ_RTC_MONTH();
	rt[2] = READ_RTC_DAY();
	rt[3] = READ_RTC_HOUR();
	rt[4] = READ_RTC_MINUTE();
	rt[5] = READ_RTC_SECOND(); 
	return rt;
}

/******************************************************************************
** Function name:		Timer0Handler
**
** Descriptions:		Timer/Counter 0 interrupt handler
**				executes each 10ms @ 60 MHz CPU Clock
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
void Timer0Handler(void) __irq 
{
	unsigned int i;

    T0IR = 1;			/* clear interrupt flag */
  //  IENABLE;			/* handles nested interrupt */

    timer_counter++;
    
    key_scan_time_base_counter++;
    
    refresh_input_value_counter++;
	
	tcpip_time_base++;
	  
	read_ad_timebase++;
	
	send_request_by_uart4_timebase++;
	
	send_status_by_udp_timebase++;
	
	save_to_sd_card_file_timebase++;
	//流量采样时间间隔
	flow_collection_timebase++;
	//判断串口是否进行超时计数
	for (i = 0; i < 5; i++)
	{
		if (g_site_conf_extend.com_port[i].timeout_calflg == TRUE)
			g_site_conf_extend.com_port[0].timeout_ticks++;
	}

  //  IDISABLE;
    VICVectAddr = 0;		/* Acknowledge Interrupt */
}

/******************************************************************************
** Function name:		enable_timer
**
** Descriptions:		Enable timer
**
** parameters:			timer number: 0 or 1
** Returned value:		None
** 
******************************************************************************/
void enable_timer(BYTE timer_num)
{
    if ( timer_num == 0 )
    {
		T0TCR = 1;
    }
    else
    {
		T1TCR = 1;
    }
    return;
}

/******************************************************************************
** Function name:		disable_timer
**
** Descriptions:		Disable timer
**
** parameters:			timer number: 0 or 1
** Returned value:		None
** 
******************************************************************************/
void disable_timer(BYTE timer_num)
{
    if ( timer_num == 0 )
    {
		T0TCR = 0;
    }
    else
    {
		T1TCR = 0;
    }
    return;
}

/******************************************************************************
** Function name:		reset_timer
**
** Descriptions:		Reset timer
**
** parameters:			timer number: 0 or 1
** Returned value:		None
** 
******************************************************************************/
void reset_timer( BYTE timer_num )
{
    DWORD regVal;

    if ( timer_num == 0 )
    {
		regVal = T0TCR;
		regVal |= 0x02;
		T0TCR = regVal;
    }
    else
    {
		regVal = T1TCR;
		regVal |= 0x02;
		T1TCR = regVal;
    }
    return;
}

/******************************************************************************
** Function name:		init_timer
**
** Descriptions:		Initialize timer, set timer interval, reset timer,
**						install timer interrupt handler
**
** parameters:			None
** Returned value:		true or false, if the interrupt handler can't be
**						installed, return false.
** 
******************************************************************************/
DWORD init_timer( DWORD TimerInterval ) 
{
    timer_counter = 0;
    T0MR0 = TimerInterval;
    T0MCR = 3;				/* Interrupt and Reset on MR0 */
    //if ( install_irq( TIMER0_INT, (void *)Timer0Handler, HIGHEST_PRIORITY ) == FALSE )
    if ( install_irq( TIMER0_INT, (void *)Timer0Handler, 2 ) == FALSE )
    {
			return (FALSE);
    }
    else
    {
			return (TRUE);
    }
   //return (TRUE);
}

//////////////////Serial control////////////////////////////////////////////////
void set_uart0_to_tx_status(void)
{
	FIO4SET=(uint32)0x01<<29;
}

void set_uart0_to_rx_status(void)
{
	FIO4CLR=(uint32)0x01<<29;
}



void set_uart1_to_tx_status(void)
{
	FIO4SET=(uint32)0x01<<28;
}

void set_uart1_to_rx_status(void)
{
	FIO4CLR=(uint32)0x01<<28;
}


void set_uart2_to_tx_status(void)
{
	FIO3SET=(uint32)0x01<<26;
}

void set_uart2_to_rx_status(void)
{
	FIO3CLR=(uint32)0x01<<26;
}



void set_uart3_to_tx_status(void)
{
	FIO3SET=(uint32)0x01<<25;
}

void set_uart3_to_rx_status(void)
{
	FIO3CLR=(uint32)0x01<<25;
}



void SEND_MODBUS_FRAME(void)
{
	

	
	
}

void Ldelay(unsigned int dly)
{
	unsigned int i;
	
	for ( ; dly>0; dly--)
		for (i=0; i<50000; i++)
		{
			feed_watchdog();
		}
}


void delay(unsigned int dly)
{

	for(;dly>0;dly--)
	{
		
	}

}


void delay_xus(unsigned int dly)
{
	for(;dly>0;dly--)
	{
		delay(200);
	}
}

           
void delay_xms(unsigned int dly)
{
	for(;dly>0;dly--)
	{
		delay_xus(1000);
	}
}


/*

读写AT24C16的函数,用模拟方式读写任意地址的任意个数据(小于256)
输出以下两个函数,分别用于读写;
addr为16位的地址;取值0--2047
*s为放置写入(或读出)数据的缓冲区指针
count为一次写入的数量,最大为255
返回值表明读写是否成功;1--成功;0 -- 出错;
没有检测是否地址溢出,所以请使用时注意;
unsigned char write(unsigned int addr,unsigned char *s,unsigned char count);
unsigned char read(unsigned int addr,unsigned char *s,unsigned char count);

需要引入两个函数,这两个函数可以自己定义,也可以使用系统的,如下
void delay_xms(unsigned int x); 延时x毫秒
void delay_xus(unsigned int x); 延时x微秒

使用系统自带
#define F_CPU  ??(你的晶振频率)
#include <util\delay.h>
#define delay_xms(a) _delay_ms(a)
#define delay_xus(a) _delay_us(a)

该程序针对ATMEGA64在AT24C16上应用;如果用其它的MCU,请更改端口设置

*/


#define SET_SDA   H_AT24_SDA();delay(1000)
#define CLR_SDA   L_AT24_SDA();delay(1000)
#define SET_SCL   H_AT24_SCL();delay(1000)
#define CLR_SCL   L_AT24_SCL();delay(1000)
#define SDA_IN    IODIR0&=~((uint32)0x01<<AT24C_SDA);delay(1000)
#define SDA_OUT   IODIR0|=(uint32)0x01<<AT24C_SDA;delay(1000)
#define IF_SDA_H  ((IOPIN0&0x08000000)!=0)
#define IF_SDA_L  ((IOPIN0&0x08000000)==0)



// 在SCL为高的时间,SDA从高到低的跳变表明开始,从低到高的跳变表明结束
// SDA 在处理数据时,SCL必须在低状态,否则就表明开始或结束;
// SCL从低到高的跳变时输出或读入数据;


void i2cstart(void)
{ 
	 SDA_OUT;
   SET_SDA; 
	 delay_xus(10); 
   SET_SCL;  
   CLR_SDA; 
   CLR_SCL;
}

unsigned char i2cstop(void)
{
	 //SDA_OUT;
	 
   CLR_SDA;
   SET_SCL;
   SET_SDA;
	 
	 SDA_IN;

	 if(IF_SDA_L)
	 {
			SDA_OUT;
			return 0;
	 }
	 else
	 {
			SDA_OUT;
			return 1;
	 }
}

unsigned char i2csendbyte(unsigned char temp12)
{
  unsigned char i=8;
	unsigned char flag2data;
   
  CLR_SCL; 
	while (i--)
	{
    if(temp12&0x80)
		{
			SET_SDA;
		}
		else
		{
			CLR_SDA;
		}
		
    temp12<<=1; 
    SET_SCL;
    CLR_SCL;
  }
	
  SDA_IN;
	SET_SCL;
	
  if(IF_SDA_H)
	{
		flag2data = 1;
	}
	else
	{
		flag2data = 0;
	}
	
  CLR_SCL;  
  SDA_OUT;
	return flag2data;
}

unsigned char i2creceivebyte(unsigned char ac)
{
   unsigned char i=8,temp12=0;
     
	 SDA_IN;
	 CLR_SCL;
   while (i--)
	 {
			SET_SCL;
    	temp12 <<= 1;
    	if(IF_SDA_H)temp12++; 
    	CLR_SCL;
   }
	 
	 SDA_OUT;
	 if(ac)
	 {
			SET_SDA;
	 }
	 else
	 {
			CLR_SDA;
	 }
	
	 SET_SCL;
	 CLR_SCL;
	 
   return temp12;
}

unsigned char setaddr(unsigned char sla,unsigned char suba,unsigned char rw)
{
	sla &= 0x07;
	sla <<= 1;
	if (rw)
		sla |= 0xa1;
	else
		sla |= 0xa0;
	i2cstart();
	if (i2csendbyte(sla)) return 1;
	if (!rw) return i2csendbyte(suba);
	return 0;
}


unsigned char write(unsigned int addr,unsigned char *s,unsigned char count)
{
	unsigned char i;

	do
	{
		for (i=255;i>0;i--)
		{
			if (setaddr(addr >> 8,addr,0) == 0) break;
			i2cstop();
			if (i == 0) return 0;
		}
		i = ((unsigned char)addr) & 0x0f;
		if (count == 0) return i2cstop();
		do
		{
			if (i2csendbyte(*s))
		 	{
				i2cstop();
				return 0;
			}
			s++;
			addr++;
		} while((--count) && ((++i) < 0x10));
		i2cstop();
		delay_xms(20);
	}while(1);
}

unsigned char read(unsigned int addr,unsigned char *s,unsigned char count)
{
	unsigned char mack;
	
	if(count == 0) return 0;

	if(setaddr(addr >> 8,addr,0))
	{
		i2cstop();
		return 1;
	}

	do
	{
		if(setaddr(addr >> 8,addr,1))
		{
			i2cstop();
			return 1;
		}

		for(;;)
		{
			mack =((--count) && ((++addr) & 0xff));
			*s = i2creceivebyte(!mack);
			s++;
			if (!mack) break;
		}
	}while(count);
	return i2cstop();
}


void init_eeprom(void)
{

	IODIR0|=(uint32)0x01<<AT24C_SCL;
	
	SET_SDA;
	SET_SCL;	
}


void OFF_LED18(void)
{
	IOSET0=(uint32)0x01<<LED18;
}

void ON_LED18(void)
{
	IOCLR0=(uint32)0x01<<LED18;
}

void OFF_LED23(void)
{
	IOSET0=(uint32)0x01<<LED23;
}

void ON_LED23(void)
{
	IOCLR0=(uint32)0x01<<LED23;
}

void OFF_BEEP(void)
{
	L_BEEP_CTRL();
}

void ON_BEEP(void)
{
	H_BEEP_CTRL();
}

//P0.6
//P0.7
//P0.8
//P0.9
void SET_OUTPUT_STATUS(unsigned char output_select,unsigned char output_status)
{
	switch(output_select)
	{
		case 1:
			if(output_status==0)
			{
				IOCLR0=(uint32)0x01<<6;
			}
			else

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?