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

📄 main.c

📁 本人用avr 单片机atmega128开发控制产品的源码。
💻 C
字号:
#include <iom128v.h>
#include <control.h>
#include <lcd.h>
#include <macros.h>
#include <qam.h>
#include <sensor.h>

//define  interrupt vector
#pragma interrupt_handler timer1:15 
#pragma interrupt_handler tx_interrupt:33
#pragma interrupt_handler rx_interrupt:31

const unsigned char net_password[6]={0x55,0x33,0xaa,0x66,0x88,0x99};
unsigned char menu_password[6];
unsigned char power_password[6]={3,3,3,2,2,2};
unsigned char sound_swtich[4]={1,1,1,1};
unsigned char w3100_shar[6]={0x01,0x09,0x09,0x06,0x06,0x06};
unsigned char net_gatway[4];
unsigned char net_sub[4];
unsigned char net_lip[4];
unsigned char net_dip[4];
unsigned char qam_num[8];
//I2c read and write address
unsigned char rd_device_add;
unsigned char wr_device_add;

unsigned char key_status,key_time_start,key_time_value;
unsigned char time_1val,key_50ms,time_50ms,time_5s,T_5s,time_3mval,time_2val;
unsigned char T_20s,T_2s,time_20sval;
unsigned char T_30s,time_30s;
unsigned char T_1s=1;
unsigned char time_1s=0;
unsigned char T_15s=0;
unsigned char time_15s=0;
unsigned char time_20ms=0;
unsigned char over_time=0;
unsigned char disp_status=0;
unsigned char memu_operation=0;
unsigned char password_ok;
unsigned char net_password_ok=0; 
unsigned char password_check_count=0;
unsigned char have_connect=0;
unsigned char bCurserOn;
unsigned char power_on,power_off; ///power off used
unsigned char power_on_flg=0;
unsigned char powre_off_flg=0;
unsigned char rst_power_off=0;
unsigned char to_power_off=0;
unsigned char restart,rst_flg;
unsigned char time[7];
unsigned char ucMenuLayer=0;	 	//菜单级别
unsigned char ucMenuPosition=1;     //主菜单纵向位置
unsigned char ucCurserPosition=1;   //光标当前位置
unsigned char ucMenuCurrentPosition=1;     //二级子菜单横向位置
unsigned char ucsubMenuCurrentPosition=1;  //子菜单当前位置
unsigned char soundMenuPosition=1;
unsigned char qam_ch_position=0;
unsigned char sens_ch_position=0;
unsigned char vol_ch_position=0;
unsigned int com_set;
unsigned char qam_set=0;
unsigned char net_show=0;
unsigned char password_check=0;	
unsigned char led_status=0;
unsigned char led_count=0;
unsigned char ask_server_timer,self_check_flag,time_ack,sever_restore,serv_trl;
unsigned char server_start=0;
unsigned char temperature_alarm=0;
unsigned char vol1_high;
unsigned char vol1_low;
unsigned char vol2_high;
unsigned char vol2_low;
unsigned char vol3_high;
unsigned char vol3_low;
unsigned char vcc_high;
unsigned char vcc_low;
unsigned char  temp_alarm[3],temp_alarm1[3];
unsigned char temperature_h[2],temperature_l[2]; 
unsigned char qam_ch,center_frequency,qammode;
unsigned int iSmbRat;
unsigned int  iSmbRatSaved[8];
unsigned char ucMenuQModSubPosition[8],ucMenuIFSubPosition[8];
unsigned char tem_ch,vol_ch,spk_on;
unsigned char sound_type_saved,baud_saved;
unsigned char  sound_swtich_saved[4];
unsigned char hour_saved,mint_saved;
unsigned char key_temp;
unsigned char power_to_off;
unsigned char reset=0;
unsigned char sys_init=0;
unsigned int rst_time=0;
unsigned char restart=0;
unsigned char power_up=0x5a;
unsigned int VOL_H_valsaved[4],TEMP_H_valsaved[2];
unsigned int VOL_L_valsaved[4],TEMP_L_valsaved[2];
unsigned char check_status[];
unsigned char send_data[100],net_send_data[256];
unsigned char com_rx_buf[256],com_tx_buf[256];
unsigned char net_rx_buf[256],net_tx_buf[256];
unsigned char net_Rxout,net_Txout,net_Txin,net_Rxin;
unsigned char com_data,rece_ack;
unsigned char net_serv_conv_len,net_serv_conv;
unsigned char com_Rxin,com_Rxout,com_Txin,com_Txout; 
unsigned char com_tx_empty,net_tx_empty;
unsigned char net_serv_conv=0;
unsigned char net_serv_conv_len=0;
unsigned char have_check=0;
//---------------------------------------------------------
// NAME:	port_init()
// ENTRY:	void
// RETURN:  void
// FUNCTION:单片机端口初始化
// MODIFY DATE :	2004.1.28
//--------------------------------------------------------
void port_init(void)
{	
	DDRA  = 0xff; 
	PORTA = 0xff;
	DDRB  = 0xff;
	PORTB = 0xff;
	DDRD = 0xff;
	PORTD = 0xff;
	DDRE  = 0x8c;
	PORTE = 0x00;
	DDRF  = 0x0f;
	PORTF = 0x0f;
	DDRG  = 0x1f;
	PORTG = 0x1f; 
}
//---------------------------------------------------------
// NAME:	init_config()
// ENTRY:	void
// RETURN:  void
// FUNCTION:初始化参数
// MODIFY DATE :	2004.1.28
//--------------------------------------------------------
void init_config(void)
{
	unsigned char i;
	if(read_eeprom(0x0010)==0x5a)
	{
		//read the sound  the type 
		sound_type_saved=read_eeprom(0x0052);    
		for(i=0;i<4;i++)
		{   	  
			sound_swtich[i]=read_eeprom(0x005A+i );
		}
		//read the menupassword 
		//init the password
		for(i=0;i<6;i++)
		{
			menu_password[i]=read_eeprom(0x0060+i);		 
		}
	}
	else
	{
		//init the password
		menu_password[0]=3;
		menu_password[1]=2;
		menu_password[2]=3;
		menu_password[3]=2;
		menu_password[4]=3;
		menu_password[5]=2;
		for(i=0;i<6;i++)
		{ 
			write_eeprom(0x0060+i,menu_password[i]);
		}
	}
}
//---------------------------------------------------------
// NAME:	fresh_config()
// ENTRY:	void
// RETURN:  void
// FUNCTION:初始化参数
// MODIFY DATE :	2004.1.28
//--------------------------------------------------------
void fresh_config(void)
{
	//init the uart1
	if(com_set==9600)
	{
		UBRR1L=0x47;	   	    /*set baud rate,11.0592MHZ ,9600B/S*/
		UBRR1H=0x00;
		UCSR1B=0xd8;           /*Enable receiver and transmiter*/
		UCSR1C=0x06;           /*8 data bit,1 stop bit*/
	}
	else 
	{
		UBRR1L=0x8f;	   	    /*set baud rate,11.0592MHZ ,4800B/S*/
		UBRR1H=0x00;
		UCSR1B=0xd8;           /*Enable receiver and transmiter*/
		UCSR1C=0x06;           /*8 data bit,1 stop bit*/
	}
}
//---------------------------------------------------------
// NAME:	ENABLE_XM()
// ENTRY:	void
// RETURN:  void
// FUNCTION:使能外部寻址操作
// MODIFY DATE :	2004.1.28
//--------------------------------------------------------
void ENABLE_XM(void)		
{
	MCUCR|=0X80;
	XMCRA=0X0e;
	XMCRB=0X87;
}
//---------------------------------------------------------
// NAME:	DISABLE_XM()
// ENTRY:	void
// RETURN:  void
// FUNCTION:禁止使能外部寻址操作
// MODIFY DATE :	2004.1.28
//--------------------------------------------------------
void DISABLE_XM(void)		//disable the extern sram
{
	MCUCR=0X00;
	XMCRA=0X0e;
	XMCRB=0X87;
}
//---------------------------------------------------------
// NAME:	power_on_check()
// ENTRY:	void
// RETURN:  void
// FUNCTION:上电检测
// MODIFY DATE :	2004.1.28
//--------------------------------------------------------
void power_on_check(void)
{
	unsigned char temp;
	power_on_flg=PINC&0X02;
	if(power_on_flg)  
	{
		power_on=1;
		PORTE|=0X80;			   //LED_PORT=1;
		return;
	}
	SHOW_LOGO(17);
	SREG|=0x80;  
	ENABLE_XM( );  
	temp= key_scan( );
	while(temp!= KEY_POWER )
	{	    
		temp= key_scan( );
		W3100A_connect();
		if(have_connect)
		{
			write_eeprom(0x0200,0);
			net_client_receive();
		}	   
		if(power_on)    break;
	}
	DISABLE_XM( );
	WDR();
	delayms(200);  
	if(temp==KEY_POWER)
		OnKeyPower( );
	PORTE|=0X80;			   //LED_PORT=1;
}
//---------------------------------------------------------
// NAME:	init()
// ENTRY:	void
// RETURN:  void
// FUNCTION:初始化单片机及变量
// MODIFY DATE :	2004.1.28
//--------------------------------------------------------
void init(void)
{ 
	unsigned char i;
	//init I2c
	TWBR=32;
	TWSR=00;
	//init the port
	port_init();
	//init and clear Lcd 
	LCD_INIT();  
	LCD_CLR();
	//init the midi
	midi_RST();
	midi_init();
	//init the ds1302
	if(read_eeprom(0x0010)!=0x5a)
	{
		DS1302_init( );
	}
	//read the sound and menupassword 
	init_config();
	Eeprom_Init();
	//fresh the device configration
	fresh_config();
	//INIT nET
	DDRE |= 0x0c;
	PORTE|=0X04;
	delayms(14);  
	PORTE&=~0X04; 
	ENABLE_XM();
	w3100a_open();
	write_eeprom(0x0200,0x55);
	DISABLE_XM( );	
	//init the timer1
	
	TCCR1B=0X00;            // Stop Timer1
	TCNT1H = 0x00;          // Clear Timer1
	TCNT1L = 0x00;          
	TCNT1L=0x9a;
	TCNT1H=0xfa;
	TIMSK=0x04;             //开放T1溢出中断
	TCCR1B=0x02;
	//init the wdog
	WDTCR=0X18;          /*open the wdog gate*/
	WDTCR=0X1e;          /*set the wdog 1s*/
	WDR();                        /*clear the wdog*/
	//init the varible
	key_status=0;
	power_on=0;
	power_off=0;
	rece_ack=0;
	restart=0;
	baud_saved=1;
	qam_ch_position=0;  
	
	VOL_H_valsaved[0]=350;
	VOL_H_valsaved[1]=530;
	VOL_H_valsaved[2]=180;
	VOL_H_valsaved[3]=1205;
	VOL_L_valsaved[0]=300;
	VOL_L_valsaved[1]=500;
	VOL_L_valsaved[2]=130;
	VOL_L_valsaved[3]=1180;
	//timer varible
	rst_flg=0;
	serv_trl=0;
	ask_server_timer=0;
	sever_restore=0;
	time_1val=0;
	time_3mval=0;
	//uart
	com_Rxin=0;
	com_Rxout=0;
	com_Txin=0;
	com_Txout=0;
	com_tx_empty = 1;
	//net
	net_Rxin=0;
	net_Rxout=0;
	net_Txin=0;
	net_Txout=0;
	net_tx_empty = 1;
	//sensor
	for(i=0;i<3;i++)
	{
		temp_alarm[i]=0;
		temp_alarm1[i]=0;
	}  
	//qam online flag
	for(i=0;i<8;i++)
		qam_num[i]=0;
	//init the display
	SHOW_LOGO(0);   
	delayms(5000);   
	WDR();
	sys_init=1;
	SREG|=0x80;
}
//---------------------------------------------------------
// NAME:	main()
// ENTRY:	void
// RETURN:  void
// FUNCTION:系统主程序
// MODIFY DATE :	2004.1.28
//--------------------------------------------------------
void main(void)
{
  /*        
	DDRC |= 0x3C;
	//turn on power of the scsi hard disk 
	PORTC	&= ~0x10;
	PORTC	&= ~0x04;
	PORTC	|= 0x10;
	PORTC	&= ~0x10;
	PORTC	|= 0X10;	
	*/
	init( );
	power_on_check();   
	SHOW_LOGO(41); 			//BVCOM 反黑     
	delayms(3000);                //wait for the power on
	spk_power_on();  
	SHOW_LOGO(54);
	delayms(3000); 
	SHOW_LOGO(55);
	delayms(3); 
	SHOW_LOGO(56);   
	sys_check();	
	delayms(3);
	SHOW_LOGO(28);
	while(1)
	{
		//polling the key and the display
		if(restart&&power_on)
		{	       	 
			init( );
			power_on_check();   
			SHOW_LOGO(41); 			//BVCOM 反黑     
			delayms(3000);                //wait for the power on
			spk_power_on();  
			SHOW_LOGO(54);
			delayms(3000); 
			SHOW_LOGO(55);
			delayms(3000); 
			SHOW_LOGO(56);   
			sys_check();	
			delayms(3000);
			SHOW_LOGO(28);    			  
		}
		WDR();
		set_show();
		polling( );		
		WDR(); 
		//fresh the  display (time/temperature/voltage )
		if(T_1s&&(!password_ok )&&(!ucMenuLayer)&&power_on)
		{
			if(!rst_flg)
			{
				disp_on_time();
				T_1s=0;
			}			 
		}
	}
}
//---------------------------------------------------------
// NAME:	timer1()
// ENTRY:	void
// RETURN:  void
// FUNCTION:定时器程序,定时1ms
// MODIFY DATE :	2004.1.28
//--------------------------------------------------------
void timer1(void)     //1ms soft interrupt
{
	unsigned char key_temp1;
	//重装定时常数
	TCNT1=0xfa9a;     
	//键盘扫描
	DDRC|=0X80;
	PORTC&=~0X80;
	DDRA=0X00;
	delayus(10);
	key_status  = PINA;
	PORTC|=0X80;
	DDRA=0XFF;        
	if((key_status!=0xff)&&(time_20ms==0))    key_temp=key_status; 
	if((key_status!=0xff)&&(time_20ms<80))   
	{ 
		key_temp1=key_status; 
		time_20ms++;
		if(key_temp1!=key_temp)
		{
			key_status=0xff;	    
			time_20ms=0;
		}
	}
	//定时时间参数
	if( time_50ms>0 )		time_50ms--;
	else
	{	
		time_50ms	= 65;
		key_50ms	= 1;
		if( time_1s>0 )  time_1s--;
		else
		{                   
			T_1s=1;
			time_1s = 10;
			if( time_5s>=5)  
			{
				T_5s=1;
				time_5s=0;
			}
			else
				time_5s ++;
			if( time_15s>=20)  
			{
				T_15s=1;
				time_15s=0;
			}
			else
			{
				if(memu_operation&&power_on)
					time_15s ++;
			}            
			if( time_30s>=40)  
			{
				T_30s=1;
				time_30s=0;
			}
			else
				time_30s ++;                               
			if(server_start&&power_on)
				ask_server_timer++;
			else    
				ask_server_timer=0;
			if(ask_server_timer>40)			  
			{
				reset=0;
				rst_flg=0;
				ask_server_timer=0;
				server_start=0;
				serv_trl=0;			
			}				
			else	
			{
				if(ask_server_timer>=35)   
				{
					reset=1;
				}  		
				else
					if(ask_server_timer>30)   
					{
						serv_trl=1;
					}
			}		 																													
			if( key_time_start )
				key_time_value++;      					                     
		}
	}
}
//---------------------------------------------------------
// NAME:	rx_interrupt()
// ENTRY:	void
// RETURN:    void
// FUNCTION:串口接收中断子程序
// MODIFY DATE :	2004.1.28
//--------------------------------------------------------
void rx_interrupt(void)
{
	WDR();     
	SREG&=~0X80;
	com_rx_buf[com_Rxin] = UDR1;
	com_Rxin++;
	com_Rxin &= DATA_LEN;
	SREG|=0X80;
}
//---------------------------------------------------------
// NAME:	tx_interrupt()
// ENTRY:	void
// RETURN:    void
// FUNCTION:串口发送中断子程序
// MODIFY DATE :	2004.1.28
//--------------------------------------------------------
void tx_interrupt(void)
{
	if( com_Txout!=com_Txin )
	{
		com_tx_empty = 0;				//send char exist,set the busy flag
		UDR1 = com_tx_buf[com_Txout];	
		com_Txout++;	
	}
	else
		com_tx_empty = 1;  			  //send char have send,set the empty flag
}

⌨️ 快捷键说明

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