-***********************
最近项目涉及到步进电机的开发,所以了解了一下,相关的东西。不是特别懂,但是实现了基本的功能。权当参考。
--------------------------------------------------------------------------
连接的说明,就不讲了,自己看图吧,代码如下:
/******************************步进电机的驱动程序************************************* ;
--------------------------------------------------------------------------------- ;
步进电机的驱动信号必须为脉冲信号!!! 转动的速度和脉冲的频率成正比!!! ;
本步进电机步进角为 x 度 . 一圈 360 度 , 需要 x 个脉冲完成!!! ;
--------------------------------------------------------------------------------- ;
A 组线圈对应 P0.0 ; B 组线圈对应 P0.1 ; C 组线圈对应 P0.2 ; D 组线圈对应 P0.3 ;
正转次序: AB 组--BC 组--CD 组--DA 组 (即一个脉冲,正转 x 度) ;
----------------------------------------------------------------------------------
* 上面的注释不是我写的,权当参考。
* 代码的正式说明: 代码实现了 蓝牙控制步进电机,打开窗帘的功能。
* 设备说明: 51最小系统 使用了STC89C52RC 芯片,HC-05 蓝牙模块,2003的驱动+步进电机。
*(图片详情在我的博客上,地址 )
* 手机安装蓝牙串口,连接 蓝牙模块,发送 '1' (字符)到蓝牙模块,蓝牙模块接受到字符,控制步进电机转 2圈(我没写太精确)
* 反转的代码,我没写,如果想写,在网上找找反转表就行了。
* 我们老板是做个 智能控制的窗帘,所以让我来写,因为不了解步进电机的功能和原理,加上一个人没有干劲,今天下午才实现基本功能,尴尬。
* 基本就这些吧,如果有时间会整理出 详细的教程 和 学到的东西 放到我的博客上。
**********************************************************************************/
/*头文件*/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define nop() _nop_()
#define motor P0
// 全局变量
uchar PuZh[36] = "www.hc01.com";
uchar code table1[]= {0x08,0x04,0x02,0x01}; /*正转表*/
sbit LED = P2^0;
// 声明全局方法
void UsartConfiguration();
void delay(uchar ms);
void main() {
UsartConfiguration(); // 串口的初始化
while(1); // 程序等待中断
}
/*******************************************************************************
* 函 数 名 : foreward()
* 函数功能 : 控制电机正转
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void foreward(){
uchar i,j,q;
delay(50); // 等系统稳定
for(q=0;q<2;q++){ // 控制转几圈
for(i=0;i<250;i++){ //正转半圈 抖动多少次
for(j=0;j<4;j++){ // 一个脉冲 抖动一次
P0 = table1[j];
delay(2);
}
}
for(i=0;i<10;i++){ //短暂的 停止
P0 = 0x00;
delay(2);
}
}
//while(1);
}
/*******************************************************************************
* 函 数 名 : UsartConfiguration()
* 函数功能 : 设置串口
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void UsartConfiguration(){
SCON=0X50; //设置串口的工作方式1,8位数据,可变波特率
TMOD=0X20; //设置计数器工作方式2
PCON=0X00; //波特率不加倍
TH1=0XFd; //计数器初始值设置,9600@11.0592MHz
TL1=0XFd;
TR1=1; //打开计数器,启动定时器,
EA = 1; //开总中断
ES = 1; //开串口中断
}
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无 * 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4{
uchar i;
uchar receive_data;
EA = 0;
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
RI = 0;
receive_data = SBUF; //接收到的数据
TH1=0XFd; //计数器初始值设置,9600@11.0592MHz
TL1=0XFd;
if(receive_data == '1') { // 前进
LED = 0;
foreward();
}else{
LED = 1;
}
for(i=0; i<36; i++){
SBUF = PuZh[i]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
delay(1);
}
EA = 1;
}
}
/*延时*/
void delay(uchar ms){
uchar j;
while(ms--) {
for(j=0; j<250; j++) {
;
}
}
}
---------------------------------------------------------------------
实现的功能说明,以及怎么实现也在代码中了。