2017-08-11 08:40:46 yueqiuchen 阅读数 1127
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3995 人正在学习 去看看 朱有鹏

最近有个小的训练

大致是需要用摄像头检测圆,然后把圆的xy坐标发送给单片机。

但是网上大部分都是基于MFC串口控件的例程。大海捞针找到了个win32命令控制台的串口例程 ,自己改了一下贡献出来。

 

直接调用API实现串口通信

 

两个例程

如果编译运行有问题 直接复制源文件到新win32命令工程中运行


平台-VS2013-win32


例程1:摄像头识别小圆,然后通过串口输出小圆的xy坐标。单片机可以直接接受,具体串口配置自己配置。摄像头需要 opencv的库,我的库是opencv2.4.12。

 

例程2:VSwin32命令控制台程序 调用串口,可以根据自己需要配置串口,完成windows与单片机的数据传输。可作为开发参考使用。

 

代码写的很烂,玩一玩还行,仅供参考。

 

最新1C币下载链接:https://download.csdn.net/download/yueqiuchen/10452176

2019-07-23 10:05:39 lirunqi3 阅读数 498
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3995 人正在学习 去看看 朱有鹏

现在在做一个硬件项目,主要是用“高端的”51单片机连一个摄像头完成二维码识别的问题。

目录:

一、解决方案

二、详细分析

 

一、解决方案:

现在的需求是:给出二维码(可能存在图像偏移、旋转等问题),输出一个解码的字符串

 

 

 

解决方案目前是这样设计的:

这里有几个点:

1. 选什么摄像头

2. 摄像头怎么连开发板

3. 开发版上面怎么编程?怎么获取io信息

4. 怎么输出

 

当然,本项目最关键的还是其中的识别过程。

 

 

 

一、选什么摄像头

基本上所有的OV系列的摄像头都差不多,选择了一款比较常规的ov7670摄像头

 

 

二、摄像头怎么连接开发板

这个目前打算用杜邦线解决

 

 

三、开发版上面怎么编程?怎么获取io信息

这也是本项目的难点,因为一直是做深度学习算法,对于硬件开发根本不会。本节也记录学习历程。

 

首先,了解一下51单片机的原理:

51单片机是由存储器、控制器、io组成的微型计算机。

所有的引脚可以分为电源、时钟、控制、IO这几种,51单片机属于8位单片机。

 

单片机基础补充:

(1)电平特性:高电平(5V)低电平(0V)

(2)进制

(3)逻辑运算:0   1

与或非、异或

串口与并口:串口就是速度快的一种直线型传输,并口是指8根通道齐发由于数据间会存在干扰,所以速度会慢。

(4)编程语言

基本上使用C与汇编

上拉电阻?

就是一种用来控制空电极的东西?这个还没弄懂

晶振

通过晶体振动提供频率信号

 

 

 

回到主题,怎么在单片机上编程呢?这里使用的是keil,安装教程如下:https://blog.csdn.net/qq_41639829/article/details/81813992

 

二、详细分析:

第一个问题就是资源占用问题,图像从摄像头弄到板子上需要的是数据空间,对图像数据进行处理,也需要计算空间,那么这些东西究竟需要多少资源呢?

除了以上的问题,还有问题就在于,哪些是在rom上进行,哪些是在ram上进行。

我们先弄清楚哪些在rom上进行,哪些是ram上进行的。

ram(数据存储器)、rom(程序存储器)--------------------确定

那么我们的程序放在rom里。

(插一句,我们的rom和ram分别有多大呢?

说明文档说了T5L芯片是片内64KB的RAM,ROM是32KB)

 

好,现在能确定的是代码的编码需要存在ROM里面,运算可以在MDU(数学运算单元)中进行。那么现在问题就在于每一帧的图片以及如何选取计算的量应该就是在RAM中进行了。无疑问题就在于我们的图片输出多大。接下来就是ov7060摄像头的研究分析了。

ov7060摄像头

YUV4:2:2

这个是个啥?就是输出的码流,她每一次都会输出Y,每隔一次输出U\V,对于一个这样的[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3],输出是这样的Y0 U0 Y1 V1 Y2 U2 Y3 V3

但是我们需要知道他输出的分辨率,图像的大小,与这个无关,继续看。

他反复提到一个感光阵列(640X480)这个长得很像像素,那么感光阵列是个啥?了解完毕,就是像素。

那么我们又能更新一条有用信息:摄像头的输出是30万像素的。

 

那么对于空间资源的最后一个问题就是,需要多少RAM来处理这30万像素?

 

如图所示,图片是进到这个数据寄存器里面,就是那额256KB

 

 

2019-10-29 16:28:56 Nrush 阅读数 43
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3995 人正在学习 去看看 朱有鹏

nr_micro_shell — 在单片机上体验linux shell命令行,自动补全,历史命令,自定义命令

单片机在进行实际调试和维护时,常常需要与单片机进行交互,获取或设置某些参数,以了解系统工作状态。nr_micro_shell正是为满足这一需求,针对资源较少的MCU编写的开源命令行工具。nr_micro_shell具有以下优点

1.使用简单,灵活方便。。使用过程只涉及两个shell_init()和shell()两个函数,无论是使用RTOS还是裸机都可以方便的应用该工具,不需要额外的编码工作。

2.交互体验好。完全类似于linux shell命令行,当串口终端支持ANSI(如Hypertrm终端)时,其不仅支持基本的命令行交互,还提供Tab键命令补全,查询历史命令,方向键移动光标修改功能。

3.可扩展性好。nr_micro_shell为用户提供自定义命令的标准函数原型,只需要按照命令编写命令函数,并注册命令函数即可使用命令。

以下是在stm32f103c8t6平台,串口终端为Hypertrm下的测试效果

在这里插入图片描述
如果各位对此工具感兴趣,可去 https://github.com/Nrusher/nr_micro_shellhttps://gitee.com/nrush/nr_micro_shell下载源码。如果你认为这个项目对你有所帮助,请在github或gitee进行Star,以鼓励作者。当然如果您有什么想法和问题也欢迎在项目中留言交流。

单片机
2013-06-09 22:18:00 a379039233 阅读数 4778
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3995 人正在学习 去看看 朱有鹏

      单片机就是一个小的计算机,不过他没有计算机那么好,方便的输入输出设备,计算机的输入设备就是鼠标,键盘等,方便的很,输出设备就是显示器,将输出非常清晰的显示在屏幕上。但是单片机的输入输出都是他的引脚,需要通过编程控制。

       单片机和PC机相同的地方就是都有CPU(我把单片机的微控制器核也叫CPU),内存(单片机的ROM,RAM,FLASH等),时钟系统,中断系统,定时器等等。

      一, 单片机最小系统就是单片机能够运行起来的必要条件:

   1.电源 2.晶振 3.复位电路  没有电源就没有能源,就不能工作;没有晶振,就没有时钟电路,就没有节拍,指令就不能按一定的步调运行;没有复位电路,单片机就很不可靠,会出现“死机”、“程序走飞(PC)”等现象。
   
   二,一些重要概念
    1. 我们对单片机编程不过就是设置单片机内部的寄存器和端口引脚以便输出高低电平控制其他(连接在单片机上)器件而已。
    2. 编程中最重要的是1:配置时钟,2:配置IO口,3:配置复位方式,看门狗设置等等
       次要的是:中断(外部,定时器,串口),串口,ADC,XRAM读写,内部FLASH等。   
    3. 1个机器周期 =12个时钟周期(晶振的振荡周期)   
    4. while(1);让单片机一直工作,等待中断!防止程序跑飞等。
    5. 51单片机共111条汇编指令,
7种寻址方式:
1.立即寻址 MOV A,#01H
2.直接寻址 MOV A,20H
3.寄存器寻址 MOV A,R3(A,B,Cy,DPTR)

4.寄存器间接寻址 MOVA,@R0  R1
5.变址寻址 MOVC  A, @A+DPTR
6.相对寻址 SJMP   rel; (PC)←(PC) + 2(指令长度) +  rel
7.位寻址 位寻址是直接寻址方式的一种,其特点是对8位二进制数中的某一位的地址进行操作。
MOV 00h,C,MOV  20H.0, C  ,PSW.6
 
     6. XRAM(分内外)读写 
      1> XBYTE[address]=data   写数据
         data=XBYTE[address]   读数据;
   2>char xdata *mydat;
      ......
      mydat=(char xdata*)0x0030;
      *mydat=31;
   3>汇编方式
	mov dptr,#1000h
	mov a,#55h
	movx @dptr,a
      7.  读端口信号是必须先向端口写“1”,然后再读,这就是单片机口信号的准双向的含义。切记!
      8.  模拟输入或数字I/O,推挽(强)或漏极开路输出(IO,inout)

 
9. 一些寄存器默认设置即可,配置了可能会有警告。usb clock.clksel=1  10. Keil C 里面Lib库文件的生成与调用,可以自己做lib。
11. ram高128位只能间接寻址。idata,一些人可能没有用到idata,发现data不够用。
12 1s=1000ms=1000000us=1000000000ns.
13.
x M晶振定时 y ms: TH1 = (65536 - (x/12)*y*1000) / 256;     TL1 = (65536 - (x/12)*y*1000) % 256;16位的哦,亲!
假设C8051F020单片机的晶振是22114800Hz,测每秒计22114800个数 经过12分频后,每秒计22114800÷12=1842900个数,如果设置计数器初值是 0xfe90(即十进制65165),则需要计的数的个数为65535-65165=360,那么定时器的 时间为(360÷1842900)(S)≈0.195ms,即0.2ms。
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long #define bool  bit
 
#include<C8051F330.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long //引脚定义
sbit In1= P0^3; sbit In2= P0^7; sbit In3= P1^3; sbit In4= P1^7; sbit Out1= P0^3; sbit Out2= P0^7; sbit Out3= P1^3; sbit Out4= P1^7;
//----------------------------------------------------------------------------- //功能:延时 //入口参数:yc //出口参数:无 //-----------------------------------------------------------------------------
void delay(uint time)
{
  while(--time);
}
//----------------------------------------------------------------------------- //功能:单片机C8051F330初始化 //入口参数:无 //出口参数:无 //-----------------------------------------------------------------------------
void Mcu_Init(void) { 
  PCA0MD&=~0x40;                 //禁止内部看门狗  
  OSCICN = 0x83;                 //内部振荡控制寄存器,使能H-F,八分频  
OSCICL = 0x00;                 //期望输出频率也是24.5MHz
  CLKSEL = 0x00;                  //系统时钟取自内部高频振荡器  
RSTSRC = 0x04;                 //检测到时钟丢失时允许系统复位
}
 
 
//----------------------------------------------------------------------------- //功能:MCU I/O口配置 //入口参数:无 //出口参数:无 //-----------------------------------------------------------------------------
 
void PORT_Init (void) {    
P0MDOUT  = 0x88;                         //P0.3,P0.7推挽输出   
P1MDOUT  = 0x88;                  //P1.3,P1.7推挽输出   
XBR0     = 0x00;  
  XBR1     = 0x40;                  //使能交叉开关和弱上拉 }
//----------------------------------------------------------------------------- // 功能:所有设备初始化 //----------------------------------------------------------------------------- // 入口参数:无 // 出口参数:无 //-----------------------------------------------------------------------------
 
void Init_Device (void) {   
Mcu_Init();   
PORT_Init();
} void main() {
     Init_Device();     
delay(10);          
     while(1){            }
 
}
2019-08-25 18:48:11 qq_21475601 阅读数 302
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3995 人正在学习 去看看 朱有鹏

1)单片机嵌入式二维码(QRcode)生成

2)单片机嵌入式二维码(QRcode)解码

在我另一篇博客关于 “嵌入式二维码生成” 的博客里,经常会有小伙伴咨询关于单片机上做二维码解码的方法,其实直接利用单片机做解码基本是不可行的,不是速度慢就是内存不够,因为绝大多数单片机的资源是捉襟见肘的。

因此本博主推出嵌入式二维码解码模组,需要在嵌入式环境做二维码解码的朋友,有福了。

它体积小巧更易集成,识别速度飞快(15次 / 秒),串口TTL通信,自带LED补光灯,可接蜂鸣器。可以和任意单片机、嵌入式处理器连接使用,是小伙伴们做产品、做毕设、做比赛等的绝佳选择。另外,如果有特别需要,还可联系本博主定制需求。

可在 x宝 上搜索 店铺 “长安城的奇妙工坊”,也可直接咨询博主:QQ:1057512496。

直接上图:

嵌入式二维码解码模组

 

没有更多推荐了,返回首页