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

📄 h.c

📁 用PIC单片机对直流电机的控制,用在按摩椅上的.有倒背,敲打等功能.
💻 C
📖 第 1 页 / 共 3 页
字号:
			SSPIF=0;
			SCL_LOW();
			if(ACK0)
			{
				i2cerror=1;
				i=8;
			}
		}
	}
	else
	{i2cerror=1;}
	SCL_HIGH();						//stop i2c
	SDA_HIGH();
	delay();
	delay();
	SSPIF=0;
}
//****************************************************************************************************//


//************************************i2c read code**************************************************//
i2c_read(unsigned char addr)
{
unsigned char a,b,c,i,j;
	c=addr;
	b=addr;
	b=b&0xfe;
	a=b|0x01;					//read,A0=1
	SDA_HIGH();
	SCL_HIGH();
	SDA_LOW();						//start i2c
	SSPIF=0;
	for(i=0;i<8;i++)
	{
		SCL_LOW();
		b=a&0x80;
		if(b==0x80)
		{SDA_HIGH();}
		else
		{SDA_LOW();}
		SCL_HIGH();
		a=a<<1;
	}
	SCL_LOW();
	delay();
	SDA_HIGH();
	ACK0=SDA;
	SCL_HIGH();						//9 rise edge
	SSPIF=0;
	if(!ACK0)
	{
		for(i=0;i<8;i++)
		{
			SCL_LOW();
			delay();
			a=0;
			for(j=0;j<8;j++)
			{
				SCL_LOW();
				a=a<<1;
				a=a&0xfe;
				SDA_HIGH();
				SCL_HIGH();	
				SDABIT=SDA;
				if(SDABIT)
				{a=a|0x01;}
				else
				{a=a|0x00;}
			}
			if(c==BOTTOM)
			{receiv0[i]=a;}
			if(c==BACK)
			{receiv1[i]=a;}
			SCL_LOW();
			SDA_LOW();					//generate ACK signal
			delay();
			SCL_HIGH();					//ninth rise 
			SSPIF=0;
		}
	}
	else
		{i2cerror=1;}
	SCL_HIGH();
	SDA_HIGH();
	SSPIF=0;
}
//***********************************************************************************************//


//*************************************10ms定时中断程序******************************************//
//******************************处理I2C通信、按键扫描和LED扫描***********************************//
void interrupt isr(void)			// Here be interrupt function - the name is
{
unsigned char a,i;
GIE=0;
if(TMR1IF)
	{
	TMR1IF=0;
	TMR1L=-2500%256;
	TMR1H=-2500/256;
	i2c_count++;
	key_count++;
	if(key_count==20)				//按键扫描步长,50ms
	{
		massage_count++;			
		knock_count++;
		knead_count++;
		anti_knead_count++;
		key_count=0;
		scan_key();
	}
	scan_led();
	speed_count++;					//调速步长计数器
	}
	else
	{
/*i2c interrupt*/
		if(SSPIF)
		{
			a=SSPBUF;
			if(!STAT_RW)						//write state
			{
				SSPIF=0;
				while(!SSPIF)
					{;}
				if(SSPIF)
				{
					a=SSPBUF;
					SSPIF=0;
				}
				for(i=0;i<7;i++)
				{
					while(!SSPIF)
						{;}
					if(SSPIF)
					{
						if(a==BOTTOM)
						{receiv0[i]=SSPBUF;}
						if(a==BACK)
						{receiv1[i]=SSPBUF;}
						a=SSPBUF;
						SSPIF=0;	
					}
				}
			}
			else							//read stae
			{
				for(i=0;i<8;i++)
				{
					if(SSPIF)
					{
						CKP=0;
						SSPBUF=send1[i];
						CKP=1;
						SSPIF=0;
						while(!SSPIF)
							{;}
					}
				}
			}
		SSPIF=0;
		}
	}
	GIE=1;				//开总中断
}
//*********************************************************************************************//
//**********************************系统程序部分结束*******************************************//


//**********************************功能应用程序部分********************************************//
//**********************************手动控制****************************************//

//********************************************宽度控制*******************************************//
//依宽中窄的顺序,每按1次键,依次循环选择揉捏头宽度,作用对象是揉捏电机,在慢速进行调整,消除惯性
//输入信号是宽中窄光耦信号
//RNDJ
//D7		D6		D5		D4		D3		D2		D1		D0
//启/停		正/反                   宽      中      窄      设定标志

unsigned char width_stat;
width_hand(void)
{
unsigned char a,b;
	if(width_k)	
	{
		while(width_k){;}
		switch(width_stat)
		{
			case	ZHONG:
			{


      


     ZDDJB=0x0f;XQFB=0x0f;	

    	i2c_write(BOTTOM);
                
				RNDJB=ZHONG;
				width_stat=ZHAI;
				width_mid_on_led();
				width_max_off_led();
				width_min_off_led();
			}break;
			case	ZHAI:
			{
				


                 ZDDJB=0xf0;XQFB=0xf0;	

        	i2c_write(BOTTOM);



                RNDJB=ZHAI;
				width_stat=KUAN;
				width_min_on_led();
				width_mid_off_led();
				width_max_off_led();
			}break;
			case	KUAN:
			{
				RNDJB=KUAN;
				width_stat=ZHONG;
				width_max_on_led();
				width_mid_off_led();
				width_min_off_led();
			}break;
			default:	break;
		}
		i2c_write(BACK);
		delay_ctrl();
		RNDJB=0x00;	
	}			
}

//********************************************区间控制*******************************************//
//依上、中、下、上中、中下、全身的顺序,每按1次键,依次循环选择运行区间,推拿程序只在此区间运行
//作用对象是行走电机
//螺纹距2mm,有效行程470mm(235圈),上部(肩)120mm(60圈),中部(背)150mm(75圈),
//下部(腰)200mm(100圈)
//GDJSL:下行程处,为0,GDJSL=0,GDJSH=100,为下部;GDJSL=100,GDJSH=175,为中部;GDJSL=175,GDJSH=235,为上部
//XZDJ
//  D7		  D6	D5		D4		D3		D2		D1		D0
//启/停	    下/上                                        手动标志 
//area_stat
//  D7		  D6	D5		D4		D3		D2		D1		D0
//启/停	    下/上   上      中      下      上中    中下    全身
unsigned char area_stat;
#define area_up_on_led()	led_ram[2]=led_ram[2]|0b00000010			//区间,上开
#define area_up_off_led()	led_ram[2]=led_ram[2]&0b11111101			//区间,上关

#define area_mid_on_led()	led_ram[2]=led_ram[2]|0b00000100			//区间,中开
#define area_mid_off_led()	led_ram[2]=led_ram[2]&0b11111011			//区间,中关

#define area_down_on_led()	led_ram[3]=led_ram[3]|0b00000001			//区间,下开
#define area_down_off_led()	led_ram[3]=led_ram[3]&0b11111110			//区间,下关

#define		GDJSH		send0[10]			//高度计数高端值
#define		GDJSL		send0[11]			//高度计数低端值
#define		GDXCB		send0[12]			//光电行程检测


area_hand(void)
{
unsigned char a,b;
	if(area_k)
	{
	while(area_k){;}
		a=area_stat;
		a=a&0b00111111;
		switch(a)
		{
			case	0x01:			//为全身,改为上,175~235
			{
				b=0x20;
				GDJSL=175;
				GDJSH=235;
				area_up_on_led();
				area_mid_off_led();
				area_down_off_led();
			}break;
			case	0x20:			//为上,改为中,100~175
			{
				b=0x10;
				GDJSL=100;
				GDJSH=175;
				area_mid_on_led();
				area_up_off_led();
				area_down_off_led();
			}break;
			case	0x10:			//为中,改为下,0~100
			{
				b=0x08;
				GDJSL=0;
				GDJSH=100;
				area_down_on_led();
				area_mid_off_led();
				area_up_off_led();
			}break;
			case	0x08:			//为下,改为下中,100~235
			{
				b=0x04;
				GDJSL=0;
				GDJSH=175;
				area_up_on_led();
				area_mid_on_led();
				area_down_off_led();
			}break;
			case	0x04:			//为下中,改为中上,0~175
			{
				b=0x02;
				GDJSL=100;
				GDJSH=235;
				area_up_off_led();
				area_mid_on_led();
				area_down_on_led();
			}break;
			case	0x02:			//为中下,改为全身,0~235
			{
				b=0x01;
				GDJSL=0;
				GDJSH=235;
				area_up_on_led();
				area_mid_on_led();
				area_down_on_led();
			}break;
			default:	break;
		}
		a=area_stat;
		a=a&0b11000000;
		a=a|b;
		area_stat=a;
		i2c_write(BOTTOM);
		delay_ctrl();
	}
}

//********************************************上行控制******************************************//
//按住键,机心上行,如遇限位,自动停止;松开按键,机心停止。

go_up_hand(void)
{
	if(go_up_k)
	{
		asm("clrwdt");
		go_up_on_led();				//led bright	
		XZDJB=0xa1;					//手动标志为1,不受区间控制
		XZDJSDB=0x01;				//启动时,速度最大
		GDXCB=0x01;
	

        



    ZDDJB=0b11110000;XQFB=0x0f;	
    
       


     	i2c_write(BOTTOM);
		while(go_up_k)
			{asm("clrwdt");}
		GDXCB=0x01;
		XZDJB=0x00;
		i2c_write(BOTTOM);
		delay_ctrl();
		go_up_off_led();
	}
}
//**************************************************************************************//

//********************************************下行控制******************************************//
//按住键,机心下行,如遇限位,自动停止;松开按键,机心停止。
go_down_hand(void)
{
	if(go_down_k)
	{
		
     ZDDJB=0x0f;   XQFB=0xf0; 
 


        asm("clrwdt");
		go_down_on_led();				//led bright	
		XZDJB=0xc1;						//手动标志为1,不受区间控制
		XZDJSDB=0x01;				//启动时,速度最大
		GDXCB=0x01;
		i2c_write(BOTTOM);			
		while(go_down_k)
		{asm("clrwdt");}	
		XZDJB=0x00;
		GDXCB=0x01;
		i2c_write(BOTTOM);
		delay_ctrl();
		go_down_off_led();
	}
}

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

//***********************************速度调节*******************************************//
//按住键,步长为2秒进行调节,若有电机关联,则只修改该电机参数,否则修改所有已开电机参数
bit	knead_speed_flag,knock_speed_flag,massage_speed_flag;
speed_inc(void)
{
unsigned char a;
	if(speed_inc_k)
	{
		speed_count=0;							//步长
		speed_inc_on_led();

		while(speed_inc_k)
		{ 


 XTJRDJB=0x80;i2c_write(BOTTOM);





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==0){RNDJSDB=1;}
				if(CJDJSDB==0){CJDJSDB=1;}
				if(XZDJSDB==0){XZDJSDB=1;}
				i2c_write(BACK);
				i2c_write(BOTTOM);		
				delay_ctrl();
			}
		}

	}




XTJRDJB=0;i2c_write(BOTTOM);	

}

speed_dec(void)
{
unsigned char a;

	if(speed_dec_k)

⌨️ 快捷键说明

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