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

📄 app.c

📁 易于atmage128和ucos的手动机器人控制程序。
💻 C
📖 第 1 页 / 共 4 页
字号:
	hand_whe[0]=0;
	hand_whe[1]=0;
	hand_whe[2]=0;
	hand_whe[3]=0;
	
    while (1) {
	  if(time_left>0)			 					  //如果时间还未到
	  {
	    time_left   =180-(OSTimeGet()-time_count_start)/50; //剩余时间值 秒
		time_led_100 =(time_left/60)|0x0200;				 //分位
		time_led_10	 =(time_left%60/10)|0x0300;			 //秒10位
		time_led_1	 =(time_left%60%10)|0x0400;			 //秒个位
        LED_send_16b(time_led_100);
		LED_send_16b(time_led_10);
		LED_send_16b(time_led_1);
	  }
        OSTimeDly(OS_TICKS_PER_SEC/10);
    }
}

/*
*********************************************************************************************************
*                                            SETUP THE I/Os  T/Cs
*********************************************************************************************************
*/

static void IO_Init (void)
{
 	DDRA		=0x3f;                                //PA6 PA7 行程开关输入
	PORTA		=0xff;
	DDRB		=0xff;    							  //B端口输出
	PORTB		=0x00;   							  //B端口输出0
	DDRC		=0x3f;								  //PC6 PC7  行程开关输入
	PORTC		=0x00;
	DDRD		=0X71;   							  //D  0 1 输出 0111 0001
	PORTD		=0x00;
	DDRE		=0xff;   		 					  //0100 0000
	PORTE		=0x00;
	DDRF		=0xff;
	PORTF		=0x00;
	DDRG		=0xff;
	PORTG		=0xff;
}
void Init_TC(void)
{ 
  	  TIMSK		  =0x01;    						  //01000000 T/c2 溢出中断开  Enable TIMER0 overflow interrupt
	  
//T/C0 控制系统时钟---------------------------
	   
	  TCCR0 = 0x02;                                   // Set TIMER0 prescaler to CLK/1024 
	  
//提升电机调速 T/C1 OC1A B C -----------------

	 TCCR1A		  =0x0b;                              //1010 1011 10位快速pwm  向上置位?
	 TCCR1B		  =0x01;    						  //0000 0010  8分频
	 TCCR1C		  =0x00;
	 OCR1A		  =0x0000;
	 OCR1B		  =0x0000;
	 OCR1C		  =0x0000;
	 
//控制舵机 T/C2 计数 ----------------------------------------
/*
	 TCCR2		  =0x02;                              //00000010
	 TCNT2		  =0x06;
	 */
//中右左电机调速 T/C3 OC1A B C 分别用于地盘-----------------

	 TCCR3A		  =0xab;                              //1010 1011 10位快速pwm  向上置位?
	 TCCR3B		  =0x01;    						  //0000 0010  8分频
	 TCCR3C		  =0x00;
	 OCR3A		  =0x0000;
	 OCR3B		  =0x0000;
	 OCR3C		  =0x0000;	 

}

/*
*********************************************************************************************************
*                                        SETUP THE TICK RATE
*********************************************************************************************************
*/



void  OSTickISR_Handler (void)
{

	time_count++;
	
	
	 if(time_count==hand_cy[0]) PORTC&=~(1<<0);	  //矩形波变化 手抓1
	 if(time_count==hand_cy[1]) PORTC&=~(1<<1);	  //手抓2
	 if(time_count==hand_cy[2]) PORTC&=~(1<<2);	  //手抓3
	 if(time_count==hand_cy[3]) PORTC&=~(1<<3);	  //手抓4
	
	 if(time_count==80)    							  //   1=0.23ms    86=20ms   9=2ms     2右患  10左极
	 {  
	   PORTC|=0x0f;
	   OSTimeTick();
	   time_count=0;   
	  }

}
/*
*********************************************************************************************************
*                                       EEPROM 操作部分
*********************************************************************************************************
*/
void data_save()
{
     if(data_ptr<0x0ffe)
	 {
 	    EEPROMwrite(data_ptr,rx_chr_b[1][1]);		      //存储第2个字
	 	data_ptr++;
	 }
	 if(data_ptr<0x0ffe)
	 {
	     EEPROMwrite(data_ptr,rx_chr_b[2][1]);		 	  //存储第3个字
	 	 data_ptr++;
	 }	 
}

void data_read()
{
 	 INT8U i;			 	 	  //上次键值
	 if(data_ptr<0x0ffe)
	 {
	     rx_chr_b[1][0]=rx_chr_b[1][1];
	     rx_chr_b[1][1]=EEPROMread(data_ptr);
		 if(rx_chr_b[1][1]==0xff) rx_chr_b[1][1]=0x00;   //EPPROM ff填充值 不可用
	 	 data_ptr++;
	 }
	 else rx_chr_b[1][1]=0x00;
	 
	 if(data_ptr<0x0ffe)
	 {
	    rx_chr_b[2][0]=rx_chr_b[2][1];			 	 	  //上次键值
	    rx_chr_b[2][1]=EEPROMread(data_ptr);
		if(rx_chr_b[2][1]==0xff) rx_chr_b[2][1]=0x00;	  //EPPROM ff填充值 不可用
	    data_ptr++;
	}
	else rx_chr_b[2][1]=0x00;
	 
	 for(i=0;i<8;i++)  				 			  
	 {
	  	 if((i!=0)&&(i!=5))						  	  //第0 第5为控制键 保护
		{
			rx_chr[1][i][0]=rx_chr[1][i][1];	 	  //第二个字节的第i个字 存储上次值,1 5为控制位 保护
	  	 	if(rx_chr_b[1][1]&(1<<i)) rx_chr[1][i][1]=1;
		 	else rx_chr[1][i][1]=0;
		 }
		 
		 rx_chr[2][i][0]=rx_chr[2][i][1];		 	  //第三个字节的第i个字存储上次值
	  	 if(rx_chr_b[2][1]&(1<<i)) rx_chr[2][i][1]=1;
		 else rx_chr[2][i][1]=0;
		 
	 }
	 
}




/*
*********************************************************************************************************
*                                        LED 显示部分
*********************************************************************************************************
*/
  																	
void LED_send_16b(INT16U LED_message)	              //向LED发送一个16bit数据,高位开始
{	

	INT8U clear;
	PORTB&=0xfe;		 							  //使能开
	SPDR=(LED_message>>8)&0x00ff; 					  //传输高8位
	while(!(SPSR&0x80)){;}							  //等待
	clear=SPSR;			  							  //清除标志
	clear=SPDR;
	SPDR=LED_message&0x00ff;						  //传输低8位
	while(!(SPSR&0x80)){;} 							  //等待
	clear=SPSR;			   							  //清除标志
	clear=SPDR;		   	   			   
	PORTB|=0x01;		 							  //使能关
}


void intit_LED()							  		  //LED初始化
{
    SPCR=0x50;    							  		  //0101 0000 SPI使能 高位先行 00模式 主机模式 4分频  
	LED_send_16b(0x0c01); 					  		  //1 1 0 0 0000 0001  掉电控制 正常模式
	LED_send_16b(0x09ff); 					  		  //1 0 0 1   0000 1 1 1 1 译码方式 1-4位译码
	LED_send_16b(0x0a0f);  					  		  //1 0 1 0  0000 1 1 1 1 亮度 31/32
	LED_send_16b(0x0b07);  					  		  //1 0 1 1  000000 1 1  扫描界限  1-4位						  		  //2s
	LED_send_16b(0x0f00); 					  		  //1 1 1 1  0000 0001  正常模式
}


	 

/*
*********************************************************************************************************
*                                               手柄通讯段
*********************************************************************************************************
*/
void delay_hd(INT8U t)				                  //延时函数   																		 																	 
{
for(;t!=0;t--);
}

void psin()				  							  //ps接收数据
{
 	
 	 unsigned char send_chr;		  				  //发送的数据
	 int i;
	 send_chr=tx_chr;	  							  //数据提取 
	 for(i=0;i<8;i++)
	 {
	 	if(send_chr&0x01) PORTD |=(1<<5);  			  //发送cmd1
		else PORTD &=~(1<<5);			   			  //发送cmd0
		PORTD |=(1<<6);					   			  //拉高 clk	
		delay_hd(30);			   
		PORTD &=~(1<<6);				   			  //拉底clk
		delay_hd(30);	
		PORTD |=(1<<6);					   			  //拉高clk
		send_chr=send_chr>>1;			   			  //下一位
	 }
}

void psout(int j)						   		      //收ps的数据,存在第j个rx_chr
{
 	int i;
	rx_chr_b[j][0]=rx_chr_b[j][1];					  //存储上次键值 8bit
	for(i=0;i<=7;i++)
	{
	 	PORTD |=(1<<6);					   			  //拉高clk	
		delay_hd(30);				   
		PORTD &=~(1<<6);				   			  //拉底clk
		delay_hd(30);	
		PORTD |=(1<<6);					   			  //拉高clk
		rx_chr[j][i][0]=rx_chr[j][i][1];			  //存储上次键值 1bit
	    if((PIND&0x02)==0) 
		{
		 	rx_chr[j][i][1]=1; 		   				  //收到的data 1  正逻辑  低电平收到信号 
			rx_chr_b[j][1]|=1<<i;					  //收到的data 1 
		}
		else 
		{
		 	 rx_chr[j][i][1]=0;			   			  //收到的data 0
			 rx_chr_b[j][1]&=~(1<<i);
		}
	}
}

void scan()	   			 				   			  //手柄扫描函数
{
 	 PORTD &=~(1<<4);  //att
	 tx_chr=0x01;						   
	 psin();							   			  //发 0x01
	 tx_chr=0x42;						   
	 psin();							   			  //发 0x42
	 psout(0);							   			  //收 存于 rx_chr[0]
	 delay_hd(30);	
	 psout(1);	  						   			  //收 存于 rx_chr[1]
	 delay_hd(30);	
	 psout(2);	  						   			  //收 存于 rx_chr[2]	 
	 PORTD |=(1<<4);					   			  //ATT 拉高
	 //行程开关扫描----
	 contact_t[0][0]= contact_t[0][1];   			  //保存上次行程开关1
	 contact_t[1][0]= contact_t[1][1];				  //保存上次行程开关2
	 contact_t[2][0]= contact_t[2][1];			  	  //保存上次行程开关3
	 contact_t[3][0]= contact_t[3][1];			  	  //保存上次行程开关4
	 
	 contact_t[0][1]=(PINA&0x40)>>6;				  //行程开关1
	 contact_t[1][1]=(PINA&0x80)>>7;				  //行程开关2
	 contact_t[2][1]=(PINC&0x40)>>6;				  //行程开关3
	 contact_t[3][1]=(PINC&0x80)>>7;				  //行程开关4
}


⌨️ 快捷键说明

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