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

📄 pic18f452_mass.c

📁 这是通过PIC的PWM模块控制电机的转动和调速及换向
💻 C
字号:
#include <pic18fxx2.h>
#define UCHAR unsigned char
volatile UCHAR bank1 nDisLedA @0xea;
volatile UCHAR bank1 nDisLedB @0xeb;
volatile UCHAR bank1 nDisLedC @0xec;
volatile UCHAR bank1 nDisLedD @0xed;
volatile UCHAR bank1 nDisLedE @0xee;

volatile bit  bLedUpperOn @(unsigned)&nDisLedA^1;    //开关指示;
volatile bit  bLedStow @(unsigned)&nDisLedA^4;       //收藏;
volatile bit  bLedNeckAuto @(unsigned)&nDisLedA^3;   //颈肩自动;
volatile bit  bLedWaistAuto @(unsigned)&nDisLedA^7;  //背腰自动;
volatile bit  bLedFullAuto @(unsigned)&nDisLedA^2;   //上半身自动;
volatile bit  bLedShouldLow @(unsigned)&nDisLedA^6;  //肩位置低;
volatile bit  bLedShouldMin @(unsigned)&nDisLedA^0;  //肩位置中;
volatile bit  bLedShouldHight @(unsigned)&nDisLedA^5;//肩位置高;
                                                                                                        
volatile bit  bLedFinger @(unsigned)&nDisLedB^2;     //指压;
volatile bit  bLedFlap @(unsigned)&nDisLedB^3;       //拍打;
volatile bit  bLedKneadFlap @(unsigned)&nDisLedB^7;  //揉捏拍打;
volatile bit  bLedKnead @(unsigned)&nDisLedB^4;      //揉捏;
volatile bit  bLedKnock @(unsigned)&nDisLedB^5;      //敲击;

volatile bit  bLedMoveUp @(unsigned)&nDisLedB^1;     //移动上行;
volatile bit  bLedMoveDw @(unsigned)&nDisLedC^5;     //移动下行; 
volatile bit  bLedFull @(unsigned)&nDisLedC^2;       //全程;
volatile bit  bLedPart @(unsigned)&nDisLedC^0;       //局部;
volatile bit  bLedLocation @(unsigned)&nDisLedC^3;   //定点;
volatile bit  bLedViblow @(unsigned)&nDisLedC^4;     //振动弱;
volatile bit  bLedVibHight @(unsigned)&nDisLedC^6;   //振动强;

volatile bit  bLedSpeedFast @(unsigned)&nDisLedD^2;  //速度快;
volatile bit  bLedSpeedMin @(unsigned)&nDisLedD^1;   //速度中;
volatile bit  bLedSpeedSlow @(unsigned)&nDisLedD^4;  //速度慢;
volatile bit  bLedWidthNarrow @(unsigned)&nDisLedD^0;//按摩球 窄;
volatile bit  bLedWidthMin @(unsigned)&nDisLedD^5;   //按摩球 中;
volatile bit  bLedWidthBig @(unsigned)&nDisLedD^7;   //按摩球 宽;

volatile bit  bLedVibStrengL @(unsigned)&nDisLedD^3; //振动强度 弱;
volatile bit  bLedVibStrengH @(unsigned)&nDisLedD^6; //振动强度 强;

volatile bit  bLedQF_PartA   @(unsigned)&nDisLedE^1; //气压部位A;
volatile bit  bLedQF_PartB   @(unsigned)&nDisLedE^2; //气压部位B;
volatile bit  bLedQF_PartC   @(unsigned)&nDisLedE^5; //气压部位C;
volatile bit  bLedButtVib    @(unsigned)&nDisLedE^0; //臀部振动;
volatile bit  bLedLegVib     @(unsigned)&nDisLedE^4; //小腿振动;
volatile bit  bLedQF_Low     @(unsigned)&nDisLedE^3; //气压强度 弱;
volatile bit  bLedQF_Hight   @(unsigned)&nDisLedE^6; //气压强度 强;

volatile unsigned int k;               //定义全局易变型变量;
volatile unsigned int mode_number=2;
volatile bit bflag;                      //按键松开标志位; 
volatile unsigned char *p;     

#define FULL_LONG       120              //丝杆全长,上下行程间的距离,包括的圈数;
#define SHOULD_LOCATION0 20              //从上行程开关处到肩位置0处包括的圈数;
#define SHOULD_UNIT      5               //五个肩位置点之间的间距即包括的圈数;
#define PART_CYCLE      20               //局部工作时,上下移动范围;
unsigned char ShouldNo;                  //当前肩位置标号;
unsigned char Should_value;              //当前肩位置长度,下行程到肩位置的圈数;
bit bUpperOn;                            //上半身功能开关标志;
bit bShouldMoveOn;                       //肩位置是否需移动定位标志;
bit bShouldLocation;                     //肩位置到位否标志;
bit bStowProcess;                        //收藏处理否标志;
bit bShouldProcess;                      //肩位置处理否标志;
unsigned char nPartUpCycleCount,nPartDwCycleCount;         //局部工作上下移动范围记数器;
unsigned char nMoveUpCycleCount,nMoveDwCycleCount;         //位置检测用;
bit bfullAutoOn,bNeckAutoOn,bWaistAutoOn;                  //自动状态开关标志;
bit bKneadOn,bFlapOn,bFingerOn,bKnockOn,bKneadFlapOn;      //手动状态功能开关标志;
unsigned char nCurMoveDir,nPreMoveDir;                     //移动方向,0 停止 1 向下 2 向上;
unsigned char nMoveCycleCount,nCurMoveCycle,nPreMoveCycle;

UCHAR nPreMassState,nCurMassState,nPreMassSpeedValue,nCurMassSpeedValue,nCurMassSpeed,nPreMassSpeed;
UCHAR nPreWidthValue,nCurWidthValue;
bit bCharge;

bit bPreWidthA,bCurWidthA,bPreWidthB,bCurWidthB;
bit bWidthBig,bWidthMin,bWidthNarrow;
UCHAR nWidthCount;

UCHAR nSpeedValue;
UCHAR nKnockWorkTime,nKnockWaitTime,nKnockTimeCount;
bit bKnockWorkState;

UCHAR nMoveTimeCount,nMoveTime,nMoveMode;

UCHAR KneadSpeed[5]={104,72,64};
UCHAR FlapSpeed[5]={96,84,60};
UCHAR FingerSpeed[5]={132,126,120};
UCHAR KnockSpeed[5][2]={{24,255},{16,200},{16,160}};
UCHAR KneadFlapSpeed[5][2]={{112,114},{92,90},{76,72}};

#define FULLAUTOSTEP     179
#define NECKAUTOSTEP     154
#define WAISTAUTOSTEP    132

#define TZ  0          //按摩停止    
#define RN  1          //按摩揉捏    
#define PD  2          //按摩拍打    
#define ZY  3          //指压        
#define RP  5          //揉捏拍打    
#define QJ  4          //敲击        
                                    
#define WIDK 0         //宽度 宽     
#define WIDM 1         //宽度 中     
#define WIDZ 2         //宽度 窄     
                                    
#define MTZ 0          //停止移动;  
#define MUP 2          //向上移动;  
#define MDW 1          //向下移动;  
                                    
#define CXC 0          //行程检测;  
#define CQS 1          //圈数检测;  
#define CSJ 2          //时间检测;  
#define CJW 3          //肩位置检测;
                                    
 struct MoveMassStruct              
 {                                  
  //上下移动描述                  
  UCHAR nMoveDir;                   
  UCHAR nCheckWise;                 
  UCHAR nMoveCycle;                 
  UCHAR nMoveTime;                  
  //按摩机构功能描述                
  UCHAR nMassState;                 
  UCHAR nMassSpeed;                 
  UCHAR nWidth;                     
};                                 
 const struct MoveMassStruct *pMoveMassAutoValue;
 
 
#define STOP       0
#define KNEAD      1
#define FLAP       2
#define FINGER     3
#define KNOCK      4
#define KNEADFLAP  5

#define KNEAD_MOTOR    1  
#define KNOCK_MOTOR    2  
#define TRANS_SPEED     104 
#define KNOCK_MAX       70 
#define NARROW          2
#define MIN             1
#define BIG  
                                                                        
/*********************************************************************/
void Initial_USART();                             //USART异步发送接收初始化;
void CCPINIT();
void Initial_port();                              //端口初始化函数;
void key7(int n);
void key9(int n);
void cycleDetect();
void USART();                                     //串口数据异步发送接收;

/**********************************************************************/
  /*                              主函数                           */                                                                       
/**********************************************************************/

    main()                                       //主函数主要负责初始化,与手控板进行数据通信,
 {                                               //并且查询键值,来执行相应的功能;                            
	Initial_port();
	Initial_USART();                             //USART异步发送接收初始化;
	CCPINIT();
	T2CON=0x00;
    TXEN=1;                                      //发送允许;
    CREN=1;
    IPEN=0;
	TMR2IE=0;
	PEIE=1;
	GIE=1;
	while(1)
   {
   ;
   }                                             //循环发送;                                                                 
 }

/*********************************************************************/
   /*                        中断函数                      */
/*********************************************************************/
 
 void interrupt high_vector(void)
{
  USART();
}
	void USART()                                 //串口数据同步发送接收中断;                                    
 {                                                                                       
  int n=0;
	  if(RCIF==1&&RCIE==1)                       //取接收值,并清串口接收标志位;
  {
   	 k=RCREG;                                        
     if(OERR==1) 
     {                                           //如果有溢出错误,则处理
      CREN=0;
      CREN=1;
     }                                                                                                               
	if(k==0)
	  bflag=1;                                                             
    if(k==7)
      key7(n);                                    //按键7揉捏功能函数;
    if(k==9)
      key9(n);                                    //按键9拍打功能函数;
  }
}
	 	 	 	 
/*******************************************************************************/
 /*                  初始化函数                                   */
/*******************************************************************************/
                                                                                 
void CCPINIT()      //该程序用于使CCP模块产生分辨率为10位的PWM波形,占空比为50% 
{                   //CCP模块的PWM工作方式初始化子程序
 CCPR1L=0x00;    
 CCP1CON=0x00;  
 PR2=0xff;          //设置PWM的工作周期
 TRISC2=0;          //设置CCP1引脚为输出方式
 CCPR2L=0x00;     
 CCP2CON=0x00;     
 TRISC1=0;          //设置CCP2引脚为输出方式;
 INTCON=0x00;       //禁止总中断和外围中断;
} 
		
 void Initial_USART()                            //USART异步发送接收初始化;
{
  TRISC6=0;                                      //将RC6设置为输出方式;
  TRISC7=1;                                      //将RC7设置为输入方式,对外部呈高阻状态;
  SPBRG=0x19;                                    //波特率设置为约9600位/秒;
  TXSTA=0x04;                                    //选择异步高速方式传输8位数据;
  RCSTA=0x80;                                    //允许同步串行口工作;
  RCIE=1;                                        //RCIE=1,接收中断使能;
  TXIE=0;
}

void Initial_port()                              //端口初始化;
{
	TRISA=0xC3;
	TRISB=0xFF;
	TRISC=0x80;
	TRISD=0x10;
	TRISE=0xFC;                                  //端口方向寄存器初始化;
}

/**********************************************************************************/
/*                     动作函数                                       */
/**********************************************************************************/                                        

void cycleDetect()
{
UCHAR accycleflag=0;
if(RE2==1)
 accycleflag=1;                                       
if(accycleflag==1)                                 //上升沿到来后计数器加1;
 nMoveCycleCount++;     
 while(1)
 {
 if(RE2==0)
 	break;
 }
 accycleflag=0;                                    //高电平回到低电平后标志位清0;
}

/*************************************************************/
/*                 功能函数                             */
/*************************************************************/

void key7(int n)                                      //揉捏动作开始;                                  
{
nPreMassState=nCurMassState;
nCurMassState=KNEAD;
if(nCurMassState==nPreMassState)
 nCurMassState=STOP;
	if(nCurMassState==KNEAD)
 {CCP2CON=0x00;                                    //关闭CCP2模块;
	CCP1CON=0x0C;                                  //设置CCP1模块为PWM工作方式,且其工作循环的低2位为00;
	nPreMassSpeedValue=nCurMassSpeedValue;
	nCurMassSpeedValue=KneadSpeed[n];              
	CCPR1L=nCurMassSpeedValue;                     //设置初始速度;
  T2CON=0x07;}                                     //00000111,16分频,打开T2,开始输出PWM;
	else {CCP2CON==0x00;
   	     TMR2ON=0;}
}		     

void key9(int n)                                   //拍打动作开始;         
{
	nPreMassState=nCurMassState;
  nCurMassState=FLAP;
if(nCurMassState==nPreMassState)
	nCurMassState=STOP;
	if(nCurMassState==FLAP)
 {CCP1CON=0x00;                                    //关闭CCP1模块;
	CCP2CON=0x0C;                                  //设置CCP2模块为PWM工作方式,且其工作循环的低2位为00;
	nPreMassSpeedValue=nCurMassSpeedValue;
	nCurMassSpeedValue=FlapSpeed[n];              
	CCPR2L=nCurMassSpeedValue;                     //设置初始速度;
  T2CON=0x07;}                                     //00000111,16分频,打开T2,开始输出PWM波形;
   else {CCP2CON==0x00;
   	     TMR2ON=0;}
}		      	              
	










⌨️ 快捷键说明

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