51单片机之蓝牙控制风扇

MCU for 51 同时被 2 个专栏收录
11 篇文章 1 订阅

这个是我大二才学51单片机的时候做的一个项目,其实这个项目比较简单,只不过是我们自己把它想得太难了,下面我来总结一下具体设计过程,我会上传代码和研究报告:点击这里!

首先买一个蓝牙模块,我买的是HC-06,在手机上下载一个蓝牙串口调试助手,等同于单片机的UART串口通信,利用BUFF来获取接受到的数据,这里只需要重视一个问题,就是测试编码,如果APP发送0xFF,(APP蓝牙串口调试助手已经支持手动设置按钮名字和发送的字符了)但是蓝牙模块很有可能接受到的是0xF8,0xF2,0xFE。所以这里我们首先应该测试编码。HC-06一般有5个端口,RX,TX,VCC,GND,AT,AT这里我们没有用到,是指更改密码,默认密码一般是1234或者0000,把VCC和GND接好,然后RX和TX分别和单片机的TX和RX相连接(就是P3^0和P3^1,切记要相反连接),然后我们按照一般的UART串口通信就可以啦,检测接受到BUFF数据,然后switch就可以实现相应的功能。



#include <reg51.h>
#define  uchar  unsigned char
#define  uint   unsigned int


sbit PWM=P1^0;
sbit DSPORT=P3^7;


 void Ds18b20ReadTemp();
 void UsartConfiguration();


 unsigned int temp=0;
 unsigned char zhuanshu=20;
 unsigned int cnt=0;
 unsigned char receiveData;
 unsigned int dingshi=0;
 unsigned char min=1;
 
void main(void)
{
    unsigned int i=3000;
    UsartConfiguration();
while(1)

if(cnt>=3000)
{
 cnt=0;
 Ds18b20ReadTemp(); //3s检测一次温度
}
switch(receiveData)
{
 case 177:ET0=1;zhuanshu=20;receiveData=0;break;          // 数字1 风扇启动
 case 178:zhuanshu=0;while(i--);ET0=0;receiveData=0;break;        //数字2 风扇停止 由于IO口默认高电平  所以要让zhuanshu=0
 case 179:zhuanshu=30;break;//数字3 低挡
 case 180:zhuanshu=50;break;//数字4 中挡
 case 181:zhuanshu=70;break;// 数字5高挡
 case 182:                 // 数字6自动根据温度调节转速 
 {
if(temp<3200)
{
   zhuanshu=25;
}
if((temp>3200)&&(temp<3300))
{
   zhuanshu=30;
}
if((temp>3400)&&(temp<3600))
{
   zhuanshu=50;
}
if((temp>3200)&&(temp<3300))
{
  zhuanshu=60;
}
} break;                   
case 183: //定时时间数字7
{
  static dingshi=0;
   if(dingshi>=60000)  //1分钟一个基准
  {
     min--;
 dingshi=0;
 if(min==0)
 {
  ET0=0;
zhuanshu=0;
 }
  }
  break;
 case 184: receiveData=0;min++;break; //增加时间  数字8
 case 185: receiveData=0;min--;break; //减少时间  数字9
}
}
  }
}
  void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X21; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH0 = 0xFC; 
TL0 = 0x66;
TH1=0XF9;    //计数器初始值设置,注意波特率是9600的
TL1=0XF9;
ET0=1;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1;
TR0=1;    //打开计数器
}




  void Usart() interrupt 4
{
receiveData=SBUF; //出去接收到的数据
RI = 0;           //清除接收中断标志位
}


void Time1(void) interrupt 1    //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断
{
    static unsigned char timer1=0;
TH0 = 0xF6;  //重新赋初值
TL0 = 0x66;
timer1++; 
    cnt++;
dingshi++;
if(dingshi>=60050)
{
 dingshi=0;
}
if(timer1>100)  //PWM周期为100*0.5ms
{
timer1=0;
}
if(timer1 <zhuanshu)//改变zhunashu这个值可以改变直流电机的速度这个值越大转的越快
{
   PWM=1;
}
else
{
  PWM=0;
}  
}


void Delay1ms(uint y) //延时程序
{
uint x;
for( ; y>0; y--)
{
for(x=110; x>0; x--);
}
}


uchar Ds18b20Init()  //温度的子函数
{
uchar i;
DSPORT = 0; //将总线拉低480us~960us
i = 70;
while(i--);//延时642us
DSPORT = 1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
i = 0;
while(DSPORT) //等待DS18B20拉低总线
{
i++;
if(i>5)//等待>5MS
{
return 0;//初始化失败
}
Delay1ms(1);
}
return 1;//初始化成功
}






void Ds18b20WriteByte(uchar dat)
{
uint i, j;


for(j=0; j<8; j++)
{
DSPORT = 0;      //每写入一位数据之前先把总线拉低1us
i++;
DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始
i=6;
  while(i--); //延时68us,持续时间最少60us
DSPORT = 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
dat >>= 1;
}
}






uchar Ds18b20ReadByte()
{
uchar byte, bi;
uint i, j;
for(j=8; j>0; j--)
{
DSPORT = 0;//先将总线拉低1us
i++;
DSPORT = 1;//然后释放总线
i++;
i++;//延时6us等待数据稳定
bi = DSPORT; //读取数据,从最低位开始读取
/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
byte = (byte >> 1) | (bi << 7); 
i = 4; //读取完之后等待48us再接着读取下一个数
while(i--);
}
return byte;
}


void  Ds18b20ChangTemp()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc);//跳过ROM操作命令 
Ds18b20WriteByte(0x44);   //温度转换命令
// Delay1ms(100);//等待转换成功,而如果你是一直刷着的话,就不用这个延时了
   
}




void  Ds18b20ReadTempCom()
{


Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc);//跳过ROM操作命令
Ds18b20WriteByte(0xbe);//发送读取温度命令
}




void Ds18b20ReadTemp()
{
   float tp; 
int temp1 = 0;
uchar tmh, tml;
Ds18b20ChangTemp();//先写入转换命令
Ds18b20ReadTempCom();//然后等待转换完后发送读取温度命令
tml = Ds18b20ReadByte();//读取温度值共16位,先读低字节
tmh = Ds18b20ReadByte();//再读高字节
temp1 = tmh;
temp1 <<= 8;
temp1 |= tml;
   if(temp1< 0)
  {
temp1=temp1-1;
temp1=~temp1;
tp=temp1;
temp1=tp*0.0625*100+0.5;
  }
  else
  {
tp=temp1;
temp1=tp*0.0625*100+0.5;
}


  temp=temp1%10000;
   
}
  • 8
    点赞
  • 17
    评论
  • 32
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
基于单片机的温控风扇的设计 摘 要 温控风扇在现代社会中的生产以及人们的日常生活中都有广泛的应用,如工业生产中大型机械散热系统中的风扇、现在笔记本电脑上的广泛应用的智能CPU风扇等。本文设计了基于单片机的温控风扇系统,采用单片机作为控制器,利用温度传感器DS18B20作为温度采集元件,并根据采集到的温度,通过一个达林顿反向驱动器ULN2803驱动风扇电机。根据检测到的温度与系统设定的温度的比较实现风扇电机的自动启动和停止,并能根温度的变化自动改变风扇电机的转速,同时用LED八段数码管显示检测到的温度与设定的温度。 关键词:单片机、DS18B20、温控、风扇 第一章 整体方案设计 1.1 前 言 在现代社会中,风扇被广泛的应用,发挥着举足轻重的作用,如夏天人们用的散热风扇、工业生产中大型机械中的散热风扇以及现在笔记本电脑上广泛使用的智能CPU风扇等。而随着温度控制技术的发展,为了降低风扇运转时的噪音以及节省能源等,温控风扇越来越受到重视并被广泛的应用。在现阶段,温控风扇的设计已经有了一定的成效,可以使风扇根据环境温度的变化进行自动无级调速,当温度升高到一定时能自动启动风扇,当温度降到一定时能自动停止风扇的转动,实现智能控制。 随着单片机在各个领域的广泛应用,许多用单片机作控制的温度控制系统也应运而生,如基于单片机的温控风扇系统。它使风扇根据环境温度的变化实现自动启停,使风扇转速随着环境温度的变化而变化,实现了风扇的智能控制。它的设计为现代社会人们的生活以及生产带来了诸多便利,在提高人们的生活质量、生产效率的同时还能节省风扇运转所需的能量。 本文设计了由ATMEL公司的8052系列单片机AT89C52作为控制器,采用DALLAS公司的温度传感器DS18B20作为温度采集元件,并通过一个达林顿反向驱动器ULN2803驱动风扇电机的转动。同时使系统检测到得环境温度以及系统预设的温度动态的显示在LED数码管上。根据系统检测到得环境温度与系统预设温度的比较,实现风扇电机的自动启停以及转速的自动调节。 1.2 系统整体设计 本设计的整体思路是:利用温度传感器DS18B20检测环境温度并直接输出数字温度信号给单片机AT89C52进行处理,在LED数码管上显示当前环境温度值以及预设温度值。其中预设温度值只能为整数形式,检测到的当前环境温度可精确到小数点后一位。同时采用PWM脉宽调制方式来改变直流风扇电机的转速。并通过两个按键改变预设温度值,一个提高预设温度,另一个降低预设温度值。系统结构框图如下: 结 论 本次设计的系统以单片机为控制核心,以温度传感器DS18B20检测环境温度,实现了根据环境温度变化调节不同的风扇电机转速,在一定范围能能实现转速的连续调节,LED数码管能连续稳定的显示环境温度和设置温度,并能通过两个独立按键调节不同的设置温度,从而改变环境温度与设置温度的差值,进而改变电机转速。实现了基于单片机的温控风扇的设计。 本系统设计可推广到各种电动机的控制系统中,实现电动机的转速调节。在生产生活中,本系统可用于简单的日常风扇的智能控制,为生活带来便利;在工业生产中,可以改变不同的输入信号,实现对不同信号输入控制电机的转速,进而实现生产自动化,如在电力系统中可以根据不同的负荷达到不同的电压信号,再由电压信号调节不同的发电机转速,进而调节发电量,实现电力系统的自动化调节。综上所述,该系统的设计和研究在社会生产和生活中具有重要地位。 附录2:程序代码 #include #define uchar unsigned char #define uint unsigned int sbit DQ=P1^7; sbit key1=P1^3; sbit key2=P1^4; sbit dianji=P3^1; float ff; uint y3; uchar shi,ge,xiaoshu,sheding=20,gaonum,dinum; uchar code dispcode[]={ //段码 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code tablel[]={ //带小数点的段码 0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfd, 0x87,0xff,0xef}; uchar dispbitcode[]={ //位选 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; uchar dispbuf[8]={0,0,0,0,0,0,0,0}; void De
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值