写点什么

基于 CC2530 设计的自动晾衣杆

作者:DS小龙哥
  • 2022 年 2 月 24 日
  • 本文字数:2195 字

    阅读完需:约 7 分钟

1. 功能说明

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


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



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


2. 硬件介绍

2.1 CC2530 开发板

2.2 雨滴传感器

2.3 步进电机

2.4 MR-LD3320 语音识别模块

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.6void 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.6u16 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-Auchar 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 81uchar  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; //清除发送完成标志,准备下一次发送}
复制代码


发布于: 刚刚阅读数: 2
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
基于CC2530设计的自动晾衣杆