📄 mocontrol.c
字号:
// 目标器件: STC12C4052AD
// 系统频率: 外部时钟,12M.
#include <STC12C2052AD.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define DogReset() WDT_CONTR=0x36
#define vBtnVal_Null 0x00 // ceeback/20070316
#define vBtnVal_StartUp 0x01 //起停
#define vBtnVal_HiSpeed 0x02 //高速
#define vBtnVal_MiSpeed 0x04 //中速
#define vBtnVal_LoSpeed 0x08 //低速
#define vBtnAct_Null 0
#define vBtnAct_Push 1
#define vBtnAct_Pop 2
#define vBtnAct_Keep 3
#define vT0HVal 0xff
#define vT0LVal 0x9c
#define vBaudTime 0xfa
// T0 定时 0.1ms.作为系统计时用,
#define vT01ms 10
#define vT10ms 10
#define vT100ms 10
#define vT01S 10 // 1 s = 10 ms * 100
#define WaitSpeed 0
#define LoSpeed 1
#define MiSpeed 2
#define HiSpeed 3
#define STOP 0
#define WORK 1
#define Forward 1
#define Backward 0
#define vSetNum 30000
uchar idata KeyNum;
uchar idata cBtnVal; // 按钮取值
uchar idata SpeedType;
// 定时器延时
uchar idata cT01ms;
uchar idata cT10ms;
uchar idata cT100ms;
uchar idata cT01s;
uchar idata Time_01ms;
uchar idata cDY_Clock; // 时钟计时
//正转
uchar idata StepTab1[6]={0x01,0x02,0x04}; //三相单三拍
uchar idata StepTab2[6]={0x03,0x05,0x06}; //三相双三拍
uchar idata StepTab3[12]={0x01,0x03,0x02,0x05,0x04,0x06}; //三相六拍
//反转
uchar idata StepTabRev1[6]={0x02,0x01,0x04}; //三相单三拍
uchar idata StepTabRev2[6]={0x05,0x03,0x06}; //三相双三拍
uchar idata StepTabRev3[12]={0x02,0x05,0x01,0x03,0x04,0x06}; //三相六拍
uchar cTime;
uint SetNum;
uint TurnNum;
bit b_Power; // 电机起停标志
bit SpeedFlag;
//-----------------------------------------------------------------------------
// 函数声明
//-----------------------------------------------------------------------------
void Para_initial(void);
/**************************************************************************
* 函数原型: void delay_1us(uint Count)
* 功 能: 延时Count个1us
**************************************************************************/
void delay_1us(register uint Count){
for(;Count>0;Count--){
// _nop_();
// DogReset();
}
}
/**************************************************************************
* 函数原型: void delay_ms(uint Count)
* 功 能: 延时Count个ms
**************************************************************************/
void delay_ms(register uint Count){
register uchar T;
for(;Count>0;Count--){
for(T=0;T<80;T++){
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
DogReset();
}
}
/**************************************************************************
* 函数原型: uchar ButtonScan(void);
* 功 能: 对按钮进行扫描,返回按钮值
**************************************************************************/
uchar key_scan(void){
uchar ikey;
ikey=~(P3&0x0f)&0x0f;
return(ikey&0x0f);
}
/**************************************************************************
* 函数原型: uchar ButtonScan(void);
* 功 能: 对按钮进行扫描,返回按钮值
**************************************************************************/
uchar ButtonAction(void){
uchar cButton;
cButton=key_scan();
if(cButton==cBtnVal){
if(cButton==vBtnVal_Null) // 无按键
return(vBtnAct_Null);
else // 按键保持
return(vBtnAct_Keep);
}
else{
delay_ms(20);
if(key_scan()==cButton){
cBtnVal=cButton;
if(cButton==vBtnVal_Null){ // 按键弹起
return(vBtnAct_Pop);
}
else{ // 按键按下
return(vBtnAct_Push);
}
}
}
}
/**************************************************************************
* 函数原型: void ButtonHandle(void);
* 功 能: 处理按钮输入
**************************************************************************/
void ButtonHandle(void){
uchar cBtnType;
DogReset();
cBtnType=ButtonAction();
if(cBtnType==vBtnAct_Push){
switch(cBtnVal){
case vBtnVal_StartUp:
if(++KeyNum>3){
KeyNum=0;
}
switch(KeyNum){
case WaitSpeed:
b_Power=STOP;
break;
case LoSpeed:
SetNum = 0;
b_Power = WORK;
cTime = 10;
break;
case MiSpeed:
SetNum = 0;
b_Power = WORK;
cTime = 6;
break;
case HiSpeed:
SetNum = 0;
b_Power = WORK;
cTime = 2;
break;
default:
break;
}
default:
break;
}
DogReset();
}
}
/**************************************************************************
* 函数原型: void SpeedControl(bit Drt, uint TurnNum);
* 功 能: 处理速度变化(ctemp采用范围控制,Pre_Pulse 脉冲采用精确控制)
**************************************************************************/
void SpeedControl(bit Drt){
uchar i;
if(b_Power){
if(Drt){
P1&=0xf8;
P1|=StepTab1[i++];
delay_1us(10);
P1&=0xf8;
}
else{
P1&=0xf8;
P1|=StepTabRev1[i++];
delay_1us(10);
P1&=0xf8;
}
if(i>2){
i=0;
if(++SetNum >= vSetNum){
// b_Power = STOP;
}
}
}
}
/**************************************************************************
* 函数原型: void SpeedControl(bit Drt, uint TurnNum);
* 功 能: 处理速度变化(ctemp采用范围控制,Pre_Pulse 脉冲采用精确控制)
**************************************************************************/
/*
void SpeedControl(bit Drt){
uchar i;
if(b_Power){
if(Drt){
P1&=0xf8;
P1|=StepTab1[i++];
}
else{
P1&=0xf8;
P1|=StepTabRev1[i++];
}
if(i>5){
i=0;
if(++SetNum >= vSetNum){
// b_Power = STOP;
}
}
}
}
/**************************************************************************
* 函数原型: void Para_initial(void);
* 功 能: 参数初始化
**************************************************************************/
void Para_initial(void){
b_Power = STOP;
SpeedType = WaitSpeed;
cDY_Clock = 0xff;
KeyNum=0;
cT01ms = vT01ms;
cT10ms = vT10ms;
cT100ms = vT100ms;
cT01s = vT01S;
Time_01ms = 0;
}
/**************************************************************************
* 函数原型: void system_initial(void);
* 功 能: 系统初始化
**************************************************************************/
void system_initial(void){
IE=0;
DogReset(); // 已针对 STC89C58RD+ 作修改.06-04-06
Para_initial();
TCON =0x50; // TR0=1
SCON =0x50;
TMOD =0x21; // T0:Time 16bit; T1:8位自动重装载.
TH0 =vT0HVal; // T0:系统计时.
TL0 =vT0LVal;
ET0 =1;
TR0 =1; // 启动波特率发生器
TH1 = vBaudTime; // 波特率目前为9600Hz
PCON&=0x7f; // 串口通信速率倍数为1
ET1 =1;
TR1 =0; // 启动波特率发生器
ES =1; // 允许串口中断
IP =0x02; // T0 优先级高
IPH =0x12; //PT2H=1,PT0H=1
EA =1;
}
/**************************************************************************
* 函数原型: void main(void);
* 功 能: 主程序
**************************************************************************/
void main(void){
system_initial();
while(1){
DogReset();
ButtonHandle();
// if(b_Power){
// SpeedControl(Forward);
// }
}
}
/**************************************************************************
* 函数原型: void T0_INT(void) interrupt 1 using 1;
* 功 能: 全局定时
**************************************************************************/
void T0_INT(void) interrupt 1 using 0{
TH0 = vT0HVal; // 时基0.1ms
TL0 = vT0LVal;
/*
if(Time_01ms++>12){
Time_01ms=0;
}
*/
if(!(--cT01ms)){ //1ms
cT01ms=vT01ms;
if(!(--cT10ms)){ //10ms
cT10ms=vT10ms;
SpeedControl(Forward);
if(!(--cT100ms)){ //100ms
cT100ms=vT100ms;
if(!(--cT01s)){ //1s
cT01s=vT01S;
}
}
}
}
}
/**************************************************************************
* END
* END
**************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -