精华内容
下载资源
问答
  • 本文介绍使用单片机控制采集130W像素摄像头的方法。本章使用的摄像头为青青子木ZM系列,被动型130W像素,防雨广角型摄像头
  • STM32摄像头代码例程

    2019-01-17 11:38:22
    STM32单片机控制摄像头经典例程,代码便于开发移植,注释清晰。
  • 使用stm32f103zet6单片机驱动摄像头,通过串口将图像实时传输到上位机进行显示,内含上位机和整个工程源码,实测可用
  • 1、130 万/200 万像素串口摄像头通讯协议(指令的数字均为 16 进制) 上电后需要 3s 启动时间,在此期间,发送指令,摄像头没有回应。用户程序在上电延时 3s 后,可发送复位指令,看摄像头是否有响应,如有响应,说明已经初始...

    这是普泰通信的一个RS485摄像机,主要也是通过相关协议进行一个开发使用。大概就是这样的。相应的摄像头规格和通信协议资料我也相应的贴在资源里面。
    枪机摄像头
    直接根据协议写功能函数。

    1、130 万/200 万像素串口摄像头通讯协议(指令的数字均为 16 进制)

    上电后需要 3s 启动时间,在此期间,发送指令,摄像头没有回应。用户程序在上电延时 3s 后,可发送复位指令,看摄像头是否有响应,如有响应,说明已经初始化完成,串口会输出如下信息,即可正常拍照了。
    Version:PTC2M0 1.02
    MEID_Num:00
    ImageWidth:1920,ImageHeight:1080
    Init end

    1.1、查询版本指令

    发送:56 00 11 00 返回:76 00 11 00 0B 50 54 43 32 4D 30 20 31 2E 30 30
    0B — 是版本字符串长度 11
    50 54 43 32 4D 30 20 31 2E 30 30 转字符串表示 PTC2M0 1.02
    型号:PTC2M0+空格+主版本 1.次版本号 02(版本号可能会因功能优化而变化),可通过查版本指令验证通讯是否已准备好。

    /************************************************
    名称:void query_version(uint8_t camera_addres)
    功能:摄像机版本查询
    输入:摄像机地址(默认0x00)
    输出:成功:C_query_version_success; 失败:C_error
    日期:2021-09-13
    作者:liuguizhou
    ************************************************/
    void Query_version(uint8_t camera_addres)
    {
    	uint16_t num=0;
    	CAMER_TX_BUF[num++]=0x56;
    	CAMER_TX_BUF[num++]=Camera_addres; //485地址
    	CAMER_TX_BUF[num++]=0x11;
    	CAMER_TX_BUF[num++]=0x00; 
    	RS485_Send_String(CAMER_TX_BUF,num);
    }
    

    1.2、复位指令

    发送:56 00 26 00 返回:76 00 26 00 //发送复位指令约 2-3s 后,会显示这么一串字符,相当于系统重启一次。

    /************************************************
    名称:void camera_rest(uint8_t camera_addres)
    功能:复位摄像头
    输入:摄像机地址(默认0x00)
    输出:成功:C_take_photos_success; 失败:C_error
    日期:2021-09-13
    作者:liuguizhou
    ************************************************/
    void Camera_rest(uint8_t camera_addres)
    {
    	uint16_t num=0;
    	CAMER_TX_BUF[num++]=0x56;
    	CAMER_TX_BUF[num++]=Camera_addres; //485地址
    	CAMER_TX_BUF[num++]=0x26;
    	CAMER_TX_BUF[num++]=0x00; 
    	RS485_Send_String(CAMER_TX_BUF,num);
    	send_string_uart2_len(Uart1_rcvbuff,Uart1_rcvindex);
    }
    

    1.3、拍照指令

    发送:56 00 36 01 00 拍照成功返回:76 00 36 00 00
    注意:上电,复位后立即进行拍照效果不佳,需等待 2-3s,使摄像头稳定下来后拍照效果即稳定。130 万像素需等待 2s,200 万像素需等待 3s。

    /************************************************
    名称:void take_photos(uint8_t camera_addres)
    功能:拍照控制
    输入:摄像机地址(默认0x00)
    输出:成功:C_take_photos_success; 失败:C_error
    日期:2021-09-13
    作者:liuguizhou
    ************************************************/
    void Take_photos(uint8_t camera_addres)
    {
    	uint16_t num=0;
    	CAMER_TX_BUF[num++]=0x56;
    	CAMER_TX_BUF[num++]=Camera_addres; //485地址
    	CAMER_TX_BUF[num++]=0x36;
    	CAMER_TX_BUF[num++]=01;
    	CAMER_TX_BUF[num++]=00; 
    	RS485_Send_String(CAMER_TX_BUF,num);
    }
    

    1.4、读取所拍图片长度指令

    发送:56 00 34 01 + II 返回:76 00 34 00 04 XX XX XX XX
    II -------1 个字节表示读取不同的图片缓存,有效范围 0-5,其中 0 号图片缓存固定
    为当前拍照的图片,1-5 号的图片缓存空间由移动侦测触发的连拍以及多张连拍指令所共享。
    XX XX XX XX -------4 个字节表示图片数据长度。
    举例说明:
    发送:56 00 34 01 00 返回:76 00 34 00 04 00 01 4B C6
    长度说明:0x00014BC6 / 1024 约等于 82.9K 的图片长度

    /************************************************
    名称:void Read_photo_len(uint8_t camera_addres,uint8_t Cache_block)
    功能:读取照片长度
    输入:camera_addres:摄像头485地址。
          Cache_block:照片缓存块 范围0-5
    输出:成功:C_read_photo_len_success; 失败:C_error
    日期:2021-09-13
    作者:liuguizhou
    ************************************************/
    void Read_photo_len(uint8_t camera_addres,uint8_t cache_block)
    {
    	uint16_t num=0;
    	if(cache_block>5)cache_block=5;
    //	else if(Cache_block<0)Cache_block=0;
    	CAMER_TX_BUF[num++]=0x56;
    	CAMER_TX_BUF[num++]=Camera_addres; //485地址
    	CAMER_TX_BUF[num++]=0x34;
    	CAMER_TX_BUF[num++]=01;
    	CAMER_TX_BUF[num++]=cache_block; //照片缓存块
    	RS485_Send_String(CAMER_TX_BUF,num);
    	send_string_uart2_len(CAMER_TX_BUF,num);
    }
    

    1.5、读取所拍图片数据指令

    发送:56 00 32 0C II 0A SS SS SS SS LL LL LL LL 00 FF
    返回:76 00 32 00 00 FF D8 。。。。。。FF D9 76 00 32 00 00
    II ---------------1 个字节表示读取不同的图片缓存,有效范围 0-5,其中 0 号图片缓存固定为
    当前拍照的图片,1-5 号的图片缓存空间由移动侦测触发的连拍以及多张连拍指令所共享。
    SS SS SS SS —起始地址 4 个字节(必须是 8 的倍数)。
    LL LL LL LL —本次读取数据长度 4 个字节,请看下面的举例说明。
    注意:完整的 JPEG 图片文件一定是以 FF D8 开始,FF D9 结束。如果是一次性读出整张图片数据,则起始地址是:00 00 00 00 ,本次读取的数据长度为 4.4 指令读出的整张图片的字节长度。读出的数据以 FF D8 开头,FF D9 结尾。
    如果要分多次读取图片数据,则第一次读取的起始地址是:00 00 00 00,后几次读取的起始地址是上一次读取数据的末尾地址。
    举例说明:
    发送:56 00 32 0C 00 0A 00 00 00 00 00 01 4B C6 00 FF
    返回:76 00 32 00 00 FF D8 … FF D9 76 00 32 00 00
    解释说明:
    在这里插入图片描述

    表示从 0x00000000 起始位置读取长度为 0x00014BC6 的图片长度数据。

    /************************************************
    名称:void Read_photo_data(uint8_t camera_addres,uint8_t Cache_block,uint32_t start_address,uint32_t data_len)
    功能:读取照片数据
    输入:camera_addres:摄像头485地址。
          Cache_block:照片缓存块 范围0-5
    			start_address:数据起始位置
    			data_len:需要读取的数据长度
    输出:成功:C_read_photo_data_success; 失败:C_error
    日期:2021-09-13
    作者:liuguizhou
    ************************************************/
    void Read_photo_data(uint8_t camera_addres,uint8_t cache_block,uint32_t start_address,uint32_t data_len)
    {
    	uint16_t num=0;
    	if(cache_block>5)cache_block=5;
    //	else if(Cache_block<0)Cache_block=0;
    	CAMER_TX_BUF[num++]=0x56;
    	CAMER_TX_BUF[num++]=Camera_addres; //485地址
    	CAMER_TX_BUF[num++]=0x32;
    	CAMER_TX_BUF[num++]=0x0C;
    	CAMER_TX_BUF[num++]=cache_block;  //照片缓存块
    	CAMER_TX_BUF[num++]=0x0A;	
    //	CAMER_TX_BUF[num++]=start_address>>24;
    //	CAMER_TX_BUF[num++]=start_address>>16;
    //	CAMER_TX_BUF[num++]=start_address>>8;
    //	CAMER_TX_BUF[num++]=start_address;
    	CAMER_TX_BUF[num++]=0x00;
    	CAMER_TX_BUF[num++]=0x00;
    	CAMER_TX_BUF[num++]=0x00;
    	CAMER_TX_BUF[num++]=0x00;
    	
    	CAMER_TX_BUF[num++]=data_len>>24;
    	CAMER_TX_BUF[num++]=data_len>>16;
    	CAMER_TX_BUF[num++]=data_len>>8;
    	CAMER_TX_BUF[num++]=data_len;
    	CAMER_TX_BUF[num++]=0x00;
    	CAMER_TX_BUF[num++]=0xff;
    	RS485_Send_String(CAMER_TX_BUF,num);
    	send_string_uart2_len(CAMER_TX_BUF,num);
    }
    

    1.6、清空图片缓存指令

    发送:56 00 36 01 03 返回:76 00 36 00 00

    /************************************************
    名称:void Clear_photo_cache(uint8_t camera_addres)
    功能:清除图片缓存
    输入:camera_addres:摄像头485地址。
    输出:成功:C_clear_photo_cache; 失败:C_error
    日期:2021-09-13
    作者:liuguizhou
    ************************************************/
    void Clear_photo_cache(uint8_t camera_addres)
    {
    	uint16_t num=0;
    	CAMER_TX_BUF[num++]=0x56;
    	CAMER_TX_BUF[num++]=Camera_addres; //485地址
    	CAMER_TX_BUF[num++]=0x36;
    	CAMER_TX_BUF[num++]=0x01;
    	CAMER_TX_BUF[num++]=0x03; //
    	RS485_Send_String(CAMER_TX_BUF,num);
    	send_string_uart2_len(Uart1_rcvbuff, Uart1_rcvindex);
    }
    

    1.7、设置拍照图片压缩率指令

    发送:56 00 31 05 01 01 12 04 XX 返回:76 00 31 00 00
    XX 一般选 36 (范围:0x36 ----0x90) 数值越大,图片质量越低,占用空间越小
    低于 0x36 时摄像头会默认设置成 0x36,高于 0x90 时,默认会设置成 0x90
    建议值:0x36(图片质量高) 0x54(图片质量中) 0x72(图片质量低)
    注意:上电默认压缩率 0x36,设置的压缩率掉电不保存,修改图片大小时压缩率会恢复默认 0x36

    /************************************************
    名称:void Set_photo_compressibility(uint8_t camera_addres,uint8_t ratio)
    功能:设置图片压缩率
    输入:camera_addres:摄像头485地址。
          ratio:压缩率 范围:0x36 ----0x90    低于 0x36 时摄像头会默认设置成 0x36,高于 0x90 时,默认会设置成 0x90
    输出:成功:C_set_photo_compressibility_success; 失败:C_error
    日期:2021-09-13
    作者:liuguizhou
    ************************************************/
    void Set_photo_compressibility(uint8_t camera_addres,uint8_t ratio)
    {
    	uint16_t num=0;
    	if(ratio>0x90)ratio=0x90;
    	else if(ratio<0x36)ratio=0x36;
    	CAMER_TX_BUF[num++]=0x56;
    	CAMER_TX_BUF[num++]=Camera_addres; //485地址
    	CAMER_TX_BUF[num++]=0x31;
    	CAMER_TX_BUF[num++]=0X05;
    	CAMER_TX_BUF[num++]=0X01; //
    	CAMER_TX_BUF[num++]=0X01; 
    	CAMER_TX_BUF[num++]=0X12;
    	CAMER_TX_BUF[num++]=0X04;
    	CAMER_TX_BUF[num++]=ratio; //
    	RS485_Send_String(CAMER_TX_BUF,num);
    }
    

    1.8、设置拍照图片大小指令

    (130 万像素系列图片默认大小为:1280960;200 万像素系列图片默认大小为 19201080)
    发送:56 00 31 05 04 01 00 19 11 (320240) 返回:76 00 31 01 00//图片长度约 11.2K
    56 00 31 05 04 01 00 19 00 (640
    480) //图片长度约 36K
    56 00 31 05 04 01 00 19 22 (160120) //图片长度约 4.5K
    56 00 31 05 05 01 00 19 33 (1024
    768) //图片长度约 80K
    56 00 31 05 05 01 00 19 44 (1280720) //图片长度约 92K
    56 00 31 05 05 01 00 19 55 (1280
    960) //图片长度约 136K
    56 00 31 05 05 01 00 19 66 (19201080) //图片长度约 520K
    注意:1920
    1080 仅支持 200 万像素摄像头及模块,设置图片大小指令后,无需复位,设置后可立即生效,设置数值保存在 flash 中,下次上电同样有效!如需对模块进行初始图片大小设置,也可使用谱泰通信公司专门设计的上位机软件串口摄像头测试工具 V1.08 直接进行设置,一张图片的长度除了与图片尺寸有关,还由实际场景的亮度和色彩所决定。上图图片长度仅为参考。

    /************************************************
    名称:void Set_photo_resolution(uint8_t camera_addres,uint8_t resolution)
    功能:设置图片大小
    输入:camera_addres:摄像头485地址。
          resolution:分辨率
    输出:成功:C_read_photo_len_success; 失败:C_error
    日期:2021-09-13
    作者:liuguizhou
    ************************************************/
    void Set_photo_resolution(uint8_t camera_addres,uint8_t resolution)
    {
    	uint16_t num=0;
    	uint8_t photo_size = 0x05;
    	if(resolution ==0x00 || resolution ==0x11 || resolution == 0x22)
    		photo_size=0x04;
    	CAMER_TX_BUF[num++]=0x56;
    	CAMER_TX_BUF[num++]=Camera_addres; //485地址
    	CAMER_TX_BUF[num++]=0x31;
    	CAMER_TX_BUF[num++]=0X05;
    	CAMER_TX_BUF[num++]=photo_size; 
    	CAMER_TX_BUF[num++]=0X01;
    	CAMER_TX_BUF[num++]=0X00;
    	CAMER_TX_BUF[num++]=0X19;
    	CAMER_TX_BUF[num++]=resolution; //
    	RS485_Send_String(CAMER_TX_BUF,num);
    }
    

    1.12、OSD 字符显示设置

    发送:56 00 86 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC DD DD … DD 返回:76 00 86 01 ZZ
    ZZ 最后一个字节表示 OSD 行数,共 4 行,值为 0-3,表示第 N 行。
    发送字段描述:
    56 1byte 固定帧头
    00 1byte 序号(0-255),默认 0
    86 1byte OSD 设置命令
    B0 1byte 命令长度,根据文字内容动态变化,固定 12 字节+文字内容总长度
    B1 1byte OSD 显示开关,1:启用;0:禁用
    B2 1byte 第 N 行(0-3),最多可显示 4 行
    B3 1byte 字号 0:字体 16x16;字号 1:字体 24x24;字号 2:字体 32x32
    B4B5 2byte X 坐标,130W(10 进制 0-1279)坐标需偶数;200W(10 进制 0-1918)坐标需偶数
    B6B7 2byte Y 坐标,130W(10 进制 0-959)坐标需偶数;200W(10 进制 0-1078)坐标需偶数
    B8B9 2byte 字体颜色 RGB555 顺序
    BABB 2byte 背景颜色 RGB555 顺序
    BC 1byte 文字长度,最长限制 160 个字符,即 80 个汉字
    DD…DD Nbyte 文字内容,仅支持 GB2312 编码汉字和 ASCII
    举例说明:
    发送:56 00 86 16 01 00 01 00 00 00 00 00 7C FF FF 0A 30 31 32 33 34 35 36 37 38 39
    返回:76 00 86 01 00
    发送字段描述:
    0x56, //固定帧头
    0x00, //序号
    0x86, //OSD 设置命令
    0x16, //命令长度,根据文字内容动态变化,固定 12 字节+文字内容总长度
    0x01, //OSD 显示开关,1:启用;0:禁用
    0x00, //第 N 行,(0-3)
    0x01, //字号 0:字体 16x16;1:字体 24x24;2:字体 32x32
    0x00,0x00, //x 坐标,130W(10 进制 0-1279)坐标需偶数;200W(10 进制 0-1918),坐标需偶数
    0x00,0x00, //y 坐标,130W(10 进制 0-959)坐标需偶数;200W(10 进制 0-1078),坐标需偶数
    0x00,0x7C, //字体颜色,蓝色 RGB555 顺序
    0xff,0xff, //背景颜色,白色
    0x0A, //文字长度,最长限制 160 个字符,即 80 个汉字
    0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39, //文字内容 ASCII“0123456789”
    注意:如果是中文,要以 GB2312 编码方式,一个汉字占 2 字节。
    返回字段描述:
    0x76, //固定返回帧头
    0x00, //序号
    0x86, //命令
    0x01, //固定数据长度 1
    0x00, //设置行数 0-3

    /************************************************
    名称:void Set_photo_resolution(uint8_t camera_addres,uint8_t resolution)
    功能:OSD 字符显示设置
    输入:camera_addres:摄像头485地址。
          str_len:写入数据长度
    			str_buf:写入数据
    输出:成功:C_read_photo_len_success; 失败:C_error
    日期:2021-09-13
    作者:liuguizhou
    ************************************************/
    void Set_OSD(uint8_t camera_addres,uint8_t str_len,uint8_t *str_buf)
    {
    	uint16_t num=0;
    	uint8_t i;
    	if(str_len>160)str_len=160;
    	CAMER_TX_BUF[num++]=0x56;
    	CAMER_TX_BUF[num++]=Camera_addres; //485地址
    	CAMER_TX_BUF[num++]=0x86;
    	CAMER_TX_BUF[num++]=0X00;//后续数据长度
    	CAMER_TX_BUF[num++]=0X01; //OSD显示开关 0:禁用   1:启用
    	CAMER_TX_BUF[num++]=0X00; //第几行显示(0-3),最多可显示 4 行
    	CAMER_TX_BUF[num++]=0X02;//字号 0:字体 16x16;字号 1:字体 24x24;字号 2:字体 32x32
    	CAMER_TX_BUF[num++]=0X00;//2byte X 坐标,130W(10 进制 0-1279)坐标需偶数;200W(10 进制 0-1918)坐标需偶数
    	CAMER_TX_BUF[num++]=0X00;//
    	CAMER_TX_BUF[num++]=0X00;//2byte Y 坐标,130W(10 进制 0-959)坐标需偶数;200W(10 进制 0-1078)坐标需偶数
    	CAMER_TX_BUF[num++]=0X00;//
    	
    	CAMER_TX_BUF[num++]=0X00;//2byte 字体颜色 RGB555 顺序
    	CAMER_TX_BUF[num++]=0X00;//
    	CAMER_TX_BUF[num++]=0X00;//2byte 背景颜色 RGB555 顺序
    	CAMER_TX_BUF[num++]=0X00;//
    	CAMER_TX_BUF[num++]=str_len;  // 1byte 文字长度,最长限制 160 个字符,即 80 个汉字
    	for(i=0;i<str_len;i++)
    	{
    		CAMER_TX_BUF[num++]=str_buf[i];			//Nbyte 文字内容,仅支持 GB2312 编码汉字和 ASCII
    	}
    	CAMER_TX_BUF[3]=num-4;//数据长度
    	RS485_Send_String(CAMER_TX_BUF,num);
    }
    

    1.16、多张连拍指令

    发送:56 00 88 03 B0 B1 B2 返回:76 00 88 01 ZZ
    B0 — 1byte 拍照数量,范围 0-5
    B1B2 — 2byte 连续拍照间隔时间,单位毫秒,范围 0-65535
    ZZ — 1byte 表示设置参数是否有效,0x00有效,0x01无效,例如拍照数量超过有效范 0-5时为
    无效返回 0x01
    举例说明:
    发送:56 00 88 03 03 00 64 返回:76 00 88 01 00
    发送字段描述:
    0x56 //固定发送帧头
    0x00 //序号
    0x88 //连拍命令
    0x03 //数据长度固定 3 字节
    0x03 //连拍图片数量 3 张,有效范围 0-5
    0x00 0x64 //连续拍照间隔时间 100 毫秒,范围 0-10000,10 秒
    返回字段描述:
    0x76 //固定返回帧头
    0x00 //序号
    0x88 //命令
    0x01 //固定数据长度 1
    0x00 //表示参数设置成功
    注意:
    (1)多张连拍指令与移动侦测连拍指令功能相似,是单张拍照指令的扩展,使用更自由方便;
    (2)多张连拍指令与移动侦测连拍指令共享 1-5 号图片缓存,不能同时使用,不然会覆盖已缓存的图片,且断电不保存,使用读图片长度指令和读图片数据指令可将 1-5 号图片缓存读取出来;
    (3)多张连拍指令的返回时间与连拍间隔时间有关,连拍间隔时间不宜设置过长,因为这段时间串口处于阻塞状态,无法响应其他指令,只有等待应答返回后才可执行其他新指令;
    (4)最多支持缓存 6 张图片,先执行多张连拍指令,再执行单张拍照指令:56 00 36 01 00,然后分别读取 0-5 号缓存即可,最后再执行清空缓存指令。

    /************************************************
    名称:void more_take_photos(uint8_t camera_addres,uint8_t photos_num,uint16_t interval)
    功能:多张连拍
    输入:camera_addres:摄像头485地址。
          photos_num:;连拍数量
    			interval:拍照间隔
    输出:成功:C_read_photo_len_success; 失败:C_error
    日期:2021-09-13
    作者:liuguizhou
    ************************************************/
    void More_take_photos(uint8_t camera_addres,uint8_t photos_num,uint16_t interval)
    {
    	uint16_t num=0;
    	if(photos_num>5)photos_num=5;
    //	else if(photos_num<0)photos_num=0;
    	if(interval>10000)interval=10000;
    //	else if(interval<0)interval=0;
    	CAMER_TX_BUF[num++]=0x56;
    	CAMER_TX_BUF[num++]=Camera_addres; //485地址
    	CAMER_TX_BUF[num++]=0x88;
    	CAMER_TX_BUF[num++]=0X03;
    	CAMER_TX_BUF[num++]=photos_num; //
    	CAMER_TX_BUF[num++]=interval>>8; 
    	CAMER_TX_BUF[num++]=interval;
    	RS485_Send_String(CAMER_TX_BUF,num);
    }
    

    总结

    以上就是对摄像机的各个功能函数的编写,剩下就是将他们组合完成我们后续功能。后期可能会将拍摄的照片通过FTP上传到平台。哪里的话,还需要对图片数据进行处理,可能一包数据无法完全上传一张图片,所以可能一张图片还需要分成几包数据上传。这一块的处理还在测试完善,就不上贴了。
    以下资料已经上传的我的资源中心,有需要可以免费下载!

    在这里插入图片描述

    展开全文
  • 基于单片机串口摄像头模块的读写C语言源程序
  • 哔哩哔哩项目展示视频: ...名称:STC89C52单片机最小系统板 购买链接:https://m.tb.cn/h.43JCfUl?sm=0792c6 4、电机驱动 名称:LN298 特点:驱动电流大,工作稳定,就是比较费电 5、电源 名称:186


    2021年10月27-2022年1月1日 可承接单片机设计,有意可添加Q2809786963

    这是一款可以传回视频图像的遥控小车

    哔哩哔哩项目展示视频:https://www.bilibili.com/video/BV1gf4y1v7qa
    在这里插入图片描述

    百度网盘资料链接:https://pan.baidu.com/s/1Qxm7A7pz6ktaHefDTkzhwg
    提取码:c3ol

    CSDN资料下载链接:https://download.csdn.net/download/mbs520/13134025
    取走记得点赞~
    在这里插入图片描述

    一、材料准备

    1、核心装备:wifi摄像头模块
    名称:正点原子WiFi摄像头模块
    简介:minifly四轴配套模块,体积小重量轻、WiFi通信60米距离 、720 30帧高清画面

    在这里插入图片描述

    2、电机选择

    名称:霍尔编码电机
    型号:620转

    这里用直流电机即可,这个贵,网上搜直流减速电机,最好带个轮子,方便安装
    在这里插入图片描述

    3、小车框架
    博主这个就直接锯木板了
    在这里插入图片描述
    或者直接购买智能小车底盘
    在这里插入图片描述

    4、主控芯片选择
    名称:STC89C52单片机最小系统板
    购买链接:https://m.tb.cn/h.43JCfUl?sm=0792c6

    5、电机驱动
    名称:LN298
    特点:驱动电流大,工作稳定,就是比较费电
    在这里插入图片描述

    6、电源
    名称:18650锂电池
    电压:3.7V
    (我的是废充电宝下拆下的,比较丑)
    在这里插入图片描述

    二、电路原理

    电路原理图(看不清请下载资料)
    在这里插入图片描述

    按图连接好

    在这里插入图片描述

    在这里插入图片描述

    三、源代码

    /*******************************************
    名称:51WIFI视频小车
    作者:化作尘
    时间:2020年11月20日11点27分
    邮箱:2809786963@qq.com
    *******************************************/
    
    #include "reg52.h"
    
    
    #define uchar unsigned char
    #define uint unsigned char
    
    
    /***小车控制定义**/
    #define DIR P1
    #define QIAN 0xaa 
    #define HOU 0x55 
    #define ZUO 0x5a 
    #define YOU 0xa5 
    #define STOP 0x00 
    
    
    void uart_init();
    void uart_tx_string(uchar *str);
    void uart_tx_byte(uchar str);
    void Delayms(unsigned int n);
    void Delayus(unsigned int n);
    
    uchar rec;//接收到的字节
    uchar buff[9]="00000000";//接收到的数据包
    uchar flag;//数据包开始接收标志
    uchar num; //数组下标
    uchar buf_ready;//接收到数据包置1
    
    /*********************************************************
    函数名:主函数
    *********************************************************/
    void main()
    {
            uart_init();
    				DIR = STOP;
            Delayms(1);
    				buff[3] = 0x80;
    				buff[4] = 0x80;
            uart_tx_string("hello buletooch car!\n");
            while(1)
            {
    								if(buf_ready == 1)//接收一组数据完成标志
    								{
    											buf_ready = 0;
    								}
    								if(buff[3]>0xd0){DIR = QIAN;Delayus(5);DIR = STOP;Delayus(5);}//buff[3]控制前后
    								else if(buff[3]<0x20){DIR = HOU;Delayus(5);DIR = STOP;Delayus(5);}
    								
    								else if(buff[4]>0xd0){DIR = YOU;Delayus(15);DIR = STOP;Delayus(5);}//buff[4]控制左右
    								else if(buff[4]<0x20){DIR = ZUO;Delayus(15);DIR = STOP;Delayus(5);}
    								else DIR = STOP;
            }
    }
    
    /*********************************************************
    函数名:串口中断
    *********************************************************/
    void uart_timer() interrupt 4
    {
            if(RI)
            {
    								RI = 0;
                    rec=SBUF;
    								
    								if(rec==0x66 && flag==0)//数据头
    								{
    											flag = 1;  
    											num=0;
    											buff[0] = rec;
    								}
    								else if(flag == 1)//开始接收数据包buff[8]
    								{
    									
    											num++;
    											buff[num] = rec;
    											if(num==7 && buff[7]==0x99)//接收到数据尾
    											{
    													buf_ready = 1;
    													flag = 0;
    													num = 0;
    											}
    											else if(num == 7)//接收错误
    											{
    													flag = 0;
    													num = 0;
    											}
    								}
            }
    }
    
    /*********************************************************
    函数名:串口初始化
    波特率:19200
    晶振:11.059M
    *********************************************************/
    void uart_init()
    {
    				TMOD=0x20;
    				TH1=0xfd; //9600
    				TL1=0xfd;
    				PCON=0x80;//9600*2
    				SCON=0x50;
    				TR1=1; //start Timer1
    				EA=1;
    				ES=1;
    }
     
    /*********************************************************
    函数名:串口发送一个字节
    *********************************************************/
    void uart_tx_byte(uchar str)
    {
            SBUF=str;
            while(!TI);
    				Delayms(2);
    }
    
    /*********************************************************
    函数名:串口发送一个字符串
    *********************************************************/
    void uart_tx_string(uchar *str)
    {
            while(*str!='\0')
            {
                    uart_tx_byte(*str++);
                    Delayms(2);
            }
    }
    
    /*********************************************************
    函数名:延时函数
    *********************************************************/
    void Delayms(unsigned int n)
    {
            unsigned int i,j;
            for(j=n;j>0;j--)
                    for(i=112;i>0;i--);
    }
    
    void Delayus(unsigned int n)
    {
            while(n--);
    }
    
    
    
    
    
    

    四、调试

    (一)APP使用

    1、安装WiFi模块配套APP
    下载我的资料,找到软件
    在这里插入图片描述

    2、等待WiFi模块初始化,开启需要15秒后蓝色led开始闪烁
    3、连接WiFi,找到MiniFly
    在这里插入图片描述
    4、打开软件,开启电源
    在这里插入图片描述
    5、看到画面,开启控制
    在这里插入图片描述
    (二)一般遇到的问题

    1、app连接不上
    解决方法:换手机

    2、连接上模块不能控制小车运动
    调试方法:
    1)用usb转ttl模块,模块连接电脑
    串口发送数据格式(串口波特率 19200,1 个启始位,1 个停止位,其它无):
    在这里插入图片描述
    2)用手机连接好模块,打开控制按钮,串口能接收到源源不断的控制指令
    在这里插入图片描述

    (三)仔细阅读两个手册

    在这里插入图片描述

    化作尘其它开源项目:

    单片机项目:

    基于stm32c8t6的坡道行驶巡线小车(2020年TI杯大学生电子设计竞赛 C题)https://blog.csdn.net/mbs520/article/details/115438122

    基于STM32F4的音乐播放器
    https://blog.csdn.net/mbs520/article/details/111313042

    基于STM32F4的电子阅读器(首创)
    https://blog.csdn.net/mbs520/article/details/110817173

    基于51单片机WiFi视频小车(首创)
    https://blog.csdn.net/mbs520/article/details/109843972

    基于51单片机蓝牙小车
    https://blog.csdn.net/mbs520/article/details/109775964
    基于MSP430 坡道行驶电动小车(2020年TI杯大学生电子设计竞赛 C题)
    https://blog.csdn.net/mbs520/article/details/109090072

    基于stm32f4的智能门锁系统
    https://blog.csdn.net/mbs520/article/details/106987758

    基于51单片机超声波测距小车
    https://blog.csdn.net/mbs520/article/details/106599219

    基于51单片机定时宠物喂食系统
    https://blog.csdn.net/mbs520/article/details/108292187

    Linux项目:

    基于QT5 Linux平台 停车场管理系统
    https://blog.csdn.net/mbs520/article/details/113481824

    基于QT5 Linux平台 车载系统
    https://blog.csdn.net/mbs520/article/details/112873809

    基于Linux系统 媒体播放器
    https://blog.csdn.net/mbs520/article/details/107880118

    基于Linux系统 语音识别、人机对话
    https://blog.csdn.net/mbs520/article/details/113179224

    基于Linux系统小钢琴程序(暂无博客)
    https://download.csdn.net/download/mbs520/12798287

    基于Linux系统 QQ通讯录管理系统(暂无博客)

    展开全文
  • 51单片机串口通信详解

    千次阅读 多人点赞 2020-10-05 19:36:02
    串口通信主要用于单片机与外部设备的通信。51单片机自身有圈双工的异步通信串口。 2、串口通信的通信方式 串口通信基本通信方式有两种:并行通信和串行通信。 串行通信:传送数据的各位按顺序一位一位发送或者接收 ...

    一、串口通信概念

    1、串口通信的作用

    串口通信主要用于单片机与外部设备的通信。51单片机自身有圈双工的异步通信串口。

    2、串口通信的通信方式

    串口通信基本通信方式有两种:并行通信串行通信
    在这里插入图片描述
    串行通信:传送数据的各位按顺序一位一位发送或者接收

    并行通信:传送数据各位同时发送或接收

    3、串行通信的通信方式

    串行通信根据帧信息的格式分为异步通信同步通信

    异步通信:一帧数据先用一个起始位“0”表字符开始,然后是5~8位数据,即该字符的代码,规定低位在前,高位在后,接下来是奇偶校验位(可以省略),最后一个停止位“1”表示字符结束

    同步通信:发送方在数据或字符前面用1~2字节同步字符指示一帧的开始,同步字符是双方约定好的,接收方检测到与规定的同步字符符合时,开始接收数据,发送方按顺序连续传送N个数据,N个数据传完后,发送1-2字节的校验码。

    接收端和发送端的同步由时钟实现

    同步通信省去了字符开始和结束的标志,一帧可以连续传送若干个数据,所以速度高于异步传送。

    4、通信方向

    串口通信的通信方向分为单工、半双工、全双工三种。

    单工传送:通信接口只能发送或者接收。

    半双工传送:通信接口可以接收也可以发送,但是发送和接收不能同时进行。

    全双工传送:两机的发送和接收可以同时进行

    一般情况下,我们的51单片机采用的为全双工,通过TXD,RXD两个通信接口同时进行数据的发送和接收。

    需要注意的是,51单片机在实物连线上要反接,一机的TXD应接另一机的RXD,RXD接另一机的TXD。而一些特殊型号的单片机标注正接,即RXD接RXD,TXD接TXD。

    5、串行通信接口的作用

    我们单片机内部的CPU只能处理并行数据,要进行串行通信,就必须要接我们的串行接口,按串行通信协议,进行数据的处理。具体的有

    A:实现数据格式化
    按串行数据格式,对CPU的并行数据进行处理。

    B:进行串行数据和并行数据的转换
    发送端,并行转串行送接收端;
    接收端,串行转并行送CPU;

    C:控制数据的传输速率
    接口应具备对数据传输速率----波特率的控制选择能力(具有波特率发生器)

    D:进行传送错误检测
    发送时,接口对传送数据在的生成奇偶校验位或校验码;在接收时接口检查校验位或校验码,以确定传送中是否有误码。

    51单片机内含的通信接口:
    51单片机内含一个全双工的异步通信接口,通过对串行接口写控制字可以选择其数据格式,内含波特率发生器,提供可选波特率,可完成双机通信或多机通信。

    二、串行口的结构和工作原理

    1、串行口结构

    在这里插入图片描述

    串行口主要由两个数据缓冲寄存器SBUF和一个输入移位寄存器组成,内部还有一个串行控制寄存器SCON和一个波特率发生器(T1定时器或内部时钟及分频器组成)

    我们串行口发送的数据先逐位进入接收端移位寄存器,再送入接收端SBUF。移位寄存器和SBUF采用了双缓冲结构,避免两帧数据发送混乱。

    2、串行口工作原理

    在这里插入图片描述
    A:发送机CPU向SBUF写入数据,启动发送过程

    B:按SCON设定好的控制方式和设定的波特率,由低位到高位一位一位的按移位时钟发送到电缆线上

    C:数据通过电缆线到达接收机

    D:接收机按照设定的波特率,按移位时钟一位一位的由低到高移入SBUF

    因此我们的发送机,接收机波特率必须保持一致,才可以正常的收发数据,即发送机移出的刚好被接收机移入。

    E:发送机发完一帧数据(发送缓冲器空),硬件置位发送中断标志位TI(SCON.1)位可作为查询标志,如果设置为允许中断,将引起中断,发送机可再发送下一帧数据。(先发后查

    F:接收机,预先置位REN(SCON.4)即允许接收,再按波特率由低到高进入接收机移位寄存器,数据收齐后(接收缓存器满),硬件置位RI(SCON.0),可作为查询标志,如果设置为允许中断,将引起接收中断,CPU方可从SBUF中读入这帧数据。(先查后收

    总结:
    ① 查询方式发送的过程:发送一个数据→查询TI→发送下一个数据(先发后查)
    查询方式接收的过程:查询RI→读入一个数据→查询RI→读入下一个数据(先查后收)
    ②通信双方波特率必须相同

    3、波特率的设定

    第一种方式:
    系统时钟分频值

    第二种方式:
    定时器T1提供(针对基础51来讲)

    波特率计算:
    当串口工作在工作方式0和2时,波特率固定。
    方式0时 fosc / 12
    方式2时 SMOD=0 fosc / 32 或 SMOD=1 fosc / 64

    方式1时
    波特率=(2^SMOD/32)*(单片机时钟频率/(256-X)) //X是初值
    在这里插入图片描述
    但一般情况下,我们是先确定波特率,再确定定时计数器初值
    在这里插入图片描述

    三、串行口的控制寄存器

    1、串口工作方式寄存器SCON

    在这里插入图片描述
    在这里插入图片描述

    2、电源控制寄存器PCON

    在这里插入图片描述

    四、串行口的具体应用编程

    1、定好波特率
    串行口波特率有两种方式:固定波特率和可选波特率
    当使用可变波特率时,应先计算T1的计数初值,并对T1初始化
    当使用固定波特率时,选择方式0、2

    2、填写控制字
    对SCON寄存器设置工作方式,若为接受程序,需置为REN=1(允许接收),同时将TI、RI置零(串口中断标志位)
    3、选择串行通信方式
    串行通信可采用两种方式:查询方式和中断方式
    TI和RI是一帧数据发送或接收完的标志,可用于查询;如果允许中断,可引起中断。

    查询方式:
    发送一个数据→查询TI→发送下一个数据(先发后查)
    查询RI→读入一个数据→查询RI→读入下一个数据(先查后收)

    中断方式:
    发送程序:发送一个数据→等待中断,在中断中发送下一个数据
    接受程序:等待中断,在中断中再接受一个数据

    注意:两种方式中,都要软件请TI、RI标志位,即用程序语句清0

    4、约定标志字符

    为了收发双方的协调,除了两边的波特率要保持一致,也可以约定标志字符作为发送数据的起始,先发送标志字符,待对方收到并回应之后,再正式发数据。
    当我们采用多机通信时,标志字符就相当于是各个分机的地址

    五、查询方式和中断方式详细流程

    1、查询方式

    在这里插入图片描述

    2、中断方式

    在这里插入图片描述

    六、例程

    #include "reg52.h"			
    
    typedef unsigned int u16;	  
    typedef unsigned char u8;
    
    void UsartInit()
    {
    	SCON=0X50;			//  0101 0000  设置为工作方式1  
    	TMOD=0X20;			//  0010 0000  设置计数器工作方式2
    	PCON=0X80;			//  1000 0000波特率加倍
    	TH1=0XF3;				//计数器初始值设置,波特率9600
    	TL1=0XF3;
    	ES=1;			//打开接收中断
    	EA=1;			//打开总中断
    	TR1=1;			//打开计数器
    }
    
    void main()
    {	
    	UsartInit();  //串口初始化
    	while(1);		
    }
    
    void Usart() interrupt 4  //串行口中断
    {
    	u8 receiveData;
    	receiveData=SBUF;//出去接收到的数据
    	RI = 0;//清除接收中断标志位 软件清零
    	SBUF=receiveData;//将接收到的数据放入到发送寄存器
    	while(!TI);			 //等待发送数据完成
    	TI=0;				 //清除发送完成标志位
    }
    
    
    
    展开全文
  • OV7670摄像头模块软硬件开发资料包括硬件参考设计+STM32 STC8单片机DEMO软件源码: 1、原理图(PDF格式) 2、封装库 3、芯片资料 4、配套例程源码 OV7725与OV7670摄像头对比.jpeg 实验1:OV7670摄像头串口传输图像...
  • MM32单片机 一、采用串口通信 串口通信想必大家都知道,这里就不多赘述了,如果有不了解的可以看我的往期文章【STM32】HAL库 CubeMX例程三—串口中断通信(2)(附工程源码) 1.OpenMV 首先找到OpenMV的串口(图:星...

    示例器件:

    • OpenMV
    • 英飞凌TC264单片机

    简介

    • OpenMV与TC264虽然都可以作为单独的微控制器来使用,但OpenMV是集成了摄像头的控制器,专门用于摄像头识别等作用,涉及到大量运算时,其性能、内存自然就不太够看
    • 而单片机其多用于控制、计算、通信等功能,性能优秀,内存充足
    • 所以一般使用OpenMV和单片机搭配使用,OpenMV识别,通过串口将信息传给单片机,单片机依靠强大的性能进行运算

    采用串口通信

    串口通信想必大家都知道,这里就不多赘述了,如果有不了解的可以看我的往期文章【STM32】HAL库 CubeMX例程三—串口中断通信(2)(附工程源码)

    一、 OpenMV

    首先找到OpenMV的串口(图:星瞳科技)

    • P4(Tx):发送端
    • P5(Rx):接收端

    接着打开OpenMV IDE,写入代码

    from pyb import UART
    uart = UART(3, 19200)
    
    #发送Hello World!
    while(True):
        uart.write("Hello World!\r")
    

    二、 TC264

    • P14_0(Tx):发送端
    • P14_1(Rx):接收端

    写入以下代码

    uint8 uart_buff;
    
    int core0_main(void)
    {
    	get_clk();//获取时钟频率  务必保留
    	//用户在此处调用各种初始化函数等
    	gpio_init(P20_8,GPO,0,PULLUP);//初始化灯,亮
        uart_init(UART_0, 19200, UART0_TX_P14_0, UART0_RX_P14_1);     //初始化串口
    
    	IfxCpu_emitEvent(&g_cpuSyncEvent);
    	IfxCpu_waitEvent(&g_cpuSyncEvent, 0xFFFF);
    	enableInterrupts();
    	
    	while (TRUE)
    	{
    	    if(uart_query(UART_0, &uart_buff))
    	    {
    	    	//如果从串口收到“Hello World!”,将灯关闭
    	        if(uart_buff == 'Hello World!')
    	        {
    	            gpio_set(P20_8,1);
    	        }
    
    	    }
    
        }
    
    }
    

    将单片机与OpenMV连线

    • P14_0(Tx)——P5(Rx)
    • P14_1(Rx)——P4(Tx)

    运行如下

    当OpenMV烧录代码后,立即发送了“Hello World!”,单片机接收到“Hello World!”,立即将灯关闭

    在这里插入图片描述

    展开全文
  • 串口摄像机,采用《标准串口摄像机协议》(见附录),并提供单片机C语言读取图像的程序例程及VC6.0的主要函数例程,以方便用户移值,快速上手;提供PC端测试程序。 产品特点 1、具有较低照度(月光级、星光级、...
  • //给串口调试器也发送个,证明代码运行了 WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR|UART_RXFIFO_TOUT_INT_CLR); uart_rx_intr_enable(UART0); #endif }else if(events->sig == 1){ #if UART_...
  • 内含好用的串口助手和基于灰度直方图全局二值化资料
  • 【程序】STM32F103RE单片机利用外部中断和DMA获取OV2640摄像头拍摄的照片,并通过串口发送到电脑上-附件资源
  • PTC08A RS485摄像头模组

    2014-08-30 20:46:53
    详细介绍了谱泰通信公司出品的RS485接口串口摄像头模组的接口规范和通讯指令协议。
  • 例程1:摄像头识别小圆,然后通过串口输出小圆的xy坐标。单片机可以直接接受,具体串口配置自己配置。 例程2:VSwin32命令控制台程序 调用串口,可以根据自己需要配置串口,完成windows与单片机的数据传输。可作为...
  • 69028+ESP32-CAM摄像头开发板+WiFi+蓝牙模块ESP32串口转WiFi物联网.zip
  • 本程序由STM32F103RE单片机利用外部中断和DMA获取OV2640摄像头拍摄的照片,并通过串口发送到电脑上修改而来,在STM32F107VC单片机上运行。程序修改成了基于STM32CubeF1 HAL+LL库。(详情请参阅原文) 摄像头用的是...
  • 基于ov529+stc12单片机串口摄像头方案,具有完整可用的源代码,keil项目文件。
  • 通过摄像头采集物体坐标,利用舵机转动使小球在木板上滚动。 通过摄像头采集物体坐标,利用舵机转动使小球在木板上滚动。 通过摄像头采集物体坐标,利用舵机转动使小球在木板上滚动。
  • PC端程序:在port.txt里面写好串口号,然后运行Release里面的程序接收图像,该程序是用Visual Studio 2012编译的单片机端程序:dcmi_ov2640.h和dcmi_ov2640.c是从STM32F4官方标准库里面的OV2640 DCMI例程里面找到的...
  • 单片机串口数据处理

    千次阅读 2018-05-17 18:08:53
    例如:GPRS模块、GPS模块、语音模块、热敏微型打印机、串口摄像头等等。在与这些模块进行数据通信都离不开串口,而对于串口的操作,由于串口本身没有标准的通信协议,所以很难做到非常统一的操作过程。一般来说,...
  • 1,用的库是官方的HAL库 2,硬件是原子的F429核心板(底板没有。。),用到的外设有,NANDFLASH、SDRAM、USB、一个按键 ...7,可以在串口上看到一些打印信息,核心板的串口是TTL电平的,需要自己转换。
  • 串口摄像头基于两种单片机的c程序 和电脑相连的软件
  • 内含ATK-OV7725(无FIFO)摄像头模块用户手册,原理图及器件封装,程序源码,芯片资料,配套串口摄像头软件等
  • jpeg图片接收显示测试上位机[串口 网络 摄像头上位机软件 开源] 温馨提示:资料请到原文下载 串口接收功能: 串口端口无限制,自动检测电脑可用端口,波特率从9600到921600可选,默认不支持流控制和奇偶校验,8位...
  • 有做飞思卡尔摄像头的,可用些程序调试摄像头,数据可通过串口发送至电脑
  • 摘 要 随着社会的迅速发展,科技技术的突飞猛进,无线视频监控系统眼下名声鹊起成为炙手可热的话题。...摄像头所采集到的图像信号转换成模拟电压信号,送入到混频电路,混出射频信号,最后放大后发送出去..
  • 但由于部分场景现场监控并不需要过多的检测,只需定时返回现场环境即可,4G串口摄像头极大的方便这方面的需求。不需过多的流量,及能反馈现场环境。 针对目前野外的环境,无电无网情况下,需要使用全网通的4G网络,...
  • stm32摄像头程序

    2015-01-08 13:14:08
    stm32控制摄像头采集数据,并接收到ab指令后将图像数据通过串口发送出去

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,467
精华内容 586
关键字:

串口摄像头单片机