串口通讯与步进电机驱动
这个实验的内容是:电脑通过虚拟的COM端口与单片机进行相互通讯(电脑发给单片机,然后单片机又把接收到的信息发给电脑),发送的信息分别为正转、反转、加速、减速、停止,来控制电机做出相应的反应,并在Proteus上仿真。
模拟串口通讯需要用到2个软件,这里是网盘下载链接:
串口助手
提取码:rzqe
虚拟串口驱动
提取码:1172
这个实验有一个重要的问题,就是一定要选对虚拟串口和波特率,要不然就会不能进行通讯或是通讯时出现乱码。COM端口使用要配对,COM1-COM2,COM3-COM4,优先推荐使用COM3-COM4,波特率最好设置低一点,因为我传输时没有校验位,波特率太高的话容易出现乱码,所以我选择的波特率是4800。再就是程序中设置波特率初值,如果你设置了波特率加倍的话,最终波特率要在波特率的初值上乘以2,注意程序设置的波特率与串口助手要一致。
Proteus图:
具体实现方式请看下面的程序:
#include"main.h"// 五条信息的Unicode 码如下
//正转:d5 fd d7 aa
//反转:b7 b4 d7 aa
//加速:bc d3 cb d9
//减速:bc f5 cb d9
//停止:cd a3 d6 b9void main(){UsartInit(); //串口初始化timer0_init(); //定时器初始化while(1){setmotor(); //控制电机状态的函数}
}
#ifndef __MAIN_H__
#define __MAIN_H__#include"setmotor.h"#include"usart.h"#endif
#include"setmotor.h"static unsigned char state=0; //赋0、1、2分别表示电机的三个状态
static unsigned char k=4; //k值决定电机速度的大小,k值越小电机的速度就越大,k值代表延时的长度
static int i;
unsigned char code zz[]={0x11,0x31,0x21,0x61,0x41,0xc1,0x81,0x91};//正转四相八拍步进电机
unsigned char code fz[]={0x91,0x81,0xc1,0x41,0x61,0x21,0x31,0x11};//反转//电机正转
void motor_zz(){unsigned int j;for(j=0;j<8;j++){P1=zz[j];//每一拍延时一下for(i=0;i<k;i++){unsigned int t;for(t=0;t<3;t++){timer0_init();while(~TF0); //当定时器溢出时,TF0为1,退出循环TF0=0; //置0后方便下一次溢出提醒 }}}
}//电机反转
void motor_fz(){unsigned int j;for(j=0;j<8;j++){P1=fz[j];for(i=0;i<k;i++){unsigned int t;for(t=0;t<3;t++){timer0_init();while(~TF0);TF0=0; }}}
}void setmotor(){while(state==0){ //状态0有两种模式分别是正转和反转,也是首次能执行的命令//正转if(com[0]==0xd5&&com[1]==0xfd&&com[2]==0xd7&&com[3]==0xaa){ //正转的Unicode码state=1; //可以进入状态1com[1]=0x00; //如果不改变其中一个com[4]的值,后面就不会执行motor_zz()break; //跳出while循环}//反转if(com[0]==0xb7&&com[1]==0xb4&&com[2]==0xd7&&com[3]==0xaa){state=2; //可以进入状态2com[1]=0x00; //如果不改变其中一个com[4]的值,后面就不会执行motor_fz()break;}}//已经正转while(state==1){//电机停止if(com[0]==0xcd&&com[1]==0xa3&&com[2]==0xd6&&com[3]==0xb9){state=0;com[1]=0x00;break;}//电机正转if(com[0]==0xd5&&com[1]==0xfd&&com[2]==0xd7&&com[3]==0xaa){state=1;com[1]=0x00;break;}//电机反转if(com[0]==0xb7&&com[1]==0xb4&&com[2]==0xd7&&com[3]==0xaa){state=2;com[1]=0x00;break;}//电机加速if(com[0]==0xbc&&com[1]==0xd3&&com[2]==0xcb&&com[3]==0xd9){k=k-1; //减小k值if(k<1)k=1; //减到1为止}//电机减速if(com[0]==0xbc&&com[1]==0xf5&&com[2]==0xcb&&com[3]==0xd9){k=k+1;if(k>10)k=10; }motor_zz();}//已经反转while(state==2){//电机停止if(com[0]==0xcd&&com[1]==0xa3&&com[2]==0xd6&&com[3]==0xb9){state=0;com[1]=0x00;break;}//电机正转if(com[0]==0xd5&&com[1]==0xfd&&com[2]==0xd7&&com[3]==0xaa){state=1;com[1]=0x00;break;}//电机反转if(com[0]==0xb7&&com[1]==0xb4&&com[2]==0xd7&&com[3]==0xaa){state=2;com[1]=0x00;break;}//电机加速if(com[0]==0xbc&&com[1]==0xd3&&com[2]==0xcb&&com[3]==0xd9){k=k-1;if(k<1)k=1;}//电机减速if(com[0]==0xbc&&com[1]==0xf5&&com[2]==0xcb&&com[3]==0xd9){k=k+1;if(k>10)k=10;}motor_fz();}
}
#ifndef __SETMOTOR_H__
#define __SETMOTOR_H__#include"usart.h"#include"timer0_init.h"extern unsigned char com[4];void setmotor();#endif
#include"usart.h"unsigned char com[4]={0,0,0,0}; //因为两个汉字对应4个Unicode码
static unsigned int i=0;void UsartInit(){SCON=0x50; //选择串口工作方式1并允许接收TMOD=0x20; //选择定时器工作方式2,可以初值重装载PCON=0x80; //波特率加倍TH1=0xf3; //波特率初值为2400,加倍后就是4800TL1=0xf3; //TH1的初值不会变,用来赋值给TL1 ES=1; //串口中断允许位EA=1; //打开总中断TR1=1; //开启定时器中断
}void receivedata() interrupt 4{if(RI==0) return; //单片机没有收到信息,就直接退出函数ES=0; //关掉串口中断,以防多条信息输入时,来不及执行前面的代码RI=0; //接收完一条信息后,RI是为1的,表示接收完成,我们要手动把RI置0com[i]=SBUF; //接收的信息是放在SBUF缓存器中,我们要把它读取出来,方便SBUF接收下一次信息的输入SBUF=com[i]; //再把接收的信息发给上位机(电脑),这两个SBUF是不同的,只是命名一样i++; //分四次就接受两个汉字的Unicode码while(!TI); //判断信息是否发送完成,完成了TI就会为1,跳出循环TI=0; //手动置0,用于下一次的判断if(i>=4)i=0;ES=1; //一条信息完整发送成功,再打开串口中断,接收下一条信息
}
#ifndef __USART_H__
#define __USART_H__#include"reg52.h"void UsartInit();#endif
#include"timer0_init.h"void timer0_init(){EA=1;ET0=1;TR0=1;TMOD|=0x01;//定时器工作模式为1,因为还使用了定时器工作方式2,所以TMOD后要有“|”TH0=0xd8;//定时器延时10msTL0=0xf0;
}
#ifndef __TIMER0_INIT_H__
#define __TIMER0_INIT_H__#include"reg52.h"void timer0_init();#endif
串口通讯与步进电机驱动相关推荐
- 57步进电机驱动板,可以通过编码器调速,支持SPI通讯屏显示,485通讯
57步进电机驱动板,可以通过编码器调速,支持SPI通讯屏显示,485通讯. 板子上面有电位器可电流设定或者485改电流设定. 最大电流支持4.5A,如果需要更大电流需要改元器件参数. 有启停和方向按键 ...
- a4988 脉宽要求_基于STM32的微型步进电机驱动控制器设计
基于STM32的微型步进电机驱动控制器设计 摘 要: 设计了一种微型步进电机驱动控制器,通过上位机界面修改步进电机转速.旋转角度.细分系数.该设计以STM32F103T8U6作为主控制器,以A4988 ...
- arduino 步进电机驱动库_一文看懂arduino驱动uln2003操作步进电机的方法
arduino驱动uln2003操作步进电机的方法 1.网上买的步进电机,很多接线顺序都不对.经过不懈努力查资料,终于找到了能用的接线方式: 电机上的12345针脚,对应着接线端子的42135. 2. ...
- STM32F103步进电机驱动简单控制
stm32f103步进电机驱动控制 一.硬件接线方法 本文采用混合式二相步进电机-J8HB2401-野火42步进电机,驱动器为野火EBF-MSD4805,下面是常用接线方式: 如上图所示通常采用共阴接 ...
- STC51单片机35——五线四相步进电机驱动测试程序(2个步进电机)
/*-------------------------------------------------------------------------------- MCU: ...
- 基于单片机的步进电机驱动电路设计
基于单片机的步进电机驱动电路设计 步进电机在控制系统中具有广泛的应用.它可以把脉冲信号转换成角位移,并且可用作电磁制动轮.电磁差分器.或角位移发生器等. 有时从一些旧设备上拆下的步进电机(这种电机一般 ...
- 基于STM32单片机闭环步进电机驱动调速仿真(仿真+源码+全套资料)
资料编号:081 (1) 基本功能:本任务通过输出脉冲控制步进电机的停止.运动.方向.使用 两个按键分别控制步进电机的正转和反转,再次按下这两个按键,步进电机停止, 同时 LCD 显示电机状态信息. ...
- 串口 发送 接收 高位_电工进阶PLC大神,必备PLC串口通讯的基本知识!
戳上方蓝字"技成电工课堂"快速关注!!! 电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗?1,什么是串口通讯? ...
- plc和pc串口通讯接线_让你搞懂PLC串口通讯和通讯接口,这东西估计没几个能说清楚~...
电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗? 1,什么是串口通讯? 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线 ...
最新文章
- oracle排序后的第一条记录
- 遮掩java_Java×××:重载、重写、隐藏、遮蔽、遮掩(2)
- python字符串大全_python学习笔记:字符串操作大全
- 【51Nod-1100】 斜率最大(贪心)☆双排序
- 人生历练必备的十个心态(图)
- 如何设置的单位为m_如何将视频设置为网页背景
- 【SSM 整合项目】图书管理系统
- NYOJ-915 +-字符串(贪心)
- NBOJ 1184 Elaine's Queue deque的运用
- GeoServer style(sld)中文乱码解决方法
- 403高校毕业设计选题
- java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org
- 论文专利博客写作总结
- 那些以玩笑说出口的话,往往是最真的表达
- 使用Amazon SNS,发邮件
- Whale帷幄 - 智慧化门店 智慧化运营
- 什么是方法的重载?(Java)
- 百度地图获取省市边界、设置图片背景
- 【第3版emWin教程】第53章 emWin6.x的按钮Button控件
- module ‘gast‘ has no attribute ‘Num‘ 警告
热门文章
- 柯美打印机服务器显示代码09,柯美数码复印机故障代码及维修模式【最新】.docx...
- html5中display属性,display的属性
- ThreadLocal中的WeakReference
- VMware挂载共享盘
- PlantSimulation:Material Flow介绍
- php兑换接口,php积分兑换接口实例
- jar包反编译,查看源代码【转载】
- GeoMesa源码学习 (2):创建Schema并导入数据
- 以考代评高级职称||信息系统项目管理师一贴打尽,你想知道的都在这
- 免费 PSD 下载: 20个精美的登录和注册表单