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

📄 1.c

📁 关于ATMEGA128高级应用的C语言程序,有1000多行.
💻 C
📖 第 1 页 / 共 2 页
字号:
				{
					temp = 0;
					while (temp < 200)
					{
						AD4 = 1;
						_delay_us(200);
						AD4 = 0;
						_delay_us(100);
						temp++;
						led_init();
					}
					temp = 0;
					while (temp < 200)
					{
						AD4 = 1;
						_delay_us(200);
						AD4 = 0;
						_delay_us(100);
						temp++;
						led_init();
					}
				}
				AD4 = 0;
				led_init();
				clear_timer();
				temp = 0;
				while ((0 == AD5_R) && (0 == temp))
				{
					if (second > 2)	//超时报错1:目标板无电压
					{
						error = (1<<0);
						temp = 1;
					}
				}
				if (0 == error)	//正常亮绿灯1
				{
					green1 &= ~(1<<0);
					led_display();
				}
				else	//亮红灯1,停止检测
				{
					red1 &= ~error;
					BEEP = 1;
					led_display();
					PORTF &= 0xF0;
					goto TEST_RST_19;
				}
				
				/*加热继电器断开测试*/
				
				PORTF &= 0xF0;
				_delay_ms(100);
				clear_timer();
				while ((1 == VIN2) && (0 == second))
				{
					asm("NOP");
				}
				if (0 != second)	//正常亮绿灯2
				{
					green1 &= ~(1<<1);
					led_display();
				}
				else	//亮红灯2,停止检测
				{
					red1 &= ~(1<<1);
					BEEP = 1;
					led_display();
					PORTF &= 0xF0;
					goto TEST_RST_19;
				}
				
				/*电机继电器断开测试*/
				
				clear_timer();
				while ((1 == VIN1) && (0 == second))
				{
					asm("NOP");
				}
				if (0 != second)	//正常亮绿灯3
				{
					green1 &= ~(1<<2);
					led_display();
				}
				else	//亮红灯3,停止检测
				{
					red1 &= ~(1<<2);
					BEEP = 1;
					led_display();
					PORTF &= 0xF0;
					goto TEST_RST_19;
				}
				
				/*加热继电器接通测试*/
				
				AD1 = 1;
				AD3 = 1;
				_delay_ms(100);
				clear_timer();
				temp = 0;
				while ((1 == VIN2) && (0 == temp))
				{
					if (second > 2)	//超时报错4:不加热
					{
						error = (1<<3);
						temp = 1;
					}
				}
				time_1 = 0;
				while (0 == VIN2)
				{
					i2c_delay();
					time_1++;
					if (time_1 > 60000)
					{
						error = (1<<3);	//超时报错4:不加热
						break;
					}
				}
				while (1 == VIN2)
				{
					i2c_delay();
					time_1++;	//测得全功率的周期
					if (time_1 > 60000)
					{
						error = (1<<3);	//超时报错4:不加热
						break;
					}
				}
				AD1 = 0;
				if (0 == error)	//正常亮绿灯4
				{
					green1 &= ~(1<<3);
					led_display();
				}
				else	//亮红灯4,停止检测
				{
					red1 &= ~error;
					BEEP = 1;
					led_display();
					PORTF &= 0xF0;
					goto TEST_RST_19;
				}
				
				/*电机继电器接通测试*/
				
				AD2 = 1;
				_delay_ms(100);
				clear_timer();
				temp = 0;
				while ((1 == VIN1) && (0 == temp))
				{
					if (second > 2)	//超时报错5:不打浆
					{
						error = (1<<4);
						temp = 1;
					}
				}
				if (0 == error)	//正常亮绿灯5
				{
					green1 &= ~(1<<4);
					led_display();
				}
				else	//亮红灯5,停止检测
				{
					red1 &= ~error;
					BEEP = 1;
					led_display();
					PORTF &= 0xF0;
					goto TEST_RST_19;
				}
				
				/*半功率测试*/
				
				AD3 = 0;
				_delay_ms(200);
				clear_timer();
				temp = 0;
				while ((1 == VIN1) && (0 == temp))
				{
					if (second > 2)	//超时报错6:不打浆
					{
						error = (1<<5);
						temp = 1;
					}
				}
				time_2 = 0;
				while (0 == VIN1)
				{
					i2c_delay();
					time_2++;
					if (time_2 > 60000)
					{
						error = (1<<5);	//超时报错6:不打浆
						break;
					}
				}
				while (1 == VIN1)
				{
					i2c_delay();
					time_2++;	//测得半功率的周期
					if (time_2 > 60000)
					{
						error = (1<<5);	//超时报错6:不打浆
						break;
					}
				}
				time_2 *= 2;
				time_1 *= 3;	//半功率周期 > 1.5全功率周期
				if ( (time_2 > time_1) && (0 == error) )	//正常亮绿灯6
				{
					green1 &= ~(1<<5);
					led_display();
				}
				else	//亮红灯6,停止检测
				{
					red1 &= ~(1<<5);
					BEEP = 1;
					led_display();
					PORTF &= 0xF0;
					goto TEST_RST_19;
				}
				
				/*自动测试通过*/
				
				red1 = 0xFF;
				red2 = 0xFF;
				green1 = 0x00;
				green2 = 0x00;
				K4 = 0;
				K5 = 0;
				K8 = 0;	//目标板断电
				PORTF &= 0xF0;
				led_display();
			}
			else  if (0x02 == key_temp)	//beep off
			{
				BEEP = 0;
			}
			else
			{
				led_display();
			}
		}
	}
	else
	{
		while (1)
		{
			asm("NOP");
		}
	}
}

/*************************************************************************************************************
							INIT Subroutine
**************************************************************************************************************/

void io_init(void)
{
	cli();
//	wdt_disable();
	XDIV = 0;
	PORTA = 0xFF;
	DDRA  = 0x00;
	PORTB = 0x00;
	DDRB  = 0xFF;
	PORTC = 0xFF;
	DDRC  = 0x00;
	PORTD = 0x00;
	DDRD  = 0xFF;
	PORTE = 0x20;
	DDRE  = 0xDE;
	PORTF = 0x0F;
	DDRF  = 0x00;
	PORTG = 0x00;
	DDRG  = 0x04;
	ram_init();
	spi_init();
	twi_init();
	timer_init();
	uart_init();
	adc_init();
	sei();
}

void ram_init(void)
{
	key_current = 0;
	key_old = 0;
	key_time = 0;
	key_do = 0;
	key_do_flag = 0;
	timer_counter = 0;
	second = 0;
	red1 = 0xFF;
	red2 = 0xFF;
	green1 = 0xFF;
	green2 = 0xFF;
	time_1 = 0;
	time_2 = 0;
	error = 0;
	model = 0;
	beep_test = 0;
	flash_t = 0;
}

void spi_init(void)
{
	SPCR = 0;		//SPI disable
	//SPSR = 0;
	//SPDR = 0;
}

void twi_init(void)
{
	TWCR = 0;		//TWI disable
	//TWBR = 0xFF;
	//TWAR = 0;
	//TWDR = 0xFF;
	//TWSR = 0;
}

void timer_init(void)
{
	SFIOR |= (1<<TSM) | (1<<PSR0) | (1<<PSR321);	//Synchronization Mode
	
	TCCR0 = 0x07;	//timer0 23.7ms
	TCNT0 = 0;
	//OCR0 = 0xFF;	//Output Compare
	
	TCCR1A = 0x09;	//non-inverting mode
	TCCR1B = 0x09;	//timer1 8-bit Fast PWM Mode, 43.2KHz
	TCCR1C = 0;
	TCNT1 = 0;
	//OCR1A = 255;	//DAOUT1
	//OCR1B = 255;	//DAOUT2
	OCR1C = 255;	//DAOUT3
	//ICR1 = 0;
	
	TCCR2 = 0;		//Timer2 disable
	//TCNT2 = 0;
	//OCR2 = 0x10;	//Output Compare
	
	//timer3_init();
	TCCR3A = 0x00;	//Timer3 disable
	TCCR3B = 0x00;
	//TCCR3C = 0;
	//TCNT3 = 0;
	//OCR3A = 255;	//DAOUT4
	//OCR3B = 255;	//DAOUT5
	//OCR3C = 255;	//DAOUT6
	//ICR3 = 0;
	
	TIMSK = 0x01;	//Timer0 Overflow Interrupt Enable
	//ETIMSK = 0x00;
	TIFR = 0xFF;	//clear all timer int flag
	SFIOR &= ~(1<<TSM);	//all the Timers start counting simultaneously
}

void uart_init(void)
{
	UBRR0H = UBRRH_VALUE;
	UBRR0L = UBRRL_VALUE;
	#if USE_2X
		UCSR0A |= (1 << U2X);
	#else
		UCSR0A &= ~(1 << U2X);
 	#endif
	UCSR0B = (1<<RXEN) | (1<<TXEN);	//USART0 允许发送和接收
	UCSR0C = (1<<UCSZ1) | (1<<UCSZ0);	//8位数据
	UCSR1B = 0;	//USART1 disable
}

void adc_init(void)
{
	//ADMUX = 0;
	ADCSRA = 0;	//ADC disable
}

/*---------------------------------------------------------------------------------------------------
	Description:	led display
	input:			red1, red2, green1, green2
	Return:			--
	Others:			--
----------------------------------------------------------------------------------------------------*/

void led_init(void)
{
	red1 = 0xFF;
	red2 = 0xFF;
	green1 = 0xFF;
	green2 = 0xFF;
	led_display();
}

void led_display(void)
{
	unsigned char i;
	
	//PORTA |= 0x0D;
	//PORTA &= ~0x02;
	for(i=0;i<8;i++)
	{
		CLK1 = 0;
		if ( (red1 & (1<<(7-i))) )
		{
			DATA1 = 1;
		}
		else
		{
			DATA1 = 0;
		}
		asm("NOP");
		CLK1 = 1;
		asm("NOP");
		asm("NOP");
		asm("NOP");
	}
	CLK1 = 0;
	for(i=0;i<8;i++)
	{
		CLK2 = 0;
		if ( (red2 & (1<<(7-i))) )
		{
			DATA2 = 1;
		}
		else
		{
			DATA2 = 0;
		}
		asm("NOP");
		CLK2 = 1;
		asm("NOP");
		asm("NOP");
		asm("NOP");
	}
	CLK2 = 0;
	for(i=0;i<8;i++)
	{
		CLK3 = 0;
		if ( (green1 & (1<<(7-i))) )
		{
			DATA3 = 1;
		}
		else
		{
			DATA3 = 0;
		}
		asm("NOP");
		CLK3 = 1;
		asm("NOP");
		asm("NOP");
		asm("NOP");
	}
	CLK3 = 0;
	for(i=0;i<8;i++)
	{
		CLK4 = 0;
		if ( (green2 & (1<<(7-i))) )
		{
			DATA4 = 1;
		}
		else
		{
			DATA4 = 0;
		}
		asm("NOP");
		CLK4 = 1;
		asm("NOP");
		asm("NOP");
		asm("NOP");
	}
	CLK4 = 0;
}

/*---------------------------------------------------------------------------------------------------
	Description:	key scan
	Return:			
					0x00--Not Deal,		0xFF--No key be pressed,	0xFE--the last key be loosened
	Others:			--
----------------------------------------------------------------------------------------------------*/

unsigned char scan_key(void)
{
	unsigned char temp;
	
	/* WDT clear */
	
	/* read key value */
	key_current = PING;
	key_current = ~key_current;
	key_current &= 0x1B;
	
	/* filter */
	if (key_current != key_old)
	{
		key_old = key_current;
		key_time = 0;
		key_do_flag = 0;
	}
	else if (0 == key_do_flag)
	{
		key_time++;
		if (key_time > KEY_FILTER)
		{
			key_do_flag = 1;
			if (0 == key_current)			/* no key be pressed */
			{
				key_do = 0;
				return 0xFF;
			}
			else if (key_current < key_do)	/* the last key be loosened & have key be pressed */
			{
				key_do = key_current;
				return 0xFE;
			}
			else							/* have new key be pressed */
			{
				temp = (key_current & (~key_do));	/* prevent to redo the already done key */
				key_do = key_current;
				return temp;
			}
		}
	}
	return 0;
}

/*---------------------------------------------------------------------------------------------------
	self-explain functions
----------------------------------------------------------------------------------------------------*/

void clear_timer(void)
{
	timer_counter = 0;
	second = 0;
}

void set_model(void)
{
	model = PINA;
	model = ~model;
	model = model & 0x0F;
}

void i2c_delay(void)
{
	asm("NOP");
	asm("NOP");
	asm("NOP");
	asm("NOP");
	asm("NOP");
	asm("NOP");
	asm("NOP");
	asm("NOP");
}

⌨️ 快捷键说明

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