基于CC2530设计的自动晾衣杆

简介: 使用CC2530单片机的ADC接口采集雨滴传感器的模拟值,得到雨滴传感器的雨滴测量值之后,与预先设置的阀值进行对比,是否要打开或者收回晾衣杆,这个晾衣杆的伸缩采用步进电机进行模拟;并且还支持语音控制、手动控制晾衣杆的伸缩。

1. 功能说明

现在都市的生活越来越忙,很多人都没有时间和精力来管理一些细节上的东西,比如,在合适的阳光温度时间内晾晒衣服。针对这来问题开始研究,通过对智能晾衣架控制系统的设计与实现的不断探究,得到了比较好的设计思路。

使用CC2530单片机的ADC接口采集雨滴传感器的模拟值,得到雨滴传感器的雨滴测量值之后,与预先设置的阀值进行对比,是否要打开或者收回晾衣杆,这个晾衣杆的伸缩采用步进电机进行模拟;并且还支持语音控制、手动控制晾衣杆的伸缩。

image-20220111111849127

完整项目代码下载地址: https://download.csdn.net/download/xiaolong1126626497/75317750

image-20220111113249381

2. 硬件介绍

2.1 CC2530开发板

image-20220111112235136

2.2 雨滴传感器

image-20220111112304127

2.3 步进电机

image-20220111112335963

2.4 MR-LD3320语音识别模块

image-20220111112450786

3. 源代码

3.1 雨滴传感器数据采集

/*===================ADC初始化函数====================*/
void Init_ADC0()
{
  P0SEL |= 0x01;      //P0_0端口设置为外设功能
  P0DIR &= ~0x01;     //P0_0端口设置为输入端口
  APCFG |= 0x01;      //P0_0作为模拟I/O使用
}


/*===================读取ADC的数据====================*/
u16 Get_ADC0_Value()
{
  //存放采集的ADC数据
  u16 adc_dat=0;
  u8 dat[2];
  ADCIF = 0;
  //参考电压选择AVDD5引脚,256抽取率,AIN0通道0
  ADCCON3 = (0x80 | 0x10 | 0x00);
  while(!ADCIF);      //等待A/D转换完成,
  dat[0]= ADCL;      //读取ADC数据低位寄存器
  dat[1]= ADCH;      //读取ADC数据高位寄存器
  
  adc_dat=dat[1]<<8|dat[0];
 
  return adc_dat;
}

// P0.6
void Init_ADC6(void)
{
    APCFG  |=1<<6;  //PCFG[7:0]选择P0.7- P0.0作为模拟I/O
    P0SEL  |= 0x01; 
    P0DIR  &= ~0x01;   
    
    P0SEL |= (1<<6);      //P0_6端口设置为外设功能
    P0DIR &= ~(1<<6);     //P0_6端口设置为输入端口
    APCFG |= 1<<6;        //P0_6作为模拟I/O使用
}


//读取光敏传感器的值  P0.6
u16 Get_ADC6_Value( void )
{
  u16 reading = 0;
  
  /* Enable channel */
  ADCCFG |= 0x40;
  
  /* writing to this register starts the extra conversion */
  ADCCON3 = 0x86;// AVDD5 引脚  00: 64 抽取率(7 位ENOB)  0110: AIN6
  
  /* Wait for the conversion to be done */
  while (!(ADCCON1 & 0x80));
  
  /* Disable channel after done conversion */
  ADCCFG &= (0x40 ^ 0xFF); //按位异或。如1010^1111=0101(二进制)
  
  /* Read the result */
  reading = ADCL;
  reading |= (u16) (ADCH << 8); 
  
  reading >>= 8;
  
  return (reading);
}

3.2 步进电机控制代码

typedef unsigned char uchar;
typedef unsigned int  uint;

#define A1 P0_4 //定义步进电机连接端口
#define B1 P0_5
#define C1 P0_6
#define D1 P0_7

uchar phasecw[4] ={0x80,0x40,0x20,0x10};//正转 电机导通相序 D-C-B-A
uchar phaseccw[4]={0x10,0x20,0x40,0x80};//反转 电机导通相序 A-B-C-D

void MotorData(uchar data)
{
  A1 = 1&(data>>4);
  B1 = 1&(data>>5);
  C1 = 1&(data>>6);
  D1 = 1&(data>>7);
}

//ms延时函数
void Delay_MS(uint x)
{
  uint i,j;
  for(i=0;i<x;i++)
    for(j=0;j<535;j++);
}

//顺时针转动
void MotorCW(uchar Speed)
{
  uchar i;
  for(i=0;i<4;i++)
  {
    MotorData(phasecw[i]);
    Delay_MS(Speed);//转速调节
  }
}
//逆时针转动
void MotorCCW(uchar Speed)
{
  uchar i;
  for(i=0;i<4;i++)
  {
    MotorData(phaseccw[i]);
    Delay_MS(Speed);//转速调节
  }
}

//停止转动
void MotorStop(void)
{
  MotorData(0x00);
}


void InitIO(void)
{
  P0SEL &= 0x0F;  //P04 05 06 07定义为普通IO
  P0DIR |= 0xF0;  //P04 05 06 07定义为输出
}

3.3 串口初始化-接收语音识别指令

uint lenU1 = 0;
uchar tempRXU1;
#define MAXCHAR 81
uchar  RecdataU1[MAXCHAR];

unsigned char dataRecv;
unsigned char Flag = 0;

void clearBuffU1(void)
{
  int j;
  for(j=0;j<MAXCHAR;j++)
  {
    RecdataU1[j]=0x00;
  }
  lenU1=0;
}


/*
函数功能:串口0初始化
*/
void Init_Uart00(void)
{
  PERCFG&=~(1<<0);  //串口0的引脚映射到位置1,即P0_2和P0_3  RX0 --- P0_2   TX0 --- P0_3
  P0SEL|=0x3<<2;   //将P0_2和P0_3端口设置成外设功能
 
  U0BAUD = 59;     //32MHz的系统时钟产生9600BPS的波特率
  U0GCR&=~(0x1F<<0);//清空波特率指数
  U0GCR|=8<<0;      //32MHz的系统时钟产生9600BPS的波特率
  
  U0UCR |= 0x80;    //禁止流控,8位数据,清除缓冲器
  U0CSR |= 0x3<<6;  //选择UART模式,使能接收器
  UTX0IF = 0;       //清除TX发送中断标志
  URX0IF = 0;       //清除RX接收中断标志
  URX0IE = 1;       //使能URAT0的接收中断
  EA = 1;           //使能总中断
}


/*================UR0接收中断服务函数================*/
#pragma vector = URX0_VECTOR
__interrupt void UART0_RecvInterrupt()
{
  URX0IF = 0;           //清除RX接收中断标志
  dataRecv =  U0DBUF;   //将数据从接收缓冲区读出
  
  if(lenU1<81)
  {
    RecdataU1[lenU1]=dataRecv;
    lenU1++;
  }
  
  //U0DBUF = dataRecv;    //将要发送的1字节数据写入U0DBUF
  //while(UTX0IF == 0);//等待数据发送完成
  //UTX0IF = 0;       //清除发送完成标志,准备下一次发送
}
目录
相关文章
|
4月前
|
安全 编译器 程序员
开发与运维调用问题之add(1.0f, 2.0)这个调用会匹配哪个版本的add函数如何解决
开发与运维调用问题之add(1.0f, 2.0)这个调用会匹配哪个版本的add函数如何解决
33 5
|
6月前
|
安全 Shell 网络安全
抄个冷板凳---x86架构MS-17010漏洞的多重利用方法
x86架构永恒之蓝漏洞的多重利用复现演示
|
安全 测试技术 Go
Go 1.18 新增三大功能之一“模糊测试”使用方式
Go 1.18 新增三大功能之一“模糊测试”使用方式
53 0
PADS新建封装中焊盘部分修正(二)
按照同样的方法添加助焊层底层(Paste Mask Bottom),如下图所示:
215 0
PADS新建封装中焊盘部分修正(一)
在PADS新建封装中,需要修改焊盘参数。因为之前做板,有问题工厂都会帮忙修正,所以忽略了焊盘中阻焊层和助焊层。这里专门做一个修正。
347 0
|
存储 块存储
AD2428W手册解读之模块ID和模块配置内存
AD2428W手册解读之模块ID和模块配置内存
AD2428W手册解读之模块ID和模块配置内存
|
网络安全 开发者
CC 自定义功能使用介绍|学习笔记
快速学习 CC 自定义功能使用介绍
133 0
CC 自定义功能使用介绍|学习笔记
|
存储 自然语言处理 算法
c++概述--易混淆点记录
c++概述--易混淆点记录
126 0
CC自定义防护验证最佳实践
CC自定义防护配置 在这里可以定义如下图所示的防护规则: URI:需要防护的具体地址,如/sms.php,也支持参数,比如/user?action=login 匹配规则:完全匹配即精确匹配,请求必须跟此处配置完全一样才会统计;前缀匹配是包含匹配,只要是请求的URI以此处配置开头就会统计(如/register.
2969 0