-***********************
最近项目涉及到步进电机的开发,所以了解了一下,相关的东西。不是特别懂,但是实现了基本的功能。权当参考。
--------------------------------------------------------------------------
连接的说明,就不讲了,自己看图吧,代码如下:
/******************************步进电机的驱动程序************************************* ; --------------------------------------------------------------------------------- ; 步进电机的驱动信号必须为脉冲信号!!! 转动的速度和脉冲的频率成正比!!! ; 本步进电机步进角为 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; //计数器初始值设置,[email protected] 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; //计数器初始值设置,[email protected] 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++) { ; } } }
---------------------------------------------------------------------
实现的功能说明,以及怎么实现也在代码中了。