📄 pic18f452_mass.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 + -