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

📄 camel.c

📁 一个出口非洲的骑骆驼机器人的控制程序。采用工业手机模块作为通讯模块;AVR单片机作为控制中心;工业用马达作为骆驼机器人驱动动力。通过控制中心通过AT指令集连接通讯模块
💻 C
📖 第 1 页 / 共 2 页
字号:
{    
  	//SpeakerToMan();       //切换到人机直接扬声模式	
}

void voiceRecord(void)
{    
  	//SpeakerToMan();       //切换到人机直接扬声模式
  	speakerRecInitSet=0;
  	
}

//关闭声音,电机,但是机器人还是属于受控状态
void stopAll(void)
{  
    MotorStop();
	//SpeakerSignalDown();
}


//测试手机状态,保证系统能够进入
void GSMConnect(void)
{
	uchar connectCounter;
	//上电后软件开机
	GSMPressOn();
	//延时一段时间
	GSMTimerCounter=0;
	while(GSMTimerCounter<10)
	{
		GSMtemp++;
	}
	GSMPressOff();

	//statusLedOn();
	//延时一段时间,等待系统稳定
	GSMTimerCounter=0;
	while(GSMTimerCounter<100)
	{
		GSMtemp++;
	}

	//statusLedOff();
	

	//测试AT通讯是否正常
	//首先清掉串口接收的数据
	connectCounter=5;
	while(connectCounter--)
	{
		for(GSMtemp=0;GSMtemp<100;GSMtemp++)
		{
			GSMReceiveTemp[GSMtemp]=0;
		}
		//首先清除掉所有的数据
		receiveData(GSMReceiveTemp,100);
		//发送一个测试字符串
		sendData(GSMATConnectTest,4);
		//延时一段时间
		GSMTimerCounter=0;
		while(GSMTimerCounter<2)
		{
			GSMtemp++;
		}
		for(GSMtemp=0;GSMtemp<100;GSMtemp++)
		{
			GSMReceiveTemp[GSMtemp]=0;
		}
		receiveData(GSMReceiveTemp,100);
		if((GSMReceiveTemp[5]=='O')&&(GSMReceiveTemp[6]=='K'))
		{
			//能够正常通讯
			break;
		}
	}
	

	//设置系统为自动接听
	connectCounter=5;
	while(connectCounter--)
	{
		for(GSMtemp=0;GSMtemp<100;GSMtemp++)
		{
			GSMReceiveTemp[GSMtemp]=0;
		}		
		//首先清除掉所有的数据
		receiveData(GSMReceiveTemp,100);
		//发送一个测试字符串
		sendData(GSMATAcceceptMode,8);
		//延时一段时间
		GSMTimerCounter=0;
		while(GSMTimerCounter<2)
		{
			GSMtemp++;
		}
		for(GSMtemp=0;GSMtemp<100;GSMtemp++)
		{
			GSMReceiveTemp[GSMtemp]=0;
		}		
		receiveData(GSMReceiveTemp,100);
		if((GSMReceiveTemp[9]=='O')&&(GSMReceiveTemp[10]=='K'))
		{
			//成功设置自动接听
			break;
		}
	}
		//test
	//statusLedOn();

}

//测试GSM模块是否已经在线
void GSMConnectTest(void)
{
	uchar GSMConnectTestBuffer[100];
	uchar connectTestTemp=0;
	//发送一个测试字符串
	sendData(GSMATOnLineTest,9);
	//延时一段时间
	GSMTimerCounter=0;
	while(GSMTimerCounter<2)
	{
		GSMtemp++;
	}
	for(connectTestTemp=0;connectTestTemp<100;connectTestTemp++)
	{
		GSMConnectTestBuffer[connectTestTemp]=0;
	}
	receiveData(GSMConnectTestBuffer,100);
	if(GSMConnectTestBuffer[17]=='4')
	{
		//正常在线状态
		GSMTalkingFlag=GSMTalkingYes;
	}
	else 
	{
		//离线状态
		GSMTalkingFlag=GSMTalkingNo;
	}
}
	

//call this routine to initialise all peripherals
void init_devices(void)
{
	//stop errant interrupts until set up
	clear_interrupt(); //disable all interrupts
////////////////////硬件端口定义//////////////////////////////////////////////////////////////////////////////
//			0			1			2			3			4			5			6			7			//
//----------------------------------------------------------------------------------------------------------//
//PORTA		X			X			X			A1			A2			A3			A4			RING		//
//			0			0			0			1			1			1			1			0			//
//DDRA		0			0			0			0			0			0			0			1			//
//----------------------------------------------------------------------------------------------------------//
//PORTB		X			X			X			X			X			X			SPEAKER		MOTO		//
//			0			0			0			0			0			0			0			0			//
//DDRB		0			0			0			0			0			0			1			1			//
//----------------------------------------------------------------------------------------------------------//
//PORTC		X			X			X			X			X			X			RINGCHECK	KEYCHECK	//
//			0			0			0			0			0			0			1			1			//
//DDRC		1			1			1			1			1			1			0			0			//
//----------------------------------------------------------------------------------------------------------//
//PORTD		X			X			X			X			X			X			X			X			//
//			0			0			0			0			0			0			0			0			//
//DDRC		0			0			0			0			0			0			0			0			//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
	DDRD=0x00;
	PORTD=0xFF;
	//按键键值检测端口
	DDRC &=0xF0;
	PORTC |=0x0F;
	//按键中断端口
	DDRD &=0xEF;
	PORTD |=0x10;
	//指示灯端口
	DDRC |=1<<4;
	PORTC |=1<<4;
	//开机控制端口
	DDRC |=1<<5;
	PORTC |=1<<5;
	//马达控制端口
	DDRD |=1<<5;
	PORTD |=1<<5;
	//喇叭控制接口
	DDRB |=0x3E;
	PORTB |=0x3E;


	//定时T1初始化,100ms
	TCCR1B = 0x00; //stop
	TCNT1H = 0xCF; //setup
	TCNT1L = 0x2C;
	OCR1AH = 0x30;
	OCR1AL = 0xD4;
	OCR1BH = 0x30;
	OCR1BL = 0xD4;
	ICR1H  = 0x30;
	ICR1L  = 0xD4;
	TCCR1A = 0x00;
	TCCR1B = 0x03; //start Timer
	TIMSK  = 0x04;//中断允许


	//串口通信初始化
	 UCSRB = 0x00; //disable while setting baud rate
	 UCSRA = 0x00;
	 UCSRC = (1<<URSEL) | 0x06;
	 UBRRL = 0x33; //set baud rate lo
	 UBRRH = 0x00; //set baud rate hi
	 UCSRB = 0xD8;


	//MCUCR = 0x03;
	//GICR  = 0x40;s
	MCUCR = 0x00;
	GICR  = 0x00;

	set_interrupt(); //re-enable interrupts
	//all peripherals are now initialised

}





//===========================================================//
//===========================================================//
int main(void)
{  
	init_devices();
	//sendData(GSMATConnectTest,4);
	
	//UDR=0x55;
	//while(1);
	
	//test
	//statusLedOn();

	//test
	statusLedOn();
	//连接模块
	GSMConnect();

	//test
	statusLedOff();

	//控制数据初始化
	KeyFlag=0;
	
	//初始化定时计数
	GSMTalkingCounter=0;
	
	/////////////////////////////////////////////////////////////////
	while(1)
	{
		SpeakerPlay();
		SpeakerRec();
	
		//检查系统是否正常运作
		//周期检查是否处于通话状态
	  	if(GSMTalkingCounter>50)
	  	{
			GSMTalkingCounter=0;

			//检查系统是否处于通话状态
			GSMConnectTest();
			if(GSMTalkingFlag==GSMTalkingYes)
			{statusLedOn();}
			else 
			{statusLedOff();}

			//测试AT通讯是否正常
			for(GSMtemp=0;GSMtemp<100;GSMtemp++)
			{
				GSMReceiveTemp[GSMtemp]=0;
			}
			//首先清除掉所有的数据
			receiveData(GSMReceiveTemp,100);
			//发送一个测试字符串
			sendData(GSMATConnectTest,4);
			//延时一段时间
			GSMTimerCounter=0;
			while(GSMTimerCounter<2)
			{
				GSMtemp++;
			}
			for(GSMtemp=0;GSMtemp<100;GSMtemp++)
			{
				GSMReceiveTemp[GSMtemp]=0;
			}
			receiveData(GSMReceiveTemp,100);
			//不能够能够正常通讯
			//重新启动系统
			if((GSMReceiveTemp[5]!='O')&&(GSMReceiveTemp[6]!='K'))
			{
				//连接模块
				GSMConnect();				
			}
		}
		



		//检查是否有按键按下
		checkKey();
		if(KeyFlag>0)
		{
			//检测是否在线
			//GSMConnectTest();
			if(GSMTalkingFlag==GSMTalkingYes)
			{
				//动作控制状态
				switch(KeyNum)
				{
					//按一下键甩打一下皮鞭
					case 1:
						hit1();                 	
						break;
					//按一下键甩打几下皮鞭
					case 2:
						hit2();                 	
						break;
					case 3: 
						break;
					//按一下键播一下声音
					case 4:
						voice1();               	
						break;
					//按一下键连续播出录音芯片的声音
					case 5:
											     	
						break;
					//远程放声
					case 6:
						voice3();               	
						break;
					//关闭电机,扬声器,但是机器人仍然受控
					case 9:
					    stopAll();               	
						break;
					//修改密码
					case 10:
						
						break;
					case 11:
									           		//修改密码
						break;	
					//录音
					case 12:
						voiceRecord();			           		
						break;
							
					default:
						break;
				}
			}
			KeyFlag=0;
		}		 
	}
	return 0;
}




⌨️ 快捷键说明

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