演示照片:
[演示程序(C51):]
/*****************************************************************/
/* *
/* ME300B单片机开发系统演示程序-1602LCD显示步进电机键控正反转实验 *
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
sbit K1 = P1^4; //运行与停止
sbit K2 = P1^5; //设定圈数
sbit K3 = P1^6; //方向转换
sbit K4 = P1^7; //速率调整
sbit BEEP = P3^7; //蜂鸣器
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
bit on_off=0; //运行与停止标志
bit direction=1; //方向标志
bit rate_dr=1; //速率标志
bit snum_dr=1; //圈数标志
uchar code cdis1[ ] = {" STEPPING MOTOR "};
uchar code cdis2[ ] = {"CONTROL PROCESS"};
uchar code cdis3[ ] = {" STOP "};
uchar code cdis4[ ] = {"NUM: RATE: "};
uchar code cdis5[ ] = {" RUNNING "};
uchar m,v=0,q=0;
uchar number=0,number1=0;
uchar snum=5,snum1=5; //预设定圈数
uchar rate=8; //预设定速率
uchar data_temp,data_temp1,data_temp2;
/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms
/*
/********************************************************/
void delay(uint t)
{
uchar k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
/********************************************************/
void delayB(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i<13; i++)
{ }
}
}
/********************************************************/
void beep()
{
uchar j;
for (j=0;j<100;j++)
{
delayB(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay(170);
}
/********************************************************/
/*
/*检查LCD忙状态
/*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。
/*
/********************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/********************************************************/
/*
/*写指令数据到LCD
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
/*
/********************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************/
/*
/*写显示数据到LCD
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
/*
/********************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************/
/*
/* LCD初始化设定
/*
/********************************************************/
void lcd_init()
{
delay(30);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //显示开,关光标
delay(5);
lcd_wcmd(0x06); //移动光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/********************************************************/
/*
/* 设定显示位置
/*
/********************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/********************************************************/
/*
/* LCD1602初始显示子程序
/*
/********************************************************/
void LCD_init_DIS()
{
delay(10); //延时
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis1[m] != '\0')
{ //显示字符
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
m = 0;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]); //显示字符
m++;
}
delay(3000); //延时
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis3[m] != '\0')
{ //显示字符
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
m = 0;
while(cdis4[m] != '\0')
{
lcd_wdat(cdis4[m]); //显示字符
m++;
}
for(m=0;m<2;m++)
{
lcd_pos(0x0c+m); //显示方向符号
lcd_wdat(0x3e);
}
}
/********************************************************/
/*
/*数据转换子程序
/*
/********************************************************/
void data_conv()
{
data_temp1=data_temp/10; //高位
if(data_temp1==0)
{data_temp1=0x20;} //高位为0不显示
else
{data_temp1=data_temp1+0x30;}
data_temp2=data_temp%10; //低位
data_temp2=data_temp2+0x30;
}
/********************************************************/
/*
/*数据显示子程序
/*
/********************************************************/
void data_dis()
{
data_temp = snum; //显示圈数
data_conv();
lcd_pos(0x44);
lcd_wdat(data_temp1);
lcd_pos(0x45);
lcd_wdat(data_temp2);
data_temp = rate; //显示速率
data_conv();
lcd_pos(0x4d);
lcd_wdat(data_temp1);
lcd_pos(0x4e);
lcd_wdat(data_temp2);
}
/********************************************************
/*
/* 显示运行方向符号
/*
/********************************************************/
void motor_DR()
{
if(direction==1) //正转方向标志
{ for(m=0;m<2;m++)
{
lcd_pos(0x0c+m); //显示方向符号
lcd_wdat(0x3e);
}
}
else
{ for(m=0;m<2;m++) //反转方向标志
{
lcd_pos(0x0c+m); //显示方向符号
lcd_wdat(0x3c);
}
}
}
/********************************************************
/*
/* 显示运行状态
/*
/********************************************************/
void motor_RUN()
{
if(on_off==1)
{ TR0=1;
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis5[m] != '\0')
{ lcd_wdat(cdis5[m]); //RUNNING
m++; }
motor_DR(); //
}
else
{ TR0=0; P1 =0xf0;
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis3[m] != '\0')
{ lcd_wdat(cdis3[m]); //STOP
m++; }
motor_DR(); //
snum=snum1; //
number1=0; //清圈数计数器
}
}
/********************************************************
*
* 主程序
*
*********************************************************/
main()
{
LCD_init_DIS();
TMOD = 0x01; //T0定时方式1
TL0 = 0x33;
TH0 = 0xf5;
EA = 1;
ET0 = 1;
P1 = 0xf0;
while(1)
{
if(K1==0)
{
beep();
while(K1==0); //等待键释放
on_off=~on_off;
motor_RUN();
} //K1 end
/********************************************************/
if(K2==0)
{
beep();
if(snum_dr==1)
{ snum++;
snum1=snum;
if(snum==0x14)
{ snum_dr=~snum_dr;}
}
else
{snum--;
snum1=snum;
if(snum==0x01)
{ snum_dr=~snum_dr; }
}
} //K2 end
/********************************************************/
if(K3==0)
{
beep();
direction=~direction;
motor_DR();
}//K3 end
/********************************************************/
if(K4==0)
{
beep();
if(rate_dr==1)
{ rate++;
if(rate==0x10)
{ rate_dr=~rate_dr;}
}
else
{
rate--;
if(rate==0x01)
{ rate_dr=~rate_dr; }
}
} //K4 end
/********************************************************/
if(number1==snum1) //与设定圈数是否相等
{ number1=0;
on_off=0;
TR0=0;
snum=snum1;
P1 =0xf0;
motor_RUN();
}
data_dis();
} // while(1) end
} //main end
/********************************************************/
/*
/* 定时器 0 中断
/*
/********************************************************/
void motor_onoff() interrupt 1
{
TL0 = 0x33;
TH0 = 0xf5;
q++;
if(q < rate)
{ return; }
else
{ q=0;
number++; //脉冲计数
if(number==96) //96个脉冲电机转一圈
{ snum--;
number=0;
number1++; } //电机转动圈数
if(direction==1) //方向标志
{ if(v<8)
{P1 = FFW[v];v++;} //取数据,正转
if(v==8)
{ v=0; }
}
else
{ if(v<8)
{P1 = REV[v];v++;} //取数据,反转
if(v==8)
{ v=0; }
}
}
}
/********************************************************/
ME300实例-1602LCD显示步进电机键控正反转实验-C
ME300实例-1602LCD显示步进电机键控正反转实验-C语言源代码
- 步进电机(145854)
相关推荐
51单片机实现步进电机的启停,圈数设定,正反转,速率调整,LCD1602显示等调节
51单片机实现步进电机(39BYG316/28BYJ48)的启停,圈数设定,正反转,速率调整,LCD1602显示等调节一、方案设计方案1:采用89C
2021-06-29 07:43:35
51单片机按键控制步进电机加减速及其正反转
之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。所用硬件:步进电机及驱动器
2021-06-28 07:31:42
1602LCD
小弟写了一个1602LCD代码,下到板子上发现液晶无显示,先确定是代码有问题,可用MODELSIM仿真发现功能实现正常,想搞时序仿真,但软件运行起来实在太卡了。望各位走过路过的高手不吝赐教
2014-04-28 23:24:23
1602LCD光标显示
我在做1602液晶显示的时候,遇到些困难,我想设置光标在一个位置不动,通过按键左移或者右移,但是光标显示开之后,光标就自动右移,不能控制,初始化如下:void lcd
2012-05-08 08:32:12
步进电机正反转控制c语言程序
步进电机正反转控制C语言程序,只为初学者只为初学者的步进电机正反控制程序#include#define uchar unsigned char#define uintunsigned
2021-07-05 06:41:16
步进电机控制系统设计一个开环步进电机控制系统
能够正常运转。②中断方式的转动。③启停。按KK1+键控制步进电机的启动。按KK2+键控制步进电机的停止。④正反转。开关K7控制步进电机的正反转。当K7向下拨时,电机正转(顺时针);向上拨时,电机反转(逆时针)。⑤在LED数码管上显示速度编号。K0对应1挡、K1对应2挡,其余类推。⑥调速。开关K6~K0分
2021-06-29 06:48:40
步进电机的正反向旋转c语言编程,实现步进电机自动正反转程序怎么写?
本文收集整理关于实现步进电机自动正反转程序怎么写的相关议题,使用内容导航快速到达。内容导航:Q1:用c语言程序实现步进电机的正反转加减速的编程内容:1、本程序用于测试4相步进电机常规驱动2、需要用跳
2021-06-29 06:09:19
AT89C51控制三个步进电机控制的正反转
能否帮我把12864的线接完,然后写一个C语言程序,控制三个步进电机的正反转,加减速。都要在液晶上面显示出来的,麻烦有时间的各位帮帮忙了
2012-04-21 20:01:24
python-树莓派通过按键控制步进电机正反转相关资料分享
电机驱动板。步进电机驱动原理要想驱动步进电机进行正常的正反转,就必须要先了解步进电机的驱动时序,此次选择28BYJ-48-5V是四相的电机,按照通电顺序不同可分为以下三种:单四拍,双四拍,八拍三种工作方式。下面将列出三种工作方式下的正反转时序:单四拍:正转:A - B - C - D
2021-06-28 10:16:00
基于51单片机下通过蓝牙串口控制LCD1602屏幕显示步进电机正反转以及转速设计
通过蓝牙串口控制LCD1602屏幕显示正反转以及转速简 述:通过蓝牙串口发送指定数据到STC89C52RC单片机,控制28BYJ-48步进电机正转或者反转或者速度的快中慢,然后51单片机,做相应
2021-07-05 08:13:33
如何实现对步进电机的正反转动控制?
前言 上一讲我们已成功实现对步进电机的正反转动控制,并简单的通过调节节拍间的延时时间实现了简单的转速控制(开环),这一节将继续给大学介绍在STM32中通过定时器方式来实现节拍间的精确延时操作,并
2021-07-08 08:30:20
怎样用单片机控制步进电机正反转以及加减速?
简介:用单片机控制步进电机正转 反转 加速 减速;由LCD1602实时显示步进电机的状态;F-正转,B-反转;数字越大,转速越大;仿真原理图如下:MCU和LCD1602显示模块:ULN2803驱动
2021-07-07 06:20:46
急!!求基于单片机的步进电机的C51程序和仿真!
本帖最后由 超先生 于 2016-4-13 12:16 编辑
步进电机型号28BYJ-48,电源5V,ULN2003驱动,LCD1602液晶显示,控制电机正反转加减速!
2016-04-13 11:25:56
按键控制c51单片机驱动unl2003控制步进电机正反转停止及程序调速
**按键控制c51单片机驱动unl2003控制步进电机正反转停止及程序调速** 分享一个萌新入门小工程一、原件连接:第一种直接用51开发板第二种用最小单元加unl2003驱动二、开发板电路三
2021-06-28 09:28:10
请问怎么提取步进电机正反转的信号?
论坛的各位大神们,步进电机输入两个信号然后正转和反转,怎样才能将这两个信号提取出来,我把四个黑、黄、棕、蓝四根线分别接到三极管B极上,E极统一接地,C极接89C51上,结果没什么作用。请问各位大神有没有什么办法把步进电机正反转的两组信号提取出来??
2020-07-21 08:10:35
控制步进电机正反转的实际应用程序
控制步进电机正反转的实际应用程序:/*这是一个控制步进电机正反转的实际应用程序*/ /*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/ /*p13口线用做步进电机的方向
2010-01-09 15:13:25146
ME300/ME500单片机开发系统编程控制软件
ME300/ME500开发系统编程控制软件:本软件可以同时支持伟纳ME300系列和ME500系列单片机开发系统(板)。伟纳ME系列单片机开发系统均具有实验仪、编程器、仿真器、ISP下载线四种功能
2010-04-20 19:15:5390
单片机视频教程15:1602LCD显示
《手把手教你学单片机》单片机视频教程15:1602LCD显示 单片机视频教程15:1602LCD显示 1、熟悉1602总线操作 2、尝试1602不同的操作,熟悉效果,比如流动显示等等
2012-08-21 09:50:4412345
电机正反转原理
电机正反转,代表的是电机顺时针转动和逆时针转动。电机顺时针转动是电机正转,电机逆时针转动是电机反转。正反转控制电路图及其原理分析要实现电动机的正反转只要将接至电动机三相电源进线中的任意两相对调接线即可达到反转的目的。电机的正反转在广泛使用,例如行车、木工用的电刨床、台钻、刻丝机、甩干机和车床等。
2019-01-07 15:12:40114880
使用LCD1602显示超声波控制电机正反转的使用程序和工程文件免费下载
本文档的主要内容详细介绍的是使用LCD1602显示超声波控制电机正反转的使用程序和工程文件免费下载。
2019-11-04 08:00:002
电机正反转 如何确定电机正反转
电机正反转是指电机顺时针转动和逆时针转动。电机顺时针转动是电机正转,电机逆时针转动是电机反转,实现电机的正反转,只需接至电机三相电源进线中的任意两相对调接线,即可达到电机正反转。
2021-07-15 15:34:0257929
单片机控制步进电机
简介:用单片机控制步进电机正转 反转 加速 减速;由LCD1602实时显示步进电机的状态;F-正转,B-反转;数字越大,转速越大;仿真原理图如下:MCU和LCD1602显示模块:ULN2803驱动
2021-11-10 19:51:0111
基于51单片机下通过蓝牙串口控制LCD1602屏幕显示步进电机正反转以及转速
通过蓝牙串口控制LCD1602屏幕显示正反转以及转速简 述:通过蓝牙串口发送指定数据到STC89C52RC单片机,控制28BYJ-48步进电机正转或者反转或者速度的快中慢,然后51单片机,做相应
2021-11-13 19:51:0120
51单片机:proteus仿真1602LCD的显示
基于keilC51和proteus实现1602LCD的显示这是我自己用proteus仿真学习了1602的中英文显示后自己的一些感悟和经验总结,欢迎讨论交流1602lcd的介绍1.引脚定义主要要注意
2021-11-23 17:51:3418
步进电机控制实验
正转;按下“Negitive(反转)” 按键时,控制步进电机反
转;按下“加速”按键时,控制步进电机加速;按下“减速” 按键时,控制步进电机减速。4位数码管,左边两位显示正反
转,正转显示“11”,反转显示“00”,右边两位显示转速档次,步进电机的转速1~30档在右边两位
2023-03-21 15:25:243
开环步进电机控制系统
。 ②中断方式的转动。 ③启停。按KK1+键控制步进电机的启动。按KK2+键控制步进电机的停止。 ④正反转。开关K7控制步进电机的正反转。当K7向下拨时,电机正转(顺时针);向上拨时,电机反转(逆时针)。 ⑤在LED数码管上显示速度编号。K0对
2023-03-23 10:56:581
基于51单片机步进电机控速正反转proteus仿真
作为电机
驱动;可通过按键控制正反转及速度;四位数码管第1位显示电机的正反转,第3位和第4位显示电机运行速度的档数;五个红色LED,一个为电源指示,四个指示电机的转速。
2023-03-24 11:39:014
ARM920T实验箱s3c2410矩阵按键控制步进电机正反转和停止
ARM920T实验箱s3c2410 矩阵按键控制步进电机正反转和停止 问题描述 矩阵按键控制 思路 配置输入输出 按键扫描步进电机控制 完整代码 问题描述 按下第一个按键使步进电机可以正转、第二个
2023-03-24 09:46:280
STM32F103RCT6利用ULN2003驱动步进电机正反转
接通电源后,电机开始正转,转够一圈后,电机开始反转,同时在OLED上会显示forward和reverse分别表示正反转
器件 :STM32F103RCT6,OLED屏,十根杜邦线 ,ULN2003步进电机拓展版,28BYJ-48步进电机
2023-03-24 09:55:205
电机正反转故障点有哪些
电机正反转故障点有哪些 电机正反转故障是在工业生产中常见的一种故障。电机正反转是电机作业的基础,如果出现故障,会导致产品不能正常进行加工,直接影响生产效率与质量。因此,本文将从以下几点详细阐述电机
2023-08-28 17:42:563194
步进电机正反转的换线方法
步进电机正反转的换线方法 步进电机是一种常见的电机类型,它具有正反转的能力。换线是指改变步进电机的电源连接方式,以改变其运动方向。换线方法有很多种,下面将详细介绍其中一种常见的换线方法。 步进电机
2024-01-23 14:45:51659
评论
查看更多