标题:
STM32mini摄像头采集 通过NRF24L01传输到另一个STM32的源码
[打印本页]
作者:
小钢炮
时间:
2018-5-23 18:27
标题:
STM32mini摄像头采集 通过NRF24L01传输到另一个STM32的源码
STM32mini 摄像头采集 通过NRF传输到另一个STM32
0.png
(41.5 KB, 下载次数: 74)
下载附件
2018-5-24 01:41 上传
本实验将实现如下功能:该实验实现ALIENTEK MiniSTM32开发板驱动ALIENTEK OV7670摄像头模块,在硬件连接正确后,我们可以在LCD模块上看到摄像头模块所拍摄到的内容。摄像头模块的各种参数设置,均通过USMART实现,比如光照模式、色饱和度、亮度、对比度以及特效等,都可以通过USMART设置,另外还可以通过USMART对OV7670的单个寄存器进行修改,从而方便大家调试。
DS0用于指示程序运行状态。
注意:
1,在连接OV7670模块与MiniSTM32开发板的时候,请将D0~D7连接线靠在一起,将其与数据线靠在一起,这样可以有效避免相互干扰。
2,ALIENTEK OV7670摄像头模块与ALIENTEK MiniSTM32开发板的连接方式为:
D0~D7-->PB0~PB7
WRST -->PA0
RRST -->PA4
SCL -->PC4
SDA -->PC5
OE -->PA11
WEN -->PA12
RCLK -->PA1
VSYNC-->PA15
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd.h"
#include "ov7670.h"
#include "usmart.h"
#include "24l01.h"
#include "spi.h"
extern u8 ov_sta; //在exit.c里面定义
extern u8 ov_frame; //在timer.c里面定义
u8 tmp_buf[33]="abcdefghijklABCDEFGHIJKLM1234567";//----我添加的!!!!
//---------我添加的WQH------
u16 mycolor;
u8 mycolorH,mycolorL;
//更新LCD显示
void camera_refresh(void)
{
u32 j;
u16 color;
u8 t=0,sss=0;
if(ov_sta==2)
{
LCD_Scan_Dir(U2D_L2R); //从上到下,从左到右
LCD_SetCursor(0x00,0x0000); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
OV7670_CS=0;
OV7670_RRST=0; //开始复位读指针
OV7670_RCK=0;
OV7670_RCK=1;
OV7670_RCK=0;
OV7670_RRST=1; //复位读指针结束
OV7670_RCK=1;
for(j=0;j<76800;j++)
{
GPIOB->CRL=0X88888888;
OV7670_RCK=0;
color=OV7670_DATA; //读数据
OV7670_RCK=1;
color<<=8;
OV7670_RCK=0;
color|=OV7670_DATA; //读数据
OV7670_RCK=1;
GPIOB->CRL=0X33333333;
LCD_WR_DATA(color);
//printf("%x ",color);
mycolor=color;
mycolorL=mycolor&0x00ff;
mycolorH=(mycolor>>8)&0x00ff;
//for(t=0,sss=0;t<16;t++)
{
tmp_buf[2*t]=mycolorH;
tmp_buf[2*t+1]=mycolorL;
sss++,t++;
}
if(sss==16)
{
while(NRF24L01_1_TxPacket(tmp_buf)!=TX_OK);
sss=0,t=0;
}
//LCD_WR_DATA(tmp_buf[2*t]*256+tmp_buf[2*t]);
//printf("%x ",mycolorH);
//printf("%x ",mycolorL);
}
OV7670_CS=1;
OV7670_RCK=0;
OV7670_RCK=1;
EXTI->PR=1<<15; //清除LINE8上的中断标志位
ov_sta=0; //开始下一次采集
ov_frame++;
LCD_Scan_Dir(DFT_SCAN_DIR); //恢复默认扫描方向
}
}
int main(void)
{
u8 i,t;
//u8 tmp_buf[33]="abcdefghijklABCDEFGHIJKLM1234567";//----我添加的!!!!
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,1382400); //串口初始化为9600
delay_init(72); //延时初始化
OV7670_Init();
//----我添加的!!!!
NRF24L01_1_Init(); //初始化NRF24L01
while(NRF24L01_1_Check())//检测不到24L01
{
//LCD_ShowString(30,30,"24L01 Check Failed!");
printf("24L01 Check Failed!");
delay_ms(500);
}
TX_1_Mode();
printf("24L01 Check OK!");
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init(); //初始化LCD
if(lcddev.id==0X6804) //强制设置屏幕分辨率为320*240.以支持3.5寸大屏
{
lcddev.width=240;
lcddev.height=320;
}
usmart_dev.init(72); //初始化USMART
POINT_COLOR=RED;//设置字体为红色
// LCD_ShowString(60,50,200,200,16,"Mini STM32");
// LCD_ShowString(60,70,200,200,16,"OV7670 TEST");
// LCD_ShowString(60,90,200,200,16,"ATOM@ALIENTEK");
// LCD_ShowString(60,110,200,200,16,"2012/10/31");
// LCD_ShowString(60,130,200,200,16,"Use USMART To Set!");
// LCD_ShowString(60,150,200,200,16,"OV7670 Init...");
while(OV7670_Init())//初始化OV7670
{
// LCD_ShowString(60,150,200,200,16,"OV7670 Error!!");
printf("OV7670 Error!!");
// delay_ms(200);
// LCD_Fill(60,230,239,246,WHITE);
delay_ms(200);
}
// LCD_ShowString(60,150,200,200,16,"OV7670 Init OK");
printf("OV7670 Init OK");
delay_ms(1500);
Timerx_Init(10000,7199); //TIM3,10Khz计数频率,1秒钟中断
EXTI15_Init(); //使能定时器捕获
OV7670_Window_Set(10,174,240,320); //设置窗口
OV7670_CS=0;
while(1)
{
camera_refresh(); //更新显示
if(i!=ov_frame) //DS0闪烁.
{
i=ov_frame;
LED0=!LED0;
}
/*
// while(1)
{
if(NRF24L01_1_TxPacket(tmp_buf)==TX_OK)
{
//LCD_ShowString(60,170,"Sended DATA:");
//LCD_ShowString(0,190,tmp_buf);
//printf((const char *)tmp_buf);
//key=mode;
for(t=0;t<32;t++)
{
tmp_buf[t]++;
}
//mode++;
//if(mode>'~')mode=' ';
tmp_buf[32]=0;//加入结束符
}else
{
//LCD_ShowString(60,170,"Send Failed ");
// printf("Send Failed ");
//LCD_Fill(0,188,240,218,WHITE);//清空上面的显示
};
// LED0=!LED0;
//delay_ms(1500);
// delay_ms(100);
};
*/
}
}
复制代码
本实验将实现如下功能:开机的时候先检测NRF24L01模块是否存在,在检测到NRF24L01模块之后,根据KEY0和KEY1的设置来决定模块的工作模式,在设定好工作模式之后,就会不停的发送/接收数据,同样用DS0来指示程序正在运行。
注意,这里要用2个NRF24L01模块同时工作,才能实现。我们测试时基于两套开发板的。
本实验可以SWD下载,但是不能仿真(得不到正确结果).
单片机源码:
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd.h"
#include "rtc.h"
#include "wkup.h"
#include "adc.h"
#include "dma.h"
#include "24cxx.h"
#include "flash.h"
#include "touch.h"
#include "24l01.h"
//收发都做在一个函数里面,通过按键来确定进入发送模式,还是接收模式
int main(void)
{
// u8 key,mode;
u16 wqh_times=4800;
u8 t=0;
u8 tmp_buf[33];
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化
delay_ms(200);
LCD_Init(); //初始化液晶
delay_ms(200);
KEY_Init(); //按键初始化
LED_Init(); //LED初始化
NRF24L01_Init(); //初始化NRF24L01
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,"Mini STM32");
LCD_ShowString(60,70,"NRF24L01 TEST");
LCD_ShowString(60,90,"ATOM@ALIENTEK");
LCD_ShowString(60,110,"2011/1/1");
while(NRF24L01_Check())//检测不到24L01
{
LCD_ShowString(60,130,"24L01 Check Failed!");
delay_ms(500);
LCD_ShowString(60,130,"Please Check! ");
delay_ms(500);
LED0=!LED0;//DS0闪烁
}
// LCD_ShowString(60,130,"24L01 Ready!");
// LCD_ShowString(10,150,"KEY0:RX_Mode KEY1:TX_Mode");
LCD_Fill(10,150,240,166,WHITE);//清空上面的显示
POINT_COLOR=BLUE;//设置字体为蓝色
{
LCD_ShowString(60,150,"NRF24L01 RX_Mode");
LCD_ShowString(60,170,"Received DATA:");
RX_Mode();
while(1)
{
if(wqh_times==4800)
{
LCD_Scan_Dir(DFT_SCAN_DIR); //恢复默认扫描方向
LCD_Scan_Dir(U2D_L2R); //从上到下,从左到右
LCD_SetCursor(0x00,0x0000); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
wqh_times=0;
}
if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
{
//tmp_buf[32]=0;//加入字符串结束符
// LCD_ShowString(0,190,tmp_buf);
for(t=0;t<16;t++)
LCD_WR_DATA(tmp_buf[2*t]*256+tmp_buf[2*t+1]);
wqh_times++;
}
//else
/*
delay_us(100);
t++;
if(t==10000)//大约1s钟改变一次状态
{
t=0;
LED0=!LED0;
}
*/
}
}
}
复制代码
全部资料51hei下载地址:
无线传输.rar
(295.59 KB, 下载次数: 104)
2018-5-24 01:44 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
失心恋2015
时间:
2018-9-2 21:19
楼主,为什么我的接收和发送编译都是失败的呢?
作者:
Zicent0717
时间:
2020-11-28 16:38
大佬牛逼啊,现在在做摄像头颜色识别,用了zet6核心板杜邦线连接摄像头,发现丢了颜色,现在想用无线传输到另一块板子上
作者:
bukebuchiyi
时间:
2021-1-20 15:37
摄像头识别颜色怎么做?
作者:
Zicent0717
时间:
2021-1-25 09:50
bukebuchiyi 发表于 2021-1-20 15:37
摄像头识别颜色怎么做?
先让屏幕显示摄像头图像,通过读点函数去读屏幕上的点,读取的时rgb,自己转换成hsl
作者:
84653
时间:
2022-8-17 15:50
大佬显示屏是啥型号的啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1