【蓝牙控制窗帘开关】

-***********************

最近项目涉及到步进电机的开发,所以了解了一下,相关的东西。不是特别懂,但是实现了基本的功能。权当参考。

--------------------------------------------------------------------------




连接的说明,就不讲了,自己看图吧,代码如下:

/******************************步进电机的驱动程序************************************* ;
--------------------------------------------------------------------------------- ;
步进电机的驱动信号必须为脉冲信号!!! 转动的速度和脉冲的频率成正比!!! ;
本步进电机步进角为 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++) {
			;
		}
	}
}

---------------------------------------------------------------------


实现的功能说明,以及怎么实现也在代码中了。









猜你喜欢

转载自blog.csdn.net/ca1m0921/article/details/80678411