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

📄 h.c

📁 用PIC单片机对直流电机的控制,用在按摩椅上的.有倒背,敲打等功能.
💻 C
📖 第 1 页 / 共 3 页
字号:
	{
		speed_count=0;							//步长
		speed_dec_on_led();
		while(speed_dec_k)
		{
			asm("clrwdt");
			if(speed_count==SPEED_STEP)			//速度调高
			{
				speed_count=0;
				if(knead_speed_flag)			//揉捏电机关联
				{RNDJSDB++;}
				else if(knock_speed_flag)			//锤击电机关联
				{CJDJSDB++;}
				else if(massage_speed_flag)			//行走电机关联
				{XZDJSDB++;}
				else
				{
					a=RNDJB;
					a=a&0x80;
					if(a==0x80){RNDJSDB++;}
					a=CJDJB;
					a=a&0x80;
					if(a==0x80){CJDJSDB++;}
					a=XZDJB;
					a=a&0x80;
					if(a==0x80){XZDJSDB++;}
				}
				if(RNDJSDB==0x21){RNDJSDB=0x20;}
				if(CJDJSDB==0x21){CJDJSDB=0x20;}
				if(XZDJSDB==0x21){XZDJSDB=0x20;}
				i2c_write(BACK);
				i2c_write(BOTTOM);
				delay_ctrl();
			}
		}
		speed_dec_off_led();
	}
}
//*******************************************************************************************//
	
//****************************************推拿程序*************************************//
//机心上下自动行走,遇限位则换相,如果按键压住时间大于2秒,则与速度调节关联
bit massage_flag;
massage_hand(void)
{
unsigned char a;
	if(massage_k)
	{
		massage_count=0;
		while(massage_k)
		{
			



TXTDJB=0x80;i2c_write(BOTTOM);


           if(massage_count==40)
			{massage_speed_flag=1;}
		}
		a=XZDJB;
		a=a&0x80;
		if(massage_flag)
		{
			XZDJB=0x00;
			GDXCB=0x02;
			massage_off_led();
			massage_flag=0;
			massage_speed_flag=0;
		}
		else
		{


   
   TXTDJB=0;




	massage_flag=1;
			XZDJB=0x88;
			XZDJSDB=0x01;				//启动时,速度最大
			GDXCB=0x02;
			massage_on_led();
		}
		GDJSL=0;
		GDJSH=235;

i2c_write(BOTTOM);
		delay_ctrl();
	}
}
//**********************************************************************************************//


//JRQBB=0x80;(加热) JRQBB=0x08;(气泵) XTJRDJB=0x80(小腿夹揉电机);TXTDJB=0x80;(抬小腿电机);XQFB ZDDJB




//*********************************************锤击控制*****************************************//
//锤击电机启动,如果按键压住时间大于2秒,则与速度调节关联
knock_hand(void)
{
unsigned char a;
	if(knock_k)
	{
		knock_count=0;
		while(knock_k)
		{
		

JRQBB=0x80;i2c_write(BOTTOM);







	if(knock_count==40)			//
			{knock_speed_flag=1;}
		}
		a=CJDJB;
		a=a&0x80;
		if(a==0x80)
		{
			CJDJB=0x00;
			knock_off_led();
			knock_speed_flag=0;
		}
		else
		{
			



JRQBB=0;i2c_write(BOTTOM);


            CJDJB=0x80;
			knock_on_led();
		}
		CJDJSDB=0x18;
		i2c_write(BACK);
		delay_ctrl();
	}
}
//**********************************************************************************************//

//**********************************摆揉控制****************************************************//
//揉捏电机反转,如果按键压住时间大于2秒,则与速度调节关联
anti_knead_hand(void)
{
unsigned char a;
	if(anti_knead_k)
	{
		anti_knead_count=0;
		while(anti_knead_k)
		{
		

    JRQBB=0x08;



	i2c_write(BOTTOM);
if(anti_knead_count==40)
			{knead_speed_flag=1;}
		}
		a=RNDJB;
		a=a&0xc0;
		if(a==0xc0)
		{

     

       JRQBB=0;i2c_write(BOTTOM);
       


        RNDJB=0x00;anti_knead_off_led();knead_speed_flag=0;}
		else
		{RNDJB=0xc0;anti_knead_on_led();}
		RNDJSDB=0x01;
		i2c_write(BACK);
		delay_ctrl();
	}
}

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

//**********************************揉捏控制****************************************//
//揉捏电机启动,如果按键压住时间大于2秒,则与速度调节关联
knead_hand(void)
{
unsigned char a;
	if(knead_k)
	{
		knead_count=0;
		while(knead_k)
		{  if(knead_count==40)
			{knead_speed_flag=1;}
		}
		a=RNDJB;
		a=a&0x80;
		if(a==0x80)
		{


 XTJRDJB=0; i2c_write(BOTTOM);



        RNDJB=0x00;knead_off_led();knead_speed_flag=0;}
		else
		{RNDJB=0x80;knead_on_led();}
		RNDJSDB=0x01;
		i2c_write(BACK);
		delay_ctrl();
	}
}
//**************************************************************************************//

//*************************************************倒背控制*************************************//
//不管按键多长,延时300ms自动停止
fall_hand(void)
{
	if(fall_k)
	{
		DBDJB=0x80;
		i2c_write(BOTTOM);
		delay_ctrl();
		while(fall_k){asm("clrwdt");}
		DBDJB=0xc0;
		i2c_write(BOTTOM);
		delay_ctrl();
		DBDJB=0x00;
	}
}
//***********************************************************************************************//



//**********************************************开机程序****************************************//
//**********************************************开机复位****************************************//
//step1 arive bottom
power_init(void)
{
unsigned char i;
//led
	knead_count=0;
	for(i=0;i<6;i++)
	{led_ram[i]=0xff;}
	while(knead_count!=20){;}		//all lamp bright 500ms
	PORTA=0x00;
	PORTC=0xff;
	for(i=0;i<6;i++)
	{led_ram[i]=0;}
	power_on_led();
//bottom
//	go_down_on_led();				//led bright	


//XTJRDJB=0x80;
  //  TXTDJB=0x40;

//JRQBB=0x80; JRQBB=0x08; 


	XZDJB=0xa1;						//手动标志为1,不受区间控制
	XZDJSDB=0x00;				//启动时,速度最大
	GDXCB=0x01;
	i2c_write(BOTTOM);
	delay_ctrl();			
//	while(GDXCB!=0x80){GDXCB=GDXCB&0x80;}		//到光电行程,则停止
//	XZDJB=0x00;
//	GDXCB=0x01;	
//	i2c_write(BOTTOM);
//	go_down_off_led();
//back
	RNDJB=ZHONG;				//置设定标志,宽
	CJDJB=0x00;
	i2c_write(BACK);
	delay_ctrl();
	power_on_led();
}



//**********************************************开机控制****************************************//
power_on(void)
{
	if(onoff_k)
	{
		while(onoff_k){;}
		if(!power_flag)
		{
			POWERB=0x80;






			i2c_write(BOTTOM);
			delay_ctrl();			
			power_init();
			power_on_led();
			power_flag=1;
		}
		else
		{
			POWERB=0x00;
			i2c_write(BOTTOM);
			delay_ctrl();			
			power_init();
			power_off_led();
			power_flag=0;
		}
	}
}	
//**********************************************************************************************//
		

//**************************************************轻松程序************************************//
easy_auto(void)
{


	if(easy_k)
	{
		easy_on_led();
		while(easy_k){;}
		easy_off_led();
	}
	
}
//***********************************************************************************************//

//**************************************************睡眠程序*************************************//

sleep_auto(void)
{
	if(sleep_k)
	{
		sleep_on_led();
		while(sleep_k){;}
		sleep_off_led();
	}
	
}

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

//*************************************************理疗程序***************************************//

cure_auto(void)
{
	if(cure_k)
	{
		cure_on_led();
		while(cure_k){;}
		cure_off_led();
	}
	
}

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

//**********************************************主程序********************************************//
main(void)
{
unsigned char i;
//IO口初始化
	PORTA=0;
	PORTB=0;
	PORTC=0;
	ADCON1=0x06;
	TRISA=0;
	TRISB=0x0f;			//RB0~3 are input,RB4~7 are output
	TRISC=0;
	PORTA=0;
	PORTC=0xff;
//I2C 初始化
	SDA_HIGH();
	SCL_HIGH();
//	SSPCON=0b00111011;		//master mode
//	SSPCON=0b00111110;		//multi master mode
	SSPCON=0b00110110;		//7bit slave mode
	SSPSTAT=0; 
	SSPADD=HAND;              //作从器件时的地址值
//TMR1初始化
	T1CON=0b00000001;	//启动T1,10毫秒定时
	TMR1L=-2500%256;
	TMR1H=-2500/256;
	TMR1IE=1;			//开T1中断
	SSPIE=1;
	PEIE=1;				//开外围中断
	GIE=1;				//开总中断

	key_flag=0;
	led_i=0;

//主循环
	width_stat=ZHONG;
	area_stat=0x01;

	i2c_count=0;
	key_count=0;
	speed_count=0;
	i2cerror=0;
	ACK0=0;
	
	SDABIT=0;
	i2c_idle_flag=0;
	key_flag=0;

	knead_flag=0;
	knock_flag=0;
	power_flag=0;
	track_flag=0;

	massage_flag=0;

	for(i=0;i<6;i++)
	{led_ram[i]=0;}
	while(1)
	{
		delay_ctrl();
		asm("clrwdt");
		power_on();
		fall_hand();
		if(power_flag)
		{
//			GDXCB=GDXCB&0x80;
//			if(GDXCB==0x80)
//			{
//				i2c_write(BOTTOM);			//行程光电1到位,立刻转发到BOTTOM
//				GDXCB=0x00;
//			}
			width_hand();
			area_hand();
			go_up_hand();
			go_down_hand();
			speed_inc();
			speed_dec();
			massage_hand();
			knock_hand();
			anti_knead_hand();
			knead_hand();
			easy_auto();
			sleep_auto();
			cure_auto();
		}
	}
}
//**************************************END********************************************************//




    
    
 
    
    

⌨️ 快捷键说明

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