步进电机的上位机控制 VB_第1页
步进电机的上位机控制 VB_第2页
步进电机的上位机控制 VB_第3页
步进电机的上位机控制 VB_第4页
步进电机的上位机控制 VB_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、附录1 PC机控制界面设计程序Public zhuanxiang As StringPrivate Sub Combo1_Change()Combo1.ListIndex = 0End SubPrivate Sub Command1_Click()If Command1.Caption = "启动" Then MSComm1.Settings = "2400,n,8,1" MSComm1.CommPort = Combo1.ListIndex + 1 MSComm1.PortOpen = True Command1.Caption = "停止&

2、quot; MSComm1.Output = "F" '停机 MSComm1.InputMode = comInputModeBinary MSComm1.InputLen = 0Else Command1.Caption = "启动" MSComm1.Output = "E" '开机 MSComm1.PortOpen = FalseEnd IfEnd SubPrivate Sub Command2_Click() EndEnd SubPrivate Sub DOWN_Click()MSComm1.Output = &

3、quot;D" '减速End SubPrivate Sub LEFT_Click()MSComm1.Output = "B" '左转,leftzhuanxiang = "正转"Text3.Text = zhuanxiangEnd SubPrivate Sub RIGHT_Click()MSComm1.Output = "A" '右转,rightzhuanxiang = "反转"Text3.Text = zhuanxiangEnd SubPrivate Sub Timer1_Time

4、r()Dim speed As VariantDim indate As ByteIf MSComm1.InBufferCount > 0 Thenspeed = MSComm1.Inputindate = AscB(speed)Text1.Text = indateEnd IfEnd SubPrivate Sub UP_Click()MSComm1.Output = "C" '加速End Sub附录2 下位机控制程序#ifndef _INIT2_H_#define _INIT2_H_#include <c8051f340.h>#include &

5、quot;design4.h"void delayms(uchar k);void delayus(uchar k);void DateIN595(uchar date);void init_btlv();#endif#include <c8051f340.h>#include "design4.h"#include "init.h"extern uint HZ;/延时程序约为0.5msvoid delayms(uchar k)uchar i,j;for(i=k;i>0;i-)for(j=110;j>0;j-);/延时程

6、序约为4usvoid delayus(uchar k) while (k-) NOP; NOP; NOP; /配置c8051寄存器,p为推挽输出/p2.4. 6 7为推挽出/初始化波特率发生器:定时器1,工作在/模式2,波特率为9600void init_btlv()/初始化系统时钟/内部高频振荡器使能,系统时钟为内部高频振荡器输出(不分频)REG0CN=0X00;OSCICN |= 0x83; /不分频,实用内部12M晶振,系统时钟为12MOSCICL=0X00;/内部晶振工作在最高频OSCXCN=0X00; /禁止内部L-F振荡OSCXCN=0X00; /关闭外部振荡器SCO

7、N0=0X50;/配置UART0控制寄存器,8位数据,允许接收TMOD=0X21;/定时器1工作在方式2 TH1= 256-(12000000/2400/24); /定时器1为12MHZ,12分频,TI0=0;/CKCON=0X00; /定时器1用系统时钟12分频作为它的时基/REN=1; TH0=(65536-HZ)/256; /定时1000um产生一次中断 TL0=(65536-HZ)%256;/ TR0=1;ET0=1;TR1=1;EA=1;ES0=1;/初始化交叉开关,配置I/O口P0MDOUT=0X10;/将P0.4(TX0)为推挽,P0.5(RX0)为开漏XBR0=0X01;/将T

8、X0,RX0连接到端口引脚XBR1=0X40;/开交叉开关PCA0MD&=0XBF; /关看门狗P1MDOUT=0X34; /推挽方式。设置数码管相关管脚使能,P2MDOUT=0X03;CKCON = 0x04; /TIMER0使用系统时钟12M /将数据送入595,并且高位先送入595中,SH上升沿将数据从DateIn中/串行进入595中,等到ST的上升沿将数据并行输出void DateIN595(uchar date)uchar i;uchar temp=date;for(i=0;i<8;i+)if(temp&0x80)DateIn=1;elseDateIn=0;te

9、mp<<=1;NOP;NOP;SH=0;delayus(1);SH=1;delayus(1);SH=0;#ifndef _INIT1_H_#define _INIT1_H_#include <intrins.h>#include <c8051f340.h>#define ulong unsigned long#define uchar unsigned char#define uint unsigned int#define NOP _nop_()#define LEFT 5/电机顺时针转#define RIGHT 7 /电机逆时针转#define UP 6

10、 /电机加速#define DOWN 8/电机减速#define STOP 9 /电机停机#define START 1/电机开始工作sbit CK=P20;/产生脉冲输出,加到驱动板上sbit CW=P21;/控制电机正反转sbit key_int=P07; /矩阵键盘sbit key_h1=P24;sbit key_h2=P26;sbit key_h3=P27;sbit SH=P14; / 74HC595芯片,串入并出,在SH上升沿时候串入sbit ST=P15;/ 74HC595芯片,在ST上升沿时候串出sbit DateIn=P12; /将键盘第一行P2.4设置为推挽方式输出1,以便读

11、取第一行哪个键按下#define FIRST_LINE_SET P2MDOUT=0X10,key_h1=1; /将键盘第er行P2.6设置为推挽方式输出1,以便读取第一行哪个键按下#define SECOND_LINE_SET P2MDOUT=0X40,key_h2=1; /将键盘第san行P2.7设置为推挽方式输出1,以便读取第一行哪个键按下#define THIRD_LINE_SET P2MDOUT=0X80,key_h3=1;uchar keyscanf();void motor_dis();void round();#endif/*课程设计第四次设计采用W1-2相(011)细分法,控制

12、步进电机正反转,加减速,数码管前三位显示累计转的圈数,第四位显示转向,1表示正转,0表示反转。第五六两位显示转速,转速为五个档位* */#include <c8051f340.h>#include "design4.h"#include "init.h" uchar code table= /数码管显示数组0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;ulong round_count; /电机转的总圈数uint HZ;uchar key_val;uchar coder6; /装转速,转的

13、圈数,和转向int timee=0;uchar receive_data=0; /从上位机接受到的数据bit right_flag=0; /从上位机接受到的数据,控制电机左转标志位bit left_flag=0;/从上位机接受到的数据,控制电机右转标志位bit up_flag=0;/从上位机接受到的数据,控制电机加速标志位bit down_flag=0;/从上位机接受到的数据,控制电机减速标志位bit stop_flag=0; /从上位机接受到的数据,控制电机停机标志位bit start_flag=0; /从上位机接受到的数据,控制电机开机标志位/*/下表为3X3键盘安扫描方式时,各个按键的键

14、值;通过判断键值可以知道是某个按下按下 FIRST_LINE_SET为第一行 P2MDOUT=0X10,key_h1=1; P24口为1是的寄存器配置,SECOND_LINE_SET,THIRD_LINE_SET为第二行,第三行的相关管脚的寄存器配置 P24=1 P25(h2) P26(h3)P07(int) key1 000 key4 100 key7 010 P26=1 P24(h1) P27(h3) P07(int) key2 1 0 0 key5 000 key8 010 P27=1 P24(h1) P26(h2)P07(int) key3 100 key6 010 key9 000/

15、*/uchar keyscanf()FIRST_LINE_SET;/检测第一行键盘delayms(15);if(!key_h2)&&(!key_h3)&&(!key_int)return (1);else if(key_h2)&&(!key_h3)&&(!key_int)return (4);else if(!key_h2)&&(key_h3)&&(!key_int)return (7);SECOND_LINE_SET;/检测第二行键盘delayms(15);if(key_h1)&&

16、(!key_h3)&&(!key_int)delayms(10);if(key_h1)&&(!key_h3)&&(!key_int) while(key_h1)&&(!key_h3)&&(!key_int); return (2); else if(!key_h1)&&(!key_h3)&&(!key_int)delayms(10);if(!key_h1)&&(!key_h3)&&(!key_int) while(!key_h1)&&(

17、!key_h3)&&(!key_int); return (5);else if(!key_h1)&&(key_h3)&&(!key_int)delayms(10);if(!key_h1)&&(key_h3)&&(!key_int) while(!key_h1)&&(key_h3)&&(!key_int); return (8);THIRD_LINE_SET;/检测第三行键盘delayms(15);if(key_h1)&&(!key_h2)&&(!ke

18、y_int)delayms(10);if(key_h1)&&(!key_h2)&&(!key_int) while(key_h1)&&(!key_h2)&&(!key_int); return (3);else if(!key_h1)&&(key_h2)&&(!key_int)delayms(10);if(!key_h1)&&(key_h2)&&(!key_int) while(!key_h1)&&(key_h2)&&(!key_int

19、); return (6);else if(!key_h1)&&(!key_h2)&&(!key_int)delayms(10);if(!key_h1)&&(!key_h2)&&(!key_int) while(!key_h1)&&(!key_h2)&&(!key_int); return (9); return (0); /没有任何键按下返回0 /通过判断按键值 让电动机做相应void motor_dis()uint speed_round;key_val=keyscanf();if(STOP=k

20、ey_val)|(stop_flag)/按键值为9时候,电机停机 stop_flag=0;key_val=0; TR0=0; CK=0;if(START=key_val)|(start_flag)/按键值为1时候,电机kaijistart_flag=0;key_val=0; TR0=1;if(RIGHT=key_val)|(right_flag) /按键值为7时候,电机反转right_flag=0;key_val=0; CW=0; coder2=0;if(LEFT=key_val)|(left_flag) /按键值为5时候,电机正转left_flag=0;key_val=0; CW=1; co

21、der2=1;if(UP=key_val)|(up_flag)/按键值为6时候,电机加速,timee为延时时间,up_flag=0; /加速时候让送脉冲的时间间隔变短key_val=0;timee+;if(timee>=6)timee=5;switch (timee)case 0:HZ=15000;break;case 1:HZ=10000;break;case 2:HZ=7000;break;case 3:HZ=5000;break;case 4:HZ=2000;break;case 5:HZ=1000;break;speed_round=50000/HZ; /转速SBUF0=spee

22、d_round;if(DOWN=key_val)|(down_flag) /按键值为8时候,电机加速,timee为延时时间 down_flag=0; /加速时候让送脉冲的时间间隔变长key_val=0;timee-;if(timee<=0)timee=0;switch (timee)case 0:HZ=15000;break;case 1:HZ=10000;break;case 2:HZ=7000;break;case 3:HZ=5000;break;case 4:HZ=2000;break;case 5:HZ=1000;break;speed_round=50000/HZ; /转速SB

23、UF0=speed_round; /计算转速void round()uint aa,bb,i;/uchar *tab;aa=round_count/200;/转的圈数bb=50000/HZ; /转速/uart0_sendspeed(bb);coder5=aa/100;coder4=aa%100/10;coder3=aa%10;/coder2=0;coder1=bb/10;coder0=bb%10;for(i=0;i<6;i+)DateIN595(tablecoderi);/送给第六个数码管ST=0;delayms(1);ST=1;delayms(2);ST=0;void init_seg()uchar i;for(i=0;i<6;i+)DateIN595(tablecoder0);/送给第六个数码管ST=0;delayms(1);ST=1;delayms(2);ST=0;void main() uchar i;TR0=0;/start_flag=1;电机初始状态为停止PS0=1;/UART0中断高优先级PT0=0; /定时器0中断低优

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论