⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ze015_1.c.bak

📁 一款完整的家用电器程序,具有控制商用机的功能,应用广泛,有一定的参考价值
💻 BAK
📖 第 1 页 / 共 3 页
字号:
//ICC-AVR application builder : 2007-4-11 16:34:42
// Target : M64
// Crystal: 4.0000Mhz

#include <iom64v.h>
#include <macros.h>
#include <math.h>
#include  "jf_atmel.h"
#include  "jf_valve.h"
#include  "jf_p1.c"
#include  "jf_act.c"
#include  "jf_valve.c"



void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x0F;//0x0b;		//sck PA0-CD4052A,PA1-CD4052B
 PORTB = 0x00;
 DDRB  = 0xF0;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x01;
 PORTD = 0x00;
 DDRD  = 0xFB;
 PORTE = 0x00;
 DDRE  = 0xC6;
 PORTF = 0x00;
 DDRF  = 0x00;
 PORTG = 0x00;
 DDRG  = 0x1B;
}

//Watchdog initialize
// prescale: 16K 
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
 WDTCR |= 0x18;	//允许修改watchdog
 //WDTCR = 0x0d; //WATCHDOG ENABLED - 101--0.45s
 WDTCR = 0x0e; //WATCHDOG ENABLED - 110--1s
}

//20080612由10ms改为膨胀阀8ms定时
//TIMER0 initialize - prescale:256
// WGM: Normal
// desired value: 8mSec
// actual value:  8.000mSec (0.0%)
void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT0 = 0x83;  //4MHZ-8ms set count
 OCR0  = 0x7D;
 TCCR0 = 0x06; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
 TCNT0 = 0x83;//64; //reload counter value
 time_flag |=b_time_10ms;	//f_10ms=1
  t_10ms_times++;  //10ms时间计时 	     
 if (t_10ms_times>=12)
 	{
 		time_flag |=b_time_100ms; //f_100ms=1
 		t_10ms_times=0;
 	}
 if (mode & b_fast_test)time_flag |=b_time_1s;	//快测f_1s=1
 else
 {//正常时计数100时置1秒
 	t_1s_times++;	//10ms的计时1秒
 	if (t_1s_times>=125)
 	{
 		time_flag |=b_time_1s; //f_1s=1
 		t_1s_times=0;
 	}
 }
 if (run_state &b_beep_onask)	//01-beep_on
    {	//蜂鸣器要求响时,时间进行计数,计数到则关T2的CTC
	 	if (beep_time >=beep_time_ask) 
		 {//蜂鸣器响时间到时停止TIMER2,如次数未到则启动间隔计时
		 	PORTB &=~b_beep;	//beep=0 PB5时间到则关蜂鸣器
		 	TCCR2 = 0x00; //stop T2 CTC
		 	run_state &=~b_beep_onask;	//清除蜂鸣器响标志
		 	if (beep_times >=1)  //如果要求响的次数大于1
		 	  {
		 		beep_times--;	// 蜂鸣器响的次数-1
		 		auto_state |=b_beep_stop;	//开始蜂鸣器停止的间隔计时
		 		beep_stop_time =0;	//间隔计时清0
		 	  }  
		 	  
		  }
		else beep_time++;//蜂鸣器响时间未到时接着响,蜂鸣器响时间+1
	} 	
  else if (auto_state &b_beep_stop)
  	{//蜂鸣器间隔计时,计时到时启动TIMER2为CTC
  		beep_stop_time ++;	//间隔计时+1
  		if (beep_stop_time >=beep_stop_time_ask)
  			{//蜂鸣器间隔计时到时启动TIMER2
  				TCCR2 = 0x00; //stop
				 TCNT2 = 0x87; //0x86; // 2048 Khz    0x83; //2khz
				 OCR2  = 0x79; //0x7a; //0x7d;
				 TCCR2 = 0x1A; //start
  				beep_time=0; //蜂鸣器响时间=0
  				auto_state &=~b_beep_stop;	//清间隔计时标志
  				run_state |=b_beep_onask;	//蜂鸣器响标志
  			}
  	}
  else	
  {//无蜂鸣器响或间隔要求时关T2,输出0
  	TCCR2 = 0x00; //stop T2 CTC
  	PORTB &=~b_beep;	//beep=0 PB5时间到则关蜂鸣器
  }
//uart0 与主模块板通讯,等待主模块,接收正确后延时40MS发送应答,发送完成后立即转接收
 if (txd_state0 &rxd_txdstart0)	//rxd_txdstart=1
 	{
	txd_rxd_delaytime0++;
	if (txd_rxd_delaytime0>=5)	//接收完成转发送时延时40ms
	   {
		PORTE |= b_con4850;	//pe2为uart0-485控制端=1 txd
 		UCSR0B = 0x48;	// uart0_txd_on允许发送完成中断及发送
		txd_state0 &= ~rxd_txdstart0;	//rxd_txdstart=0
		txd_rxd_delaytime0=0;
		txd_len0=0;
		UDR0 =txd_data0[txd_len0];//每隔1秒写入第1个数据发送	
		txd_len0++;
		}
	}
		m_32mscountv=m_32mscountv+1;
		m_500mscount=m_500mscount+1;
}

//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Hz
// actual value:  1.000Hz (0.0%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0x0B; //setup
 TCNT1L = 0xDC;
 OCR1AH = 0xF4;
 OCR1AL = 0x24;
 OCR1BH = 0xF4;
 OCR1BL = 0x24;
 OCR1CH = 0xF4;
 OCR1CL = 0x24;
 ICR1H  = 0xF4;
 ICR1L  = 0x24;
 TCCR1A = 0x00;
 TCCR1B = 0x03; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{//20080201将定时1秒改在定时10MS中,增加快测
 //TIMER1 has overflowed 1s 1秒定时
	 TCNT1H = 0x0b; //reload counter high value
	 TCNT1L = 0xdc; //reload counter low value
 //20080201time_flag |=b_time_1s;	//f_1s=1
}
//TIMER2 initialize - prescale:8 中断未用,但用作蜂鸣器驱动2KHZ
// WGM: CTC
// desired value: 4KHz
// actual value:  3.992KHz (0.4%)
void timer2_init(void)
{
 TCCR2 = 0x00; //stop
 TCNT2 = 0x87; //0x86; // 2048 Khz    0x83; //2khz
 OCR2  = 0x79; //0x7a; //0x7d;
}

#pragma interrupt_handler timer2_ovf_isr:11
void timer2_ovf_isr(void)
{//no use but remain,定时器2用途CTC蜂鸣器驱动
 TCNT2 = 0x06;  //reload counter value
}
//TIMER3未用 
//TIMER3 initialize - prescale:256
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 100mSec
// actual value: 100.000mSec (0.0%)
void timer3_init(void)
{
 TCCR3B = 0x00; //stop
 TCNT3H = 0x0B; //setup
 TCNT3L = 0xDC;
 OCR3AH = 0xF4;
 OCR3AL = 0x24;
 OCR3BH = 0xF4;
 OCR3BL = 0x24;
 OCR3CH = 0xF4;
 OCR3CL = 0x24;
 ICR3H  = 0xF4;
 ICR3L  = 0x24;
 TCCR3A = 0x00;
// TCCR3B = 0x03; //start Timer
TCCR3B = 0x00;
}

#pragma interrupt_handler timer3_ovf_isr:30
void timer3_ovf_isr(void)
{//no use 
 //TIMER3 has overflowed
 TCNT3H = 0x0b; //reload counter high value
 TCNT3L = 0xdc; //reload counter low value
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
void uart0_init(void)
{
 UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x06;
 UBRR0L = 0x19; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
  UCSR0B = 0x90;	// uart0_rxd_on允许接收完成中断及接收
  PORTE &= ~b_con4850;	//pe2为uart0 485控制端=0接收
}

#pragma interrupt_handler uart0_rx_isr:19
void uart0_rx_isr(void)
{
 //串行口0用作与显示板按7E7E商用通讯格式,接收到显示板ID01及点名02后回复
 unsigned	char	m,n;
	m =UCSR0A;
	n =UDR0;
	if ((m &0x1C)==0)	//UCSRA中是否有接收出错(帧错、校验错、溢出错)
	{//接收正常
		switch (rxd_state0)
		{
		case 0x00:	//接收头码7EH
			{
			if (n==0x7E) 
			{rxd_state0=0x01;rxd_good0=0;}
			else  rxd_state0=0x00;	//出错时重新开始接收
			break;
			}
		case 0x01:	//接收头码7EH
			{
			if (n==0x7E) 
				{rxd_state0=0x02;}
			else rxd_state0=0x00;	//出错时重新开始接收
			break;
			}
		case 0x02:	//接收地址address;	//本机地址
			{
			if (n==0x40) //20080201  if (n==address)
				{
					rxd_state0=0x03;
					rxd_checksum0=n;	//异或校验码初始值
				}	
			else 
				{if (n==0x7E) rxd_state0=0x02;	//接收到7EH为头码1
				else rxd_state0=0x00;	//出错时重新开始接收
				}
			break;
			}
		case 0x03:	//接收发送方T_addr==0xff,其它出错
			{
			T_addr =n;	//发送方T_addr
			if (n==0xff) 
				{
					rxd_state0=0x04;
					rxd_checksum0^=n;	//异或校验
				}
			else 
				{if (n==0x7E) rxd_state0=0x01;	//接收到7EH为头码1
				else rxd_state0=0x00;	//出错时重新开始接收
				}
			break;
			}	
		case 0x04:	//接收包号0x11
			{
			if (n==0x11) 
				{
					rxd_state0=0x05;rxd_len0=0;
					rxd_checksum0^=n;	//异或校验
				}
			else 
				{if (n==0x7E) rxd_state0=0x01;	//接收到7EH为头码1
				else rxd_state0=0x00;	//出错时重新开始接收
				}
				break;
			}
		case 0x05:	//接收长度<=48
			{
			if (n<=0x30)
				{
					rxd_state0=0x06;rxd_len0_ask=n;rxd_data0[rxd_len0]=n;
					rxd_len0++;rxd_checksum0^=n;	//异或校验
				}
			else 
				{if (n==0x7E) rxd_state0=0x01;	//接收到7EH为头码1
				else rxd_state0=0x00;	//出错时重新开始接收
				}
			break;
			}

⌨️ 快捷键说明

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