📄 motor.c
字号:
#include <REG52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define MotPort P1
#define TH0VAL -64608/256 //初值928,1ms
#define TL0VAL -64608%256 //定时初始
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit rs = P2^0;
sbit rw = P2^1;
sbit ep = P2^2;
BYTE code dis1[] = {"preset: level "};
BYTE code dis2[] = {"wait for start.."};
BYTE code dis3[] = {"level: running"};
BYTE code dis4[] = {"speed: rpm"};
uchar code Mot1Code[]={0xf8,0xfa,0xf2,0xf6,0xf4,0xf5,0xf1,0xf9};//{0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1,0xf9}; //M1步码表
uchar code SpeedTab[]={50,38,30,25,15,12,8,5,3,2}; //10级速度表
uint code speed[]={3,4,5,6,10,13,19,30,50,75};//对应的速度码表
uchar bdata MotorWorkMode=0; //马达工作状态寄存器
sbit B_M1StartStop=MotorWorkMode^0; //M1运动/停止(0:停止;1:运动)
sbit B_M1Face=MotorWorkMode^1; //M1方向(0:正转;1:反转)
sbit K_M1StartStop=P2^4; //M1停止/运行
sbit K_M1Face=P2^5; //M1正向、反方向
sbit K_SpeedAdd=P2^6; //速度加
sbit K_SpeedDec=P2^7; //速度减
sbit P_M1H=P3^0; //M1上限
sbit P_M1L=P3^1; //M1下限
uchar count; //计数器
uchar SpeedStep;//速度级0-9
uchar disbuf[3];
uchar speedbuf[4];
void delay(BYTE ms);
BOOL lcd_bz(void);
void lcd_wcmd(BYTE cmd);
void lcd_pos(BYTE pos);
void lcd_wdat(BYTE dat);
void lcd_init(void);
void main()
{
BYTE i;
TH0 = TH0VAL;
TL0 = TL0VAL; //定时器0初值
TH1=(65536-50000)/256;
TH1=(65536-50000)%256;
TR0 = 1;
ET0 = 1;
TR1 = 1;
ET1 = 1;
EA = 1; //开总中断
P0=0xff;
lcd_init();
delay(10);
lcd_pos(0);
i = 0;
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x40);
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]);
i++;
}
while(1)
{
if (!K_M1StartStop) { while(!K_M1StartStop);B_M1StartStop=!B_M1StartStop;}
if (!K_M1Face) { while(!K_M1Face);B_M1Face=!B_M1Face;}
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; //步码索引
uchar i;
TH0 = TH0VAL;
TL0 = TL0VAL; //定时器0初值
count--;
if (count==0)
{
count=SpeedTab[SpeedStep]; //根据速度级重装计数器,需要更快速度请更改定时器初值
switch (MotorWorkMode)
{
case 0x1:{if (P_M1H==1)
{M1Index++; }
break;} //M1正转
case 0x3:{if (P_M1L==1)
{M1Index--; }
break;} //M1反转
default:break;
}
if (M1Index==8)
{M1Index=0;}
else
{
if (M1Index==255) {M1Index=7;}
}
MotPort=Mot1Code[M1Index]; //输出M1步码
}
}
/********************************************************/
void Timer1(void) interrupt 3
{
uchar i,j;
TH1=(65536-50000)/256;
TH1=(65536-50000)%256;
j++;
disbuf[0]=SpeedStep/100;
disbuf[1]=SpeedStep%100/10;
disbuf[2]=SpeedStep%10;
speedbuf[0]=speed[SpeedStep]/1000;
speedbuf[1]=speed[SpeedStep]%1000/100;
speedbuf[2]=speed[SpeedStep]%1000%100/10;
speedbuf[3]=speed[SpeedStep]%10;
if(j==20)
{
j=0;
if((MotorWorkMode&0x01)==0x00)
{
lcd_pos(0);
i = 0;
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x40);
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]);
i++;
}
}
else
{
lcd_pos(0);
i = 0;
while(dis3[i] != '\0')
{
lcd_wdat(dis3[i]);
i++;
}
lcd_pos(0x40);
i = 0;
while(dis4[i] != '\0')
{
lcd_wdat(dis4[i]);
i++;
}
}
switch(MotorWorkMode&0x3)
{
case 0x1:
{
lcd_pos(0x46);
lcd_wdat('+');
lcd_pos(0x06);
lcd_wdat(disbuf[0]+0x30);
lcd_pos(0x07);
lcd_wdat(disbuf[1]+0x30);
lcd_pos(0x08);
lcd_wdat(disbuf[2]+0x30);
lcd_pos(0x47);
lcd_wdat(speedbuf[0]+0x30);
lcd_pos(0x48);
lcd_wdat(speedbuf[1]+0x30);
lcd_pos(0x49);
lcd_wdat(speedbuf[2]+0x30);
lcd_pos(0x4a);
lcd_wdat(speedbuf[3]+0x30);
break;
}
case 0x0:
{
lcd_pos(0x07);
lcd_wdat('+');
lcd_pos(0x0d);
lcd_wdat(disbuf[0]+0x30);
lcd_pos(0x0e);
lcd_wdat(disbuf[1]+0x30);
lcd_pos(0x0f);
lcd_wdat(disbuf[2]+0x30);
break;
}
case 0x3:
{
lcd_pos(0x46);
lcd_wdat('-');
lcd_pos(0x06);
lcd_wdat(disbuf[0]+0x30);
lcd_pos(0x07);
lcd_wdat(disbuf[1]+0x30);
lcd_pos(0x08);
lcd_wdat(disbuf[2]+0x30);
lcd_pos(0x47);
lcd_wdat(speedbuf[0]+0x30);
lcd_pos(0x48);
lcd_wdat(speedbuf[1]+0x30);
lcd_pos(0x49);
lcd_wdat(speedbuf[2]+0x30);
lcd_pos(0x4a);
lcd_wdat(speedbuf[3]+0x30);
break;
}
case 0x2:
{
lcd_pos(0x07);
lcd_wdat('-');
lcd_pos(0x0d);
lcd_wdat(disbuf[0]+0x30);
lcd_pos(0x0e);
lcd_wdat(disbuf[1]+0x30);
lcd_pos(0x0f);
lcd_wdat(disbuf[2]+0x30);
break;
}
default:break;
}
}
}
/***************************************************/
void delay(BYTE ms)
{ // 延时子程序
BYTE i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
ep = 0;
return result;
}
void lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
void lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //
delay(1);
lcd_wcmd(0x0c); //
delay(1);
lcd_wcmd(0x06); //
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -