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

📄 1.c

📁 关于ATMEGA128高级应用的C语言程序,有1000多行.
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************************************
  Description:	Test jig for Joyong PCB
  MCU:			ATmega128-16AU
  REV:			0.0
  DAY:			2008.08.11
****************************************************************************************************/

#define F_CPU		11059200L	//晶振11.0592MHZ
#define	BAUD		19200		//波特率
#define	KEY_FILTER	20			//按键消抖深度
#define	TEMP25C		16			//25c 电压
#define	TEMP91C		200			//91c 电压
#define	R_WATER		50			//模拟电极间水电阻

#define	M_16_01		2			//16#板测试程序第一版
#define	M_19_01		1			//19#板测试程序第一版
#define	M_29_01		0			//29#板测试程序第一版

/***************************************************************************************************/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <util/setbaud.h>

/***************************************************************************************************
							ATmega128
	PORTA:0X3b; PORTB:0X38; PORTC:0X35; PORTD:0X32;PORTE:0X23;PORTF:0X62;PORTG:0X65;
	DDRA :0x3a; DDRB :0x37; DDRC :0x34; DDRD :0x31;DDRE :0x22;DDRF :0X61;DDRG :0x64;
	PINA :0X39; PINB :0X36; PINC :0X33; PIND :0X30;PINE :0X21;PINF :0X20;PING :0x63;
							can128
	PORTA:0X22; PORTB:0X25; PORTC:0X28; PORTD:0X2B;PORTE:0X2E;PORTF:0X31;PORTG:0X34;
	DDRA :0x21; DDRB :0x24; DDRC :0x27; DDRD :0x2A;DDRE :0x2D;DDRF :0X30;DDRG :0x33;
	PINA :0X20; PINB :0X23; PINC :0X26; PIND :0X29;PINE :0X2C;PINF :0X2F;PING :0X32;
****************************************************************************************************/

typedef struct xxx
{	
	unsigned char bit0:1;
	unsigned char bit1:1;
	unsigned char bit2:1;
	unsigned char bit3:1;
	unsigned char bit4:1;
	unsigned char bit5:1;
	unsigned char bit6:1;
	unsigned char bit7:1;
}bit_field;

#define	CTRL1	(*((volatile bit_field*)(0x3b))).bit0	//PORTA
#define	CTRL2	(*((volatile bit_field*)(0x3b))).bit1	//PORTA
#define	CTRL3	(*((volatile bit_field*)(0x3b))).bit2	//PORTA
#define	CTRL4	(*((volatile bit_field*)(0x3b))).bit3	//PORTA
#define	AD5		(*((volatile bit_field*)(0x3b))).bit4	//PORTA
#define	AD5_R	(*((volatile bit_field*)(0x39))).bit4	//PINA
#define	AD6		(*((volatile bit_field*)(0x3b))).bit5	//PORTA
#define	AD6_R	(*((volatile bit_field*)(0x39))).bit5	//PINA
#define	AD7		(*((volatile bit_field*)(0x3b))).bit6	//PORTA
#define	AD7_R	(*((volatile bit_field*)(0x39))).bit6	//PINA
#define	AD8		(*((volatile bit_field*)(0x3b))).bit7	//PORTA
#define	AD8_R	(*((volatile bit_field*)(0x39))).bit7	//PINA

#define	K1		(*((volatile bit_field*)(0x38))).bit0	//PORTB
#define	K2		(*((volatile bit_field*)(0x38))).bit1	//PORTB
#define	K3		(*((volatile bit_field*)(0x38))).bit2	//PORTB
#define	K4		(*((volatile bit_field*)(0x38))).bit3	//PORTB
#define K6		(*((volatile bit_field*)(0x38))).bit4	//PORTB
#define	DA1		(*((volatile bit_field*)(0x38))).bit5	//PORTB
#define	DA1_R	(*((volatile bit_field*)(0x36))).bit5	//PINB
#define	DA2		(*((volatile bit_field*)(0x38))).bit6	//PORTB
#define	DA2_R	(*((volatile bit_field*)(0x36))).bit6	//PINB
#define	DA3		(*((volatile bit_field*)(0x38))).bit7	//PORTB
#define	DA3_R	(*((volatile bit_field*)(0x36))).bit7	//PINB

#define	VIN1	(*((volatile bit_field*)(0x33))).bit0	//PINC
#define	VIN2	(*((volatile bit_field*)(0x33))).bit1	//PINC
#define	VIN3	(*((volatile bit_field*)(0x33))).bit2	//PINC
#define	VIN4	(*((volatile bit_field*)(0x33))).bit3	//PINC
#define	VIN5	(*((volatile bit_field*)(0x33))).bit4	//PINC
#define	VIN6	(*((volatile bit_field*)(0x33))).bit5	//PINC
#define	VIN7	(*((volatile bit_field*)(0x33))).bit6	//PINC
#define	VIN8	(*((volatile bit_field*)(0x33))).bit7	//PINC

#define	CLK1	(*((volatile bit_field*)(0x32))).bit0	//PORTD
#define	DATA1	(*((volatile bit_field*)(0x32))).bit1	//PORTD
#define	CLK2	(*((volatile bit_field*)(0x32))).bit2	//PORTD
#define	DATA2	(*((volatile bit_field*)(0X32))).bit3	//PORTD
#define	CLK3	(*((volatile bit_field*)(0x32))).bit4	//PORTD
#define	DATA3	(*((volatile bit_field*)(0x32))).bit5	//PORTD
#define	CLK4	(*((volatile bit_field*)(0x32))).bit6	//PORTD
#define	DATA4	(*((volatile bit_field*)(0x32))).bit7	//PORTD

#define	RXD0	(*((volatile bit_field*)(0x21))).bit0	//PINE
#define	TXD0	(*((volatile bit_field*)(0x23))).bit1	//PORTE
#define	K5		(*((volatile bit_field*)(0x23))).bit2	//PORTE
#define	DA4		(*((volatile bit_field*)(0x23))).bit3	//PORTE
#define	DA4_R	(*((volatile bit_field*)(0x21))).bit3	//PINE
#define	DA5		(*((volatile bit_field*)(0x23))).bit4	//PORTE
#define	DA5_R	(*((volatile bit_field*)(0x21))).bit4	//PINE
#define	DA6		(*((volatile bit_field*)(0x23))).bit5	//PORTE
#define	DA6_R	(*((volatile bit_field*)(0x21))).bit5	//PINE
#define	K7		(*((volatile bit_field*)(0x23))).bit6	//PORTE
#define	K8		(*((volatile bit_field*)(0x23))).bit7	//PORTE

#define	AD1		(*((volatile bit_field*)(0x62))).bit0	//PORTF
#define	AD1_R	(*((volatile bit_field*)(0x20))).bit0	//PINF
#define	AD2		(*((volatile bit_field*)(0x62))).bit1	//PORTF
#define	AD2_R	(*((volatile bit_field*)(0x20))).bit1	//PINF
#define	AD3		(*((volatile bit_field*)(0x62))).bit2	//PORTF
#define	AD3_R	(*((volatile bit_field*)(0x20))).bit2	//PINF
#define	AD4		(*((volatile bit_field*)(0x62))).bit3	//PORTF
#define	AD4_R	(*((volatile bit_field*)(0x20))).bit3	//PINF

#define	S1		(*((volatile bit_field*)(0x65))).bit0	//PORTG
#define	S2		(*((volatile bit_field*)(0x65))).bit1	//PORTG
#define	BEEP	(*((volatile bit_field*)(0x65))).bit2	//PORTG
#define	S3		(*((volatile bit_field*)(0x65))).bit3	//PORTG
#define	S4		(*((volatile bit_field*)(0x65))).bit4	//PORTG

/*************************************************************************************************************
							Variable define
**************************************************************************************************************/

volatile unsigned char key_current, key_old, key_time, key_do, key_do_flag;	/* key scan & filter */
volatile unsigned char timer_counter, second;	/* timer */
volatile unsigned char red1, red2, green1, green2; /* LED显示码,低有效 */
volatile unsigned int time_1, time_2; /*测输入电压全桥整流后的周期,用于全功率半功率判断*/
volatile unsigned char error;	/* 错误代码,0=无错 */
volatile unsigned char model;	/* 目标板型号,0=29# */
volatile unsigned char beep_test;	/* 测试目标板BEEP信号标志寄存器 */
volatile unsigned char flash_t;	/* 上排灯闪烁提示标志寄存器 */
volatile unsigned char red1_back;	/* red1 的备份 */

/*************************************************************************************************************
							Function explain
**************************************************************************************************************/

void io_init(void);
void spi_init(void);
void twi_init(void);
void timer_init(void);
void uart_init(void);
void adc_init(void);
void led_init(void);
void ram_init(void);

unsigned char scan_key(void);
void led_display(void);
void clear_timer(void);
void set_model(void);
void i2c_delay(void);

/*************************************************************************************************************
							Interrupt
**************************************************************************************************************/

SIGNAL(SIG_OVERFLOW0)	//timer0溢出中断 23.7mS
{
    unsigned char i;
    timer_counter++;
    if (1 == flash_t)
    {
		if (timer_counter > 12)
		{
			red1 = ~red1;
	        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;
		}
    }
	if (timer_counter > 42)
	{
		second++;
		timer_counter = 0;
	}
}

/*************************************************************************************************************/

SIGNAL(SIG_INTERRUPT5)	//INT5中断,上升沿
{
    beep_test =1;
    EIFR = 255;
}

/*************************************************************************************************************
							Main program
**************************************************************************************************************/

int main(void)
{
	unsigned char temp, key_temp;
	
	io_init();
	led_init();
	set_model();
	if (M_29_01 == model)
	{
TEST_RST_29:
		EIMSK = 0;
		EIFR = 255;
		K8 = 0;
		K7 = 0;
		K3 = 0;
		while (1)
		{
			/*数字信号:	AD1_R = RG发热管,AD2_R = DJ电机,AD3_R = 半功率,DA1 = 低水位电极输入,DA2 = 防溢电极输入
			  继电器开关:	K3 = 目标板过零信号开关,K7 = 目标板电源开关,K8 = 目标板地线开关
			  上升沿中断:	INT5 = 蜂鸣器
			  DA输出:		OCR1C = NTC温度输入 */
			key_temp = 0;
			while (0 == key_temp)
			{
				key_temp = scan_key();
			}
			if (0x01 == key_temp)	//start test
			{
				EIMSK = 0;
				EICRA = 0;
				EICRB = 0x0C;
				EIMSK = 0x20;
				BEEP = 0;
				OCR1C = TEMP25C;	//温度25C
				DA2 = 0;			//防溢电极
				DA1 = 0;			//低水位电极
				error = 0;
				_delay_ms(200);
				if (0 == AD6_R)		//检测目标板VCC和GND有无短路
				{
					red2 &= ~(1<<7);
					BEEP = 1;
					led_display();
					goto TEST_RST_29;
				}
				
				/* 向目标板供电 */
				
				led_init();
				K8 = 1;
				K7 = 1;
				K3 = 1;
				_delay_ms(30);
				
				/* 嘟1下,目标板复位完成 */
				
				clear_timer();
				temp = 0;
				while ((1 == AD1_R) && (0 == temp))
				{
					if (second > 2)	//超时报错1:目标板MCU不工作/蜂鸣器不响
					{
						error = (1<<0);
						temp = 1;
					}
				}
				if (0 == error)	//正常亮绿灯1
				{
					green1 &= ~(1<<0);
					led_display();
				}
				else	//亮红灯1,停止检测
				{
					red1 &= ~error;
					BEEP = 1;
					led_display();
					goto TEST_RST_29;
				}
				
				/* 防溢电极碰地三次 */
				
				beep_test = 0;
				clear_timer();
				temp = 0;
				while ((beep_test == 0) && (0 == temp))
				{
					DA2 = 1;
					_delay_ms(100);
					DA2 = 0;
					_delay_ms(100);
					if (second > 5)	//超时报错2:进不了快检状态
					{
						error = (1<<1);
						temp = 1;
					}
				}
				if (0 == error)	//正常亮绿灯2
				{
					green1 &= ~(1<<1);
					led_display();
				}
				else	//亮红灯2,停止检测
				{
					red1 &= ~error;
					BEEP = 1;
					led_display();
					goto TEST_RST_29;
				}
				
				/* 手动按下选择键,选择五谷豆浆,再按确定键,嘟1下,五谷指标灯亮 */
				
				DA2 = 1;
				clear_timer();
				red1_back = red1;
				flash_t = 1;
				while (0 == second); //等待手动操作
				clear_timer();
				temp = 0;
				beep_test = 0;
				while ((0 == beep_test) && (0 == temp))
				{
					if (second > 20)	//超时报错3:员工没选择功能
					{
						error = (1<<2);
						temp = 1;
					}
				}
				flash_t = 0;
				red1 = red1_back;
				if (0 == error)	//正常亮绿灯3
				{
					green1 &= ~(1<<2);
					led_display();
				}
				else	//亮红灯3,停止检测
				{
					red1 &= ~error;
					BEEP = 1;
					led_display();
					goto TEST_RST_29;
				}
				
				/* 全功率加热 */
				
				clear_timer();
				temp = 0;
				while ( ((0 == AD1_R) || (0 == AD3_R)) && (0 == temp) )
				{
					if (second > 10)	//超时报错4:不加热
					{
						error = (1<<3);
						temp = 1;
					}
				}
				if (0 == error)	//正常亮绿灯4
				{
					green1 &= ~(1<<3);
					led_display();
				}
				else	//亮红灯4,停止检测
				{
					red1 &= ~error;
					BEEP = 1;
					led_display();
					goto TEST_RST_29;
				}
				
				/* 温度到90c,停止加热,嘟两下 */
				
				OCR1C = TEMP91C;	//温度
				clear_timer();
				temp = 0;
				beep_test = 0;
				while ((0 == beep_test) && (0 == temp))
				{
					if (second > 5)	//超时报错5:温度检测错误
					{
						error = (1<<4);
						temp = 1;
					}
				}
				while ((1 == AD1_R) && (0 == temp))
				{
					if (second > 5)	//超时报错5:温度检测错误
					{
						error = (1<<4);
						temp = 1;
					}
				}
				if (0 == error)	//正常亮绿灯5
				{
					green1 &= ~(1<<4);
					led_display();
				}
				else	//亮红灯5,停止检测
				{
					red1 &= ~error;
					BEEP = 1;
					led_display();
					goto TEST_RST_29;
				}
				
				/* 1秒后预备打浆1次0.5秒 */
			
				clear_timer();
				temp = 0;
				while ((0 == AD2_R) && (0 == temp))
				{
					if (second > 5)	//超时报错6:不打浆
					{
						error = (1<<5);
						temp = 1;
					}
				}
				if (0 == error)	//正常亮绿灯6
				{
					green1 &= ~(1<<5);
					led_display();
				}
				else	//亮红灯6,停止检测
				{
					red1 &= ~error;
					BEEP = 1;
					led_display();
					goto TEST_RST_29;
				}
				
				/* 温度到90c后再加热3秒 */
				/* 打浆2次4秒,中间间隔1.5秒全功率加热 */
			
				clear_timer();
				while (second < 12);
				
				/* 全功率加热碰防溢电极 */
				
				DA2 = 0;
				
				/* 停止加热4秒 */
				
				clear_timer();
				temp = 0;
				while ( ( (1 == AD1_R) || (1 == AD2_R) ) && (0 == temp) )
				{
					if (second > 10)	//超时报错7:无法停止加热
					{
						error = (1<<6);
						temp = 1;
					}
				}
				if (0 == error)	//正常亮绿灯7
				{
					green1 &= ~(1<<6);
					led_display();
				}
				else	//亮红灯7,停止检测
				{
					red1 &= ~error;
					BEEP = 1;
					led_display();
					goto TEST_RST_29;
				}
				
				/* 半功率搅浆启动0.5秒 */
				
				clear_timer();
				temp = 0;
				while (( (0 == AD2_R) || (1 == AD3_R) ) && (0 == temp))
				{
					if (second > 10)	//超时报错8:不搅浆
					{
						error = (1<<7);
						temp = 1;
					}
				}
				if (0 == error)	//正常亮绿灯8
				{
					green1 &= ~(1<<7);
					led_display();
				}
				else	//亮红灯8,停止检测
				{
					red1 &= ~error;
					BEEP = 1;
					led_display();
					goto TEST_RST_29;
				}
			
				/* 打浆3次5秒,中间间隔1.5秒半功率加热 */
				/* 半功率加热再次碰防溢电极 */
				/* 半功率熬煮20秒 */
				/* 声光报警 */
				/* 自动测试通过 */
				
				red1 = 0xFF;
				red2 = 0xFF;
				green1 = 0x00;
				green2 = 0x00;
				led_display();
				K8 = 0;				//目标板断电
				K7 = 0;
				K3 = 0;
				OCR1C = TEMP25C;	//温度25C
				DA2 = 0;			//防溢电极
				DA1 = 0;			//低水位电极
				EIMSK = 0;
				EIFR = 255;
			}
			else  if (0x02 == key_temp)	//beep off
			{
				BEEP = 0;
			}
			else
			{
				led_display();
			}
		}
	}
	else if (M_19_01 == model)
	{
TEST_RST_19:
		EIMSK = 0;
		EIFR = 255;
		K4 = 0;
		K5 = 0;
		K8 = 0;
		PORTF &= 0xF0;
		DDRF = 0x0F;	//AD1-AD4改为输出
		while (1)
		{
			/*高压部份:	VIN1 = DJ电机,VIN2 = RG发热管
			  K4 & K5 = 目标板高压开关,K8 = 目标板低压开关
			  数字信号:	AD1 = RG发热管,AD2 = DJ电机,AD3 = 半功率,AD4 = 蜂鸣器,AD5_R = +5VIN */
			key_temp = 0;
			while (0 == key_temp)
			{
				key_temp = scan_key();
			}
			if (0x01 == key_temp)	//start test
			{
				unsigned char i;
				
				BEEP = 0;
				error = 0;
				led_init();
				_delay_ms(100);
				
				/* 向目标板供电 */
				
				K4 = 1;
				K5 = 1;
				K8 = 1;	//向目标板供电
				for(i=0;i<5;i++)

⌨️ 快捷键说明

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