|
发表于 2022-7-20 19:45:35
|
显示全部楼层
/*************************************************************************************************************
* 测试说明
*1、MCU:STC89C52RC
*2、测试频率:12Mhz
*2、编程语言:C51
*2、编译环境:Keil C
*2、功能:全速正转、全速反转、停止、调速运行
*************************************************************************************************************/ #include <reg52.h> //TB6560输入控制端定义
sbit CLK = P1^0;
sbit ENA = P1^1;
sbit DIR = P1^2; sbit CW = P3^0; //正转运行按键
sbit STOP = P3^1; //停止运行按键
sbit CCW = P3^2; //反转运行按键
sbit ADJ1 = P3^3; //调速运行按键
sbit ADJ2 = P3^4; //调速运行按键
bit Run_Status; //运行状态位标志,
//=0表示电机在停止状态,可以按键正转、反转均可
//=1表示电机在运行状态,不支持正反转按键,只有先停止。防止强行换向带来的电流过大。 unsigned char Run_Dir; //电机运行方向 #define F_DIR 0 //正转
#define B_DIR 1 //反转 unsigned int CYCLE; //周期变量 /************************************************************************************************
** 函数名称: void Delay(unsigned int cnt)
** 功能描述: 简单的延时函数
** 输 入: cnt:0-65535之间的任意整数
** 输 出: 无
*************************************************************************************************/
void Delay(unsigned int cnt)
{
while(--cnt);
}
/************************************************************************************************
** 函数名称: void main(void)
** 功能描述: 主函数
** 输 入: 无
** 输 出: 无
*************************************************************************************************/
void main(void)
{
Run_Status=0; //=0表示电机在停止状态,可以按键正转、反转均可
CLK = 0;
ENA = 0;
while(1)
{
if(!STOP) //任何时候按停止键,电机停止运行
{
Delay(1000); //延时去抖动
if(!STOP)
{
Run_Status=0; //电机正在停止的状态标志
CLK = 0;
ENA = 0;
TR0=0;
}
}
if(!CW&&!Run_Status) //按正转键同时电机不是正在运行时,电机正转运行
{
Delay(1000); //按下延时去抖动
if(!CW&&!Run_Status)
{
Run_Status=1; //电机正在运行的状态标志
DIR = 0; //正转
ENA = 1;
CYCLE=2500; //脉冲频率 定时器设置 10ms in 12M crystal 即100Hz
TMOD |=0x01;
TH0=(65536-CYCLE)/256;
TL0=(65536-CYCLE)%256;
IE= 0x82; //打开中断
TR0=1;
Run_Dir=F_DIR; //电机运行方向正转
}
}
if(!CCW&&!Run_Status) //按反转键同时电机不是正在运行时,电机反转运行
{
Delay(1000); //延时去抖动
if(!CCW&&!Run_Status)
{
Run_Status=1; //电机正在运行的状态标志
DIR = 1; //反转
ENA = 1;
CYCLE=2500; //脉冲频率 定时器设置 10ms in 12M crystal 即100Hz
TMOD |=0x01;
TH0=(65536-CYCLE)/256;
TL0=(65536-CYCLE)%256;
IE= 0x82; //打开中断
TR0=1;
Run_Dir=B_DIR; //电机运行方向反转
}
}
if(!ADJ1)
{
Delay(5000); //延时去抖动
if(!ADJ1)
{
if(CYCLE<20000) CYCLE+=2000;
else CYCLE=1000;
Run_Status=1;
TR0=1;
}
}
// if(!ADJ2)
// {
// Delay(5000); //延时去抖动
// if(!ADJ2)
// {
// if(CYCLE>2000) CYCLE-=2000;
// Run_Status=1;
// TR0=1;
// }
// }
}
}
/************************************************************************************************
** 函数名称: Timer0_ISR
** 功能描述: 定时器0中断处理函数
** 输 入: 无
** 输 出: 无
*************************************************************************************************/
void Timer0_ISR(void) interrupt 1 using 1
{
TH0=(65536-CYCLE)/256;
TL0=(65536-CYCLE)%256;
CLK = ~CLK;
} |
|