完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
所需:stm32单片机(这里使用的是正点原子stm32mini板),GY_33传感器,GY_33配套软件,串口助手,USB转TTL
2.通信原理 3.代码话不多说,直接上代码(看串口3中断函数代码前可以先看第四部分) #include "stm32f10x.h"#include "stdio.h"//printf函数void USART1_Init(void){ GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体 USART_InitTypeDef USART_InitStructure;//定义串口结构体 NVIC_InitTypeDef NVIC_InitStructure;//定义优先级结构体 //使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 ,ENABLE);//使能串口1 //发送TX GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//PA9 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;//根据GY-33响应频率10hz GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA //接收RX GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;//根据GY-33响应频率10hz GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA //串口 USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不使用硬件 USART_InitStructure.USART_BaudRate=9600;//波特率 USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//模式 USART_InitStructure.USART_StopBits=USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity=USART_Parity_No;//奇偶校验关闭 USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长 USART_Init(USART1,&USART_InitStructure);//初始化串口1 //优先级配置 NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//串口1中断 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能串口1中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//响应优先级 NVIC_Init(&NVIC_InitStructure);//初始化优先级 //使能 USART_Cmd(USART1,ENABLE);//使能串口1 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能接收缓存非空寄存器}void USART3_Init(void){ GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体 USART_InitTypeDef USART_InitStructure;//定义串口结构体 NVIC_InitTypeDef NVIC_InitStructure;//定义优先级结构体 //使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 ,ENABLE);//使能串口3 //发送TX GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//PB10 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;//根据GY-33响应频率10hz GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出 GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB //接收RX GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//PB11 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB //串口 USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不使用硬件 USART_InitStructure.USART_BaudRate=9600;//波特率 USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//模式 USART_InitStructure.USART_StopBits=USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity=USART_Parity_No;//奇偶校验关闭 USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长 USART_Init(USART3,&USART_InitStructure);//初始化串口3 //优先级配置 NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn;//串口3中断 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能串口3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//响应优先级 NVIC_Init(&NVIC_InitStructure);//初始化优先级 //使能 USART_Cmd(USART3,ENABLE);//使能串口3 USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//使能接收缓存非空寄存器}void USART1_IRQHandler ()//串口1中断{ if(USART_GetITStatus(USART1,USART_IT_RXNE))//如果接收到数据 { u8 data; data=USART_ReceiveData(USART1);//保存指令 USART_SendData(USART3,data);//串口3发送指令给传感器 }}void USART3_IRQHandler(){ if(USART_GetITStatus(USART3,USART_IT_RXNE))//如果接收到数据 { u8 data; static int result1,result2,result3;//静态保存 static int i=0,staus=0,j=0,staus2=0,temp1=0,temp2=0,temp3=0; data=USART_ReceiveData(USART3);//赋值 if(data==0x5A) staus2=1; if(staus2) { j++; if(j==1)temp1=data; if(j==2)temp2=data; if(j==3) { temp3=data;j=0; if(temp3==0x45&&temp2==0x5A&&temp1==0X5A) { staus2=0; staus=1; } } }//如果连续收到0x5a,0x5a,0x45,staus置1,进入下面数据处理 if (staus)//将0x45看成第一位数据,保存第三,四,五位数据,分别对应红,绿,蓝的RGB值 { i++; if(i==3) result1=USART_ReceiveData(USART3); if(i==4) result2=USART_ReceiveData(USART3); if(i==5) { result3=USART_ReceiveData(USART3); if(result1==255&&result2==255&&result3==255)//三者RGB值都为255即打印白色 printf("R=%d G=%d B=%d 白色rn",result1,result2,result3); if(result1<50&&result2<50&&result3<50)//三者RGB值都比较小即为黑色 printf("R=%d G=%d B=%d 黑色rn",result1,result2,result3); else { if(result1>result2&&result1>result3)//不符合三者RGB都大或都小的情况下,红色RGB值最大即打印红色 printf("R=%d G=%d B=%d 红色rn",result1,result2,result3); if(result2>result1&&result2>result3)//不符合三者RGB都大或都小的情况下,绿色RGB值最大即打印绿色 printf("R=%d G=%d B=%d 绿色rn",result1,result2,result3); if(result3>result2&&result1 4.GY-33发送出来的数据及如何处理数据 5.软件使用完成此次任务,我发现对信息的筛选及整合能力很关键,最重要的应该是先搞明白原理。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9002 浏览 16 评论
4051 浏览 18 评论
1115浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 09:19 , Processed in 0.873609 second(s), Total 50, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号