#include <STC12C5410AD.H>
#include <math.h>
unsigned int PubTimer=0;
sbit test0=P3^4;
sbit test1=P3^5;
//TIMER0 中断
void Int_timer0() interrupt 1
{
//方式1 22.1184MHz ,1ms中断
TH0=249;
PubTimer++;
test0=~test0;
}
#define STEPMAX0 15
#define STEPMAX1 7
#define FIRSTSTEP 8000
#define MINSTEP 600
volatile unsigned int StepCount[2]={0,0};
unsigned int OneStep[2]={MINSTEP,MINSTEP};//420us
bit StepDir0=0;
bit StepDir1=0;
float XYRatio=1;
void Int_pca() interrupt 6
{
static unsigned char StepStat[2]={0,0},CurentStep[2]={0,0};
unsigned int code StepCurv[]={
1.000000000 *FIRSTSTEP,
0.618033989 *FIRSTSTEP,
0.477259996 *FIRSTSTEP,
0.400650015 *FIRSTSTEP,
0.351225959 *FIRSTSTEP,
0.316125972 *FIRSTSTEP,
0.289611046 *FIRSTSTEP,
0.268701054 *FIRSTSTEP,
0.251680679 *FIRSTSTEP,
0.23748599 *FIRSTSTEP,
0.225418496 *FIRSTSTEP,
0.214998657 *FIRSTSTEP,
0.205885145 *FIRSTSTEP,
0.197827668 *FIRSTSTEP,
0.190638044 *FIRSTSTEP,
0.184171748 *FIRSTSTEP,
0.178315731 *FIRSTSTEP,
0.172980144 *FIRSTSTEP,
0.168092571 *FIRSTSTEP,
0.163593914 *FIRSTSTEP,
0.159435414 *FIRSTSTEP,
0.155576435 *FIRSTSTEP,
0.15198281 *FIRSTSTEP,
0.148625576 *FIRSTSTEP,
0.145480001 *FIRSTSTEP,
0.142524818 *FIRSTSTEP,
0.139741633 *FIRSTSTEP,
0.137114439 *FIRSTSTEP,
0.134629235 *FIRSTSTEP,
0.132273717 *FIRSTSTEP,
0.130037018 *FIRSTSTEP,
0.127909503 *FIRSTSTEP,
0.125882594 *FIRSTSTEP,
0.123948627 *FIRSTSTEP,
0.122100728 *FIRSTSTEP,
0.120332714 *FIRSTSTEP,
0.118639005 *FIRSTSTEP,
0.117014552 *FIRSTSTEP,
0.115454771 *FIRSTSTEP,
0.113955492 *FIRSTSTEP,
0.112512912 *FIRSTSTEP,
0.111123552 *FIRSTSTEP,
0.109784227 *FIRSTSTEP,
0.10849201 *FIRSTSTEP,
0.107244209 *FIRSTSTEP,
0.106038341 *FIRSTSTEP,
0.104872114 *FIRSTSTEP,
0.103743408 *FIRSTSTEP,
0.102650256 *FIRSTSTEP,
0.101590834 *FIRSTSTEP,
0.100563445 *FIRSTSTEP,
0.09956651 *FIRSTSTEP,
0.098598557 *FIRSTSTEP,
0.09765821 *FIRSTSTEP,
0.096744184 *FIRSTSTEP,
0.095855276 *FIRSTSTEP,
0.094990358 *FIRSTSTEP,
0.094148371 *FIRSTSTEP,
0.093328322 *FIRSTSTEP,
0.092529276 *FIRSTSTEP,
0.091750353 *FIRSTSTEP,
0.090990723 *FIRSTSTEP,
0.090249605 *FIRSTSTEP,
0.089526258 *FIRSTSTEP,
0.088819987 *FIRSTSTEP,
0.088130129 *FIRSTSTEP,
0.08745606 *FIRSTSTEP,
0.086797188 *FIRSTSTEP,
0.086152951 *FIRSTSTEP,
0.085522815 *FIRSTSTEP,
0.084906274 *FIRSTSTEP,
0.084302848 *FIRSTSTEP,
0.083712078 *FIRSTSTEP,
0.083133528 *FIRSTSTEP,
0.082566784 *FIRSTSTEP,
0.08201145 *FIRSTSTEP,
0.081467149 *FIRSTSTEP,
0.08093352 *FIRSTSTEP,
0.08041022 *FIRSTSTEP,
0.079896919 *FIRSTSTEP,
0.079393305 *FIRSTSTEP,
0.078899077 *FIRSTSTEP,
0.078413947 *FIRSTSTEP,
0.077937639 *FIRSTSTEP,
0.077469889 *FIRSTSTEP,
0.077010446 *FIRSTSTEP,
0.076559065 *FIRSTSTEP,
0.076115515 *FIRSTSTEP,
0.075679571 *FIRSTSTEP,
0.075251019 *FIRSTSTEP,
0.074829653 *FIRSTSTEP,
0.074415274 *FIRSTSTEP,
0.074007691 *FIRSTSTEP,
0.073606721 *FIRSTSTEP,
0.073212187 *FIRSTSTEP,
0.072823919 *FIRSTSTEP,
0.072441753 *FIRSTSTEP,
0.072065531 *FIRSTSTEP,
0.071695101 *FIRSTSTEP,
0.071330315 *FIRSTSTEP,
};
unsigned char code Step1V[STEPMAX1+2]={0xe7,0xb7,0x9b,0xb3,0x63,0x33,0x1f,0x37,0xff};
unsigned char code Step0V[STEPMAX0+2]={0x1f,0x0b,0x33,0x43,0xe3,0xc3,0xb3,0x8b,0x9f,0x8f,0xb7,0xc7,0xe7,0x47,0x37,0x0f,0xff};
unsigned int inttmp;
if(CCF0)
{
if(StepCount[0])
{
inttmp=StepCurv[CurentStep[0]];
if(XYRatio>1) inttmp*=XYRatio;
if(StepCount[0]>=CurentStep[0])
{
if(inttmp<OneStep[0])
inttmp=OneStep[0];
else
CurentStep[0]++;
}
else
CurentStep[0]--;
inttmp=inttmp+(CCAP0H<<8)+CCAP0L;
CCAP0L=inttmp&255; //必须 L在前,否则不好用
CCAP0H=inttmp>>8;
StepCount[0]--;
if(StepDir0)
{
StepStat[0]++;
if(StepStat[0]>STEPMAX0)
StepStat[0]=0;
}
else
{
if(StepStat[0]==0)
StepStat[0]=STEPMAX0;
else
StepStat[0]--;
}
P2=Step0V[StepStat[0]];
}
if(StepCount[0]==0)
{
CurentStep[0]=0;
inttmp=FIRSTSTEP+(CCAP0H<<8)+CCAP0L;
CCAP0L=inttmp&255;
CCAP0H=inttmp>>8;
}
CCF0=0;
}
if(CCF1)
{
if(StepCount[1])
{
inttmp=StepCurv[CurentStep[1]];
if(StepCount[1]>=CurentStep[1])
{
if(inttmp<OneStep[1])
inttmp=OneStep[1];
else
CurentStep[1]++;
}
else
CurentStep[1]--;
inttmp=inttmp+(CCAP1H<<8)+CCAP1L;
CCAP1L=inttmp&255; //必须 L在前,否则不好用
CCAP1H=inttmp>>8;
StepCount[1]--;
if(StepDir1)
{
StepStat[1]++;
if(StepStat[1]>STEPMAX1)
StepStat[1]=0;
}
else
{
if(StepStat[1]==0)
StepStat[1]=STEPMAX1;
else
StepStat[1]--;
}
P1=Step1V[StepStat[1]]>>2;
}
if(StepCount[1]==0)
{
CurentStep[1]=0;
inttmp=FIRSTSTEP+(CCAP1H<<8)+CCAP1L;
CCAP1L=inttmp&255;
CCAP1H=inttmp>>8;
}
CCF1=0;
}
}
void init(void)
{
/**************************
7 总中断准许 ea
6 EPCA_LVD PCA 模块中断及低压检测中断
5 TIMER2 ET2
4 串口 ES
3 TIMER1 ET1
2 INT1 EX1
1 TIMER0 ET0
0 INT0 EX0
**************************/
IE= 0xC2;//1100 0010
/**************************
5 TIMER2 PT2
4 串口 PS
3 TIMER1 PT1
2 INT1 PX1
1 TIMER0 PT0
0 INT0 PX0
**************************/
//no high int level
IP=0;
//SP 堆栈会被 C51 自动设置
/**************************
7 TIMER1 GATE 置0,置1测脉冲宽度
6 TIMER1 C/T 置0 ,定时器方式
5,4 TIMER1 M1,M0 10 串口波特
3 TIMER0 GATE 置0,置1测脉冲宽度
2 TIMER0 C/T 置0 ,定时器方式
1,0 TIMER0 M1,M0 01 16位 11 两个8位
**************************/
TMOD= 0x11;//0001 0001
PCON|=0x80;//devided by 16
/**************************
7,6 sm0,sm1
00 同步移位
01 8位异步
10 9
11 9
5,sm2 多机通信控制用
4 receive enable
3 TB8
2 RB8
1 TI
0 RI
**************************/
SCON = 0x50;//0101 0000 mode 1 8bit
/**************************
7 TF1 TIMER1溢出 中断
6 TR1 TIMER1启动
5 TF0 TIMER0溢出 中断
4 TR0 TIMER0启动
3 INT1 请求
2 INT1 方式 1: 下降沿 0 : 低电平
1 INT0 请求
0 INT0 方式 1: 下降沿 0 : 低电平
**************************/
TCON = 0x54;//0101 0100
//pwm/pca设置
/*
7 CIDL 计数器阵列空闲控制:0 空闲模式下PCA计数器继续工作
1 空闲模式下PCA计数器停止工作
6-3 保留
2 1 CPS1 CPS0 选择PCA 时钟源输入
0 Fosc/12
1 Fosc/2
2 定时器0 溢出, 由于定时器0 可工作在1T方式,可达到计一个时钟溢出,频率反而是最高,达Fosc
3 ECI/P3.4 脚的外部时钟输入( 最大速率= F o s c / 2 )
0 ECF PCA计数溢出中断使能: 1 使能寄存器CCON CF位的中断
0 禁止
*/
CMOD = 0x00;//0 2
/*计数器高低字节*/
CL = 0x00;
CH = 0x00;
/*0-3路 比较/捕获寄存器高低字节,对PWM只用低8位,高8位用来同步设置*/
CCAP0L = 0x0;
CCAP0H = 0x0;
/*0-3路 PCA 比较/捕获模块寄存器
7 保留
6 ECOM 使能比较器
5 CAPP 正捕获 1 使能上升沿捕获
4 CAPN 负捕获 1 使能下降沿捕获
3 MAT 匹配 1 计数值与比较/捕获寄存器的匹配将置位中断标志CCF
2 TOG 翻转 1 工作在PCA高速输出模式,匹配将使CEX脚翻转
1 PWM 脉宽调节模式 1 使能CEX脚用作脉宽调节输出
0 ECCF 使能CCF中断。使能CCF 用来产生中断
0 0 0 0 0 0 0 无此操作
X 1 0 0 0 0 X 16位捕获模式,由CEX的上升沿触发
X 0 1 0 0 0 X 16位捕获模式,由CEX的下降沿触发
X 1 1 0 0 0 X 16位捕获模式, 由CEX的跳变触发
1 0 0 1 0 0 X 16位软件定时器
1 0 0 1 1 0 X 16位高速输出
1 0 0 0 0 1 0 8位PWM
*/
CCAPM0 = 0x49; //0100,1001 0路 16位软件定时器
CCAPM1 = 0x49; //0100,1001 1路 16位软件定时器
CCAPM2 = 0; //0100,1001 1路 16位软件定时器
CCAPM3 = 0; //0100,1001 1路 16位软件定时器
/*
CCON 可位寻址
7 CF 溢出标志 硬�
评论0