📄 motor.c
字号:
#include <REG52.H>
#include <intrins.h>
#define uchar unsigned char //用uchar代替unsigned char
#define uint unsigned int //uint代替unsigned int
#define MotPort P1
#define TH0VAL -64608/256
#define TL0VAL -64608%256 //定时初始
uchar code Mot1Code[]={0xf2,0xf6,0xf4,0xfc,0xf8,0xf9,0xf1,0xf3}; //M1步码表
uchar code Mot2Code[]={0x2f,0x6f,0x4f,0xcf,0x8f,0x9f,0x1f,0x3f}; //M2步码表
uchar code SpeedTab[]={45,38,30,23,17,12,8,5,3,2}; //10级速度表
/*马达状态字定义
---------------------------------------------
MotorWorkMode | D3 | D2 | D1 | D0 | 16进制值
---------------------------------------------
M1停止M2正转 | 0 | 1 | x | 0 |0x4或0x6
---------------------------------------------
M1停止M2反转 | 1 | 1 | x | 0 |0xc或0xe
---------------------------------------------
M1正转M2停止 | x | 0 | 0 | 1 |0x1或0x9
---------------------------------------------
M1反转M2停止 | x | 0 | 1 | 1 |0x3或0xb
---------------------------------------------
M1正转M2正转 | 0 | 1 | 0 | 1 |0x5
---------------------------------------------
M1反转M2正转 | 0 | 1 | 1 | 1 |0x7
---------------------------------------------
M1正转M2反转 | 1 | 1 | 0 | 1 |0xd
---------------------------------------------
M1反转M2反转 | 1 | 1 | 1 | 1 |0xf
---------------------------------------------
*/
uchar bdata MotorWorkMode=0; //马达工作状态寄存器
sbit B_M1StartStop=MotorWorkMode^0; //M2运动/停止(0:停止;1:运动)
sbit B_M1Face=MotorWorkMode^1; //M2方向(0:正转;1:反转)
sbit B_M2StartStop=MotorWorkMode^2; //M1运动/停止(0:停止;1:运动)
sbit B_M2Face=MotorWorkMode^3; //M1方向(0:正转;1:反转)
sbit K_M1StartStop=P0^0; //M1停止/运行
sbit K_M1Face=P0^1; //M1方向
sbit K_M2StartStop=P0^2; //M2停止/运行
sbit K_M2Face=P0^3; //M2方向
sbit K_SpeedAdd=P0^4; //速度加
sbit K_SpeedDec=P0^5; //速度减
sbit P_M1H=P3^0; //M1上限
sbit P_M1L=P3^1; //M1下限
sbit P_M2H=P3^2; //M2上限
sbit P_M2L=P3^3; //M2下限
uchar count=1; //计数器
uchar SpeedStep; //速度级0-9
//主函数
void main()
{
TH0 = TH0VAL;
TL0 = TL0VAL; //定时器0初值
TR0 = 1; //定时器0开始计数
ET0 = 1; //开CTC0中断
EA = 1; //开总中断
P0=0xff;
while(1)
{
if (!K_M1StartStop)
{
while(!K_M1StartStop);
B_M1StartStop=!B_M1StartStop;
}
if (!K_M1Face)
{
while(!K_M1Face);
B_M1Face=!B_M1Face;
}
if (!K_M2StartStop)
{
while(!K_M2StartStop);
B_M2StartStop=!B_M2StartStop;
}
if (!K_M2Face)
{
while(!K_M2Face);
B_M2Face=!B_M2Face;
}
if (!K_SpeedAdd) //速度加
{
while(!K_SpeedAdd);
SpeedStep++;
if (SpeedStep==10) {SpeedStep=9;}
}
if (!K_SpeedDec) //速度减
{
while(!K_SpeedDec);
SpeedStep--;
if (SpeedStep==255) {SpeedStep=0;}
}
}
}
//定时器0中断
void Timer0(void) interrupt 1 using 2
{
static uchar M1Index,M2Index; //步码索引
TH0 = TH0VAL;
TL0 = TL0VAL; //定时器0初值
count--;
if (count==0)
{
count=SpeedTab[SpeedStep]; //根据速度级重装计数器,需要更快速度请更改定时器初值
switch (MotorWorkMode)
{
case 0x4:{if (P_M2H==1) {M2Index++;} break;} //M2正转,M1停止
case 0x6:{if (P_M2H==1) {M2Index++;} break;} //M2正转,M1停止
case 0xc:{if (P_M2L==1) {M2Index--;} break;} //M2反转,M1停止
case 0xe:{if (P_M2L==1) {M2Index--;} break;}
case 0x1:{if (P_M1H==1) {M1Index++;} break;} //M1正转,M2停止
case 0x9:{if (P_M1H==1) {M1Index++;} break;}
case 0x3:{if (P_M1L==1) {M1Index--;} break;} //M1反转,M1停止
case 0xb:{if (P_M1L==1) {M1Index--;} break;}
case 0x5:{if (P_M1H==1) {M1Index++;} if (P_M2H==1) {M2Index++;} break;} //M1正转,M2正转
case 0x7:{if (P_M1L==1) {M1Index--;} if (P_M2H==1) {M2Index++;} break;} //M1反转,M2正转
case 0xd:{if (P_M1H==1) {M1Index++;} if (P_M2L==1) {M2Index--;} break;} //M1正转,M2反转
case 0xf:{if (P_M1L==1) {M1Index--;} if (P_M2L==1) {M2Index--;} break;} //M1反转,M2反转
default:break;
}
if (M1Index==8)
{M1Index=0;}
else
{
if (M1Index==255) {M1Index=7;}
}
if (M2Index==8)
{M2Index=0;}
else
{
if (M2Index==255) {M2Index=7;}
}
MotPort=Mot1Code[M1Index]&Mot2Code[M2Index]; //输出M1和M2步码 ----驱动电机运动的代码
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -