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 + -
显示快捷键?