前言
前段时间老师给了我一个项目,让我用HMI USART串口屏控制步进电机,事成之后有报酬嘿嘿,现在做完了,总结一下,废话不多说,直接上效果,工程代码在总结处。
一、效果
《关于我用HMI USART串口屏做了一个步进电机控制器这件事》
二、屏幕设计
主界面:
移动控制界面:
间歇运动界面:
三、部分代码
1.main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "usmart.h"
#include "key.h"
#include "driver.h"
#include "exti.h"
u32 frequency=2000;//1000-4000
long num=2000;//0-160*1000
unsigned char str[8];
u32 speed;
int left=0,right=1;
void RST(int front)
{
if(front==left)
{
while(1)//左复位
{
if(!KEY0||page!=14)
{
delay_ms(10);
if(!KEY0||page!=14)
break;
}
else
Locate_Rle(150000,4000,CW);
}
}
else
{
while(1)//左复位
{
if(!KEY1||page!=15)
{
delay_ms(30);
if(!KEY1||page!=15)
break;
}
else
Locate_Rle(150000,4000,CCW);
}
}
TIM_Cmd(TIM8, DISABLE);
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(9600); //初始化串口波特率为9600
usmart_dev.init(84); //初始化USMART
LED_Init(); //初始化LED
EXTIX_Init(); //初始化外部中断输入
Driver_Init(); //驱动器初始化
TIM8_OPM_RCR_Init(999,168-1); //1MHz计数频率 单脉冲+重复计数模式
page=0;
// RST(left);
while(1)
{
switch(page)
{
case 0:
TIM_Cmd(TIM8, DISABLE); //使能TIM8
break;
case 2:
Locate_Rle(distance,frequency,CW);
break;//顺时针转向右
case 1:
Locate_Rle(distance,frequency,CCW);
break;//逆时针转向左
case 3:frequency=1000;//速度设置
break;
case 4:frequency=2000;
break;
case 5:frequency=3000;
break;
case 6:frequency=4000;
break;
case 7:frequency=100;distance=20;//速度位移设置
break;
case 8:frequency=1000;distance=200;break;
case 9:frequency=1000;distance=1000;break;
case 10:frequency=1000;distance=2000;break;
case 13:flag=1; //间歇运动
while(flag)
{
Locate_Rle(distance,frequency,CW);
}
flag=1;
delay_ms(1000);
while(flag)
{
Locate_Rle(distance,frequency,CCW);
}
flag=1;
delay_ms(1000);
break;
case 14:
RST(left);
page=0;
break;
case 15:
RST(right);
page=0;
break;
case 16:
break;
case 17:
break;
}
}
}
2.usart.c
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
if(page==11&&num_flag<2)//运动位移设置
{
numbuf[num_flag]=Res;
num_flag++;
if(num_flag==2)
{
distance=(numbuf[1]*256+numbuf[0])*20;
num_flag=0;
page=0;
}
}
else if(page==12&&num_flag<2)//间歇运动位移设置
{
numbuf[num_flag]=Res;
num_flag++;
if(num_flag==2)
{
distance=(numbuf[1]*256+numbuf[0])*20;
num_flag=0;
page=13;
}
}
else
{
switch(Res)
{
case 0x00:page=0;break;
case 0x01:page=1;break;
case 0x02:page=2;break;
case 0x03:page=3;break;
case 0x04:page=4;break;
case 0x05:page=5;break;
case 0x06:page=6;break;
case 0x07:page=7;break;
case 0x08:page=8;break;
case 0x09:page=9;break;
case 0x0a:page=10;break;
case 0x0b:page=11;break;
case 0x0c:page=12;break;
case 0x0e:page=14;break;
case 0x0f:page=15;break;
case 0x10:page=16;break;
case 0x11:page=17;break;
}
}
}
3.其余代码
这个工程是基于正点原子步进电机控制程序的,工程代码我已经打包好上传,有需要的小伙伴可以在评论区留言。
总结:参考+工程代码
工程代码及屏幕设计文件:HMI USART串口屏步进电机控制.zip