2017-09-02 21:42:23 ML_SDD 阅读数 2476
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

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

2017年全国大学生电子设计大赛I题可见光定位问题,本方法提供一种基于位置指纹的无线定位思路,需要离线构建无线指纹库(信号强度构成的向量与对应位置标签),再用机器学习算法,例如KNN进行定位,由于比赛只允许在单片机上运行,因此针对比赛用C改写了一个可直接在单片机裸机上运行的KNN算法。

2.为什么要用C

因为诸于python等高级语言编写的机器学习代码需要有操作系统支持,而一般意义上的单片机无法运行Linux,Windows等可以支持高级语言的操作系统,因此需要使用单片机裸机或者ucOS可以支持的C 语言进行改写。

/***********************************   
     Author: ML_SDD  
     T: 2017.8.12
***********************************/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define A_L  81

//Map这个二位数组用来保存测量好的[RSS1,RSS2,RSS3,X,Y]
unsigned char Map[A_L][5] = {};
int Dis[A_L][3];//Dis的元素分别为RSS的距离,X,Y的坐标
int k = 3;//初始K=3为找最近的3个样本
unsigned char Input[3]={0};//这里是初始化,要放的是AD做完转换后的RSS数据
//全局变量用于保存x,y的数据,以便使用
unsigned char result_x = 0;
unsigned char result_y = 0;

unsigned char knn_predict(unsigned char *Input)
{
    unsigned char i,j,n,p;//for循环控制变量
    unsigned char temp_dis,temp_x,temp_y;//数据暂存变量,冒泡排序用
    unsigned char result_sum_x = 0;
    unsigned char result_sum_y = 0;
    for(i=0;i<A_L;i++)
    {
        Dis[i][0] = sqrt((Map[i][0]-Input[0])^2 + (Map[i][1]-Input[1])^2 + (Map[i][2]-Input[2])^2);
        Dis[i][1] = Map[i][3];
        Dis[i][2] = Map[i][4];
    }
    //冒泡排序
    for(j=0;j<A_L-1;j++)
    {
        for(n=0;n<A_L-j-1;n++)
        {
            if(Dis[n][0]>Dis[n+1][0])
            {
                temp_dis = Dis[n][0];
                Dis[n][0] = Dis[n+1][0];
                Dis[n+1][0] = temp_dis;
                //------------------
                temp_x = Dis[n][1];
                Dis[n][1] = Dis[n+1][1];
                Dis[n+1][1] = temp_x;
                //------------------
                temp_y = Dis[n][2];
                Dis[n][1] = Dis[n+1][2];
                Dis[n+1][2] = temp_y;
            }
        }
    }
    for(p=0;p<k;p++)
    {
        result_sum_x = result_sum_x + Dis[p][1];
        result_sum_y = result_sum_y + Dis[p][2];
    }
    result_x = result_sum_x / k;
    result_y = result_sum_y / k;
}
2017-11-12 21:54:21 pyromaniac 阅读数 1637
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

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

1,电平:数字电路中只有两种电平,高电平和低电平,对应的是计算机中的二进制原理。

2,晶振电路:决定单片机运行的节奏,即频率。

3,复位电路:重置开发板。

4,机器周期:一个机器周期包含12个时钟周期,在一个机器周期内,cpu就可以完成一个独立的操作。

5,时钟周期:也称为振荡周期,由晶振电路产生,指的是为单片机提供时钟脉冲信号的振荡源的周期。

6,在单片机编程时,一定要带reg52.h(51单片机),原因是该头文件已经将MCU中的IO口全部定义好了,只要对照结构图,就可以在头文件中找到代表对应接口的变量,进而就可以对这些变量进行操作,相当于直接操作对应的IO口了。

7,sfr:特殊功能寄存器,也是一种单片机扩充的数据类型,利用它可以访问51单片机内部的所有特殊功能寄存器。例:sfr P0 = 0x80;//定义P0接口,其地址就是0x80 (sfr定义的是8位的特殊功能寄存器,sfr16,则是用来定义16位的特殊功能寄存器的)

8,sbit:对应的是可位寻址空间的一个位,单片机里的可位寻址区域:20H~2FH,一旦用了sbit XXX =地址 这样的定义,这个变量的地址就确定了。sbit大部分是用在寄存器中的,目的是为了方便对寄存器的某位进行操作。

9,高阻态:既不是高电平也不是低电平的状态。

10,锁存器:是一种有好几种模式的电路结构,某一种模式下输出端的状态不会随着输入端状态变化而变化;在另外一种模式下才会随着输入信号的变化而变化。它是通过改变LE位的值来改变它的模式,当LE位为高电平时,锁存器输出的是当前输入的值;当LE位为低电平时,锁存器输出的是之前一次保存的值。它的主要作用就是缓存,其次就是完成高速控制器与慢速外设的不同步的问题。

11:芯片引脚标志上的横线代表该引脚是低电平有效。

12:数码管的结构原理:数码管的控制分为位选和段选,段选决定的是单个数码管显示的数;位选决定的是哪些数码管会被点亮。

13:数码管的动态显示:动态显示是用的人眼的视觉暂留效应来形成的。因为八位的数码管同时只能显示一个数值。

14,定时器:就是一个计数器,每经过一个机器周期,计数器就+1,定时器是由两个计数器控制的,一个是控制寄存器TCON,一个是模式寄存器TMOD。

15,定时器的控制寄存器TCON:它有两个主要的标志位,TF:溢出标志位,当定时器计数溢出的时候,由硬件把这个位置1,该位是可以由软件置0的;TR:运行控制位,由软件置1或者清零,为1的时候才允许定时器开始计数。

16,定时器的模式寄存器TMOD:它有几个主要的标志位:GATE位:控制的是定时器的启动模式;C/T位:控制的是定时器的计数方式,1代表的是计数器,用外部的脉冲作为计数单位,0为定时器,用的是内部的机器周期作为计数单位;M0位和M1位:控制定时器(计数器)的工作模式。

17,编程使用定时器(计数器)的步骤:
设置定时器的工作模式(通过TMOD)
设置定时器的初值
启动定时器(通过TCON)
定时器开始之后,查看TCON的TF位是否溢出(置1),如果为1,并且要继续使用定时器,则需要通过软件将它清零,如果是8位自动重装模式,则不需要手动清零

18,键盘有编码键盘和非编码键盘两种,编码键盘通过硬件电路产生被按按键的键值码,这种键盘的特点是使用方便,所需程序简单,但是硬件电路复杂。如计算机的键盘就属于编码键盘;非编码键盘则是通过程序来识别按下的键,它的硬件结构相对简单,但是程序识别会困难一些,单片机上的键盘就是非编码键盘。
非编码键盘包含独立键盘和矩阵键盘两种,独立键盘是每个按键单独对应硬件上的一位;而矩阵键盘上的每个按键对应的是硬件上某几位的组合。

19,按键特性:按键的按下与释放是通过机械触点的闭合和断开来实现的,因为机械触点的弹性作用,在闭合和断开的过程中均会有一个抖动的过程,因此在进行键盘按键识别编程的时候需要用软件延时来跳过这段抖动的时间。

20,在软件判断是否按下按键的时候,需要在判断语句之后加上松手检测环节,以免循环判断。

21,根据矩阵键盘的电路结构,在编程判定到底按下的是哪个按键的时候,需要先将行线位全部赋值为0,列线全部赋值为1,再看列线的值的变化,判断按键是属于哪一列;随后将列线位全部赋值为0,行线位全部赋值为1,再看行线的值的变化,判断按键是属于哪一行。从而定位到按键的具体位置。

22,单片机每次上电的时候必须进行复位,否则容易出现程序错乱。所以单片机硬件在设计的时候就考虑到了这个问题,根据复位的电路结构就可以看出,每次上电都会给电路中的电容充电,从而自动进行复位操作,同时电路中也提供一个按钮可以手动复位。

23,51单片机中一共有5个中断源,其中两个为外部中断,均由低电平或下降沿引发,外部中断接口分别为P3.2和P3.3的复用接口,可以通过特殊功能寄存器TCON的低四位来控制。3个内部中断分别是两个定时器中断和一个串口通讯中断。

24,TCON的低四位:
IE0/IE1:外部中断触发标志位,0代表没有外部中断申请,1代表有外部中断申请。
IT0/IT1:中断触发方式的选择位,0代表低电平有效,1代表负跳变有效。

25,单片机中断的撤销:
定时器中断执行后由硬件自动撤销;
串行口中断的撤销:在中断执行后需要人工将标志位清零(T1和R1)
外部中断的撤销分为两类:
负跳变方式中断的撤销:在中断执行后由硬件自动撤销。
低电平方式中断的撤销:在中断执行结束后需要人工将中断引脚置为高电平。

26,中断允许控制寄存器IE:控制单片机中断开启和关闭的寄存器,其中的几个位的意义如下:
EA:中断总允许位,取0时禁止全部中断,取1时允许中断
ES:串行口中断允许位,取0时禁止串行口中断,取1时允许串行口中断
ET0/ET1:定时器中断允许位,取0时禁止定时器中断,取1时允许定时器中断
EX0/EX1:外部中断允许位,取0时禁止外部中断,取1时允许外部中断

27, 单片机的中断优先级控制寄存器IP(只有后五位有效,并且可以位寻址):
PX0/PX1: INT0/INT1 外部中断优先级控制位,0表示低优先级,1表示高优先级
PT0/PT1: T0/T1 定时器溢出中断优先级控制位,0表示低优先级,1表示高优先级
PS: 串行口中断优先级控制位,0表示低优先级,1表示高优先级

28,单片机同优先级中断查询顺序(由高到低):
外部中断0,T0溢出中断,外部中断1,T1溢出中断,串行口中断。

29,编程写单片机的中断响应函数的时候,需要在函数名后面加上interrupt关键字,并加上标号,标号由中断查询顺序决定,由高到低分别是0~4。
例: void INT0() interrupt 0 //外部中断0的响应函数,由于外部中断查询顺位是第一位,所以标号为0

30,并行通信和串行通信
并行通信:数据的各位同时在多根数据线上进行发送或者接收
串行通信:使用一条数据线,将数据一位一位的顺序传输

31,串行通信的种类:
异步通信:是以帧为单位进行传输的方式,帧与帧之间的时间间隔是任意的,但每个帧中位和位之间的时间间隔都是固定的。
同步通信:建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。即发送数据的每一位的到达时间都不同,但是它们到达的间隔时间都是相同的。

32,串口通信的三种制式:
单工:单向的(或者是收或者是发)
半双工:(串行通信)收/发不可同时进行
全双工:(串行通信)收/发可同时进行

33,比特率:每秒钟传输二进制代码的位数
注意:串口通信的时候,发送端和接收端的比特率要相同

34,单片机串口通信的数据缓存器SBUF:SBUF只有一个,它既表示发送寄存器,又表示接收寄存器,在CPU往SBUF上写数据时,数据就会被送入发送寄存器准备发送;在CPU读取SBUF上的数据时,则读入的数据一定来自接收寄存器。
例:a = SBUF; //用变量a接收串口通信的数据
SBUF = a; //将a的值作为传输数据发送

35,串行控制寄存器SCON:是一个既可以字节寻址又可以位寻址的8位特殊功能寄存器。单片机复位时,SCON所有位均清0。几个比较重要的位的意义如下:
SM0和SM1:为工作方式选择位,可选择四种工作方式,最常见的工作方式是SM0=0,SM1=1,此时工作方式是10位的异步收发器,每帧传送8位数据(加两位帧头尾),此模式下比特率可变
REN:串行接受允许控制位。该位由软件置位或复位。当REN=1,允许接收;当REN=0,禁止接收。
TI:发送中断标志位。TI=1,表示已结束一帧数据发送,可由软件查询TI位标志,也可以向CPU申请中断。注意:TI在任何工作方式下都必须由软件清0。
RI:接收中断标志位。RI=1,表示一帧数据接收结束。可由软件查询RI位标志,也可以向CPU申请中断。注意:RI在任何工作方式下也都必须由软件清0。

36,由于单片机串行通信只有一个中断,所以TI=1的时候或者RI=1的时候(前提是该中断被打开)都会触发该中断,因此在中断程序中必须由软件查询TI和RI的状态才能确定究竟是接收还是发送中断,进而作出相应的处理。

37,51单片机的串口通信的波特率的设置:
根据串口的电路结构,串口通信的波特率默认是由定时器1来设置的,具体设置的方法和定时器1的开启方法相同:
设置定时器的工作模式(通过TMOD,设置为8位自动重装模式)
设置定时器的初值(TH1和TL1的值要相同)
启动定时器(通过将TCON的TR1位置1)
波特率的大小和初值有关,关系如下(串口通信方式1):
波特率 =(2的SMOD次方/32)·(T1溢出率)

38,电平转换芯片的作用:
当两个不同的设备要进行通信的时候,以计算机和单片机为例,存在电平不兼容的问题,计算机的逻辑0(低电平)为3~15v,逻辑1(高电平)为-15~-3v,而单片机的逻辑0为0~0.8v,逻辑1为3~5v,因此需要电平转换芯片来使它们的高低电平做一个对应的映射,从而实现不同的设备之间的通信。

39,typedef和define的用法与区别
define是预处理指令,在编译预处理时进行简单替换,不做正确性检查,不管含义是否正确,照样带入,只有在编译已经被替换后的源程序时才会发现可能的错误并报错。
typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,而#define只是简单地替换

40,模拟量和数字量
模拟量:自然界连续变化的物理量。所谓连续,包含两个方面的含义
一方面从时间上来说,它是随时间连续变化的;
另一方面从数值上来说,它的数值也是连续变化的。这种连续变化的物理量通常称为模拟量。
数字量:计算机中处理的是不连续变化的量,离散性的数字量

41,模拟量输入方式:差分输入与单端输入
单端输入,输入信号均以共同的地线为基准.这种输入方法主要应用于输入信号电压较高(高于1 V),信号源到模拟输入硬件的导线较短,且所有的输入信号共用一个基准地线.如果信号达不到这些标准,此时应该用差分输入.对于差分输入,每一个输入信号都有自有的基准地线;由于共模噪声可以被导线所消除,从而减小了噪声误差.
单端输入时, 是判断信号与 GND 的电压差. 差分输入时, 是判断两个信号线的电压差.
信号受干扰时, 差分的两线会同时受影响, 但电压差变化不大. (抗干扰性较佳) 而单端输入的一线变化时, GND 不变, 所以电压差变化较大. (抗干扰性较差)

42,EEPROM:
EEPROM(带电可擦写可编程读写存储器)是用户可更改的只读存储器
,其可通过高于普通电压的作用来擦除和重编程(重写)。不像EPROM芯片,EEPROM不需从计算机中取出即可修改。在一个EEPROM中,当计算机在使用的时候可频繁地反复编程,因此EEPROM的寿命是一个很重要的设计考虑参数。EEPROM是一种特殊形式的闪存,其应用通常是个人电脑中的电压来擦写和重编程。
EEPROM,一般用于即插即用(Plug & Play)。
常用在接口卡中,用来存放硬件设置数据。

2017-11-04 20:57:23 tongjinrui 阅读数 265
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

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


首先,本科和研究生都学的计算机,本科阶段主要学的是嵌入式系统,有关单片机的内容。
研究生阶段,尝试过学习PHP和JAVA的方向,但是为此还是没有找到能激起我内心兴奋的那个点,后来学习机器学习,但是有一阵子被吓得退缩了。直到现在才感觉越学越兴奋,我想这条路走对了。


机器学习的任何一本理论教材中,都会出现一些数学名词,比如矩阵的求导,似然概率,特征向量,欧式空间等等……一大推数学和专业词汇出现在我的面前,刚开始表示真的被吓到了。明显感觉入门比较难,可是后来还是入了门,并没有老师和学长带,全是自己学习和研究的,那么这中间的过程是怎么样的,我会谈谈自己的经验,希望有更多的人和我一起,勇敢面对未来的困难尽管有些东西刚开始并不擅长,但是别退缩。


当然了,也不能死学,一定要动动脑子,在学习的过程中,用类比的思维对未知的知识进行归纳和总结如果有特别不熟悉的东西,不要奢望一下子什么都记着,知识要反复看的。我的第一本入门教材是周志华的《机器学习》,买来好久没看,因为简直就像天书,看着高大上,但是什么都看不懂。


刚开始的时候,特别感觉难,需要学习的东西特别多。请注意,这里我说的懂是从根本的原理到应用,偏向于理论层面,如果代码层面,只要会调用,那不算明白。但是校招的时候,如果没有开发经验,也没关系的,公司还是比较偏向于个人的基础如何,所以理论一定要扎扎实实,这样你的成长空间才会更大。


因为算法无穷无尽,但是只要有基础,就能很快的跟上,所以我给想入门的同学什么建议呢,如下:
1、有一两本专业书即可,《机器学习实战》《机器学习》《统计学习方法》,数学和概率论的基础等需要学的时候再用,到时候网上现查资料,比如什么叫做拉普拉斯矩阵等等


2、由于机器学习入门确实挺高的,所以建议小白们,要通过先接受别人的理解方式帮助自己理解,然后再转化为自己的理解方式,如果基础都没有,别谈什么创新,最重要的就是,少问为什么,慢慢理解,别陷入局部的问题之中,说白了就是别钻牛角尖。理解的部分,我个人是通过看视频的方式,推荐网易课堂中的Ng的《机器学习》课程,以及七月视频和小象学院的课程(但是比较新的视频都挺贵的,如果有经济困难的朋友,可以在网上或者淘宝搜搜看),总之就是找到一部完整的讲解视频,从头开始看到尾,而且要反复看,别指望看一遍有什么收获,两三遍之后其义自见,会找到和老师的默契感。这个过程是很痛苦的,因为很无聊,像听天书似的,这个时候如果你放弃了,没有人能帮助你了,本人看视频不下三四遍,然后一边看一遍做笔记,截图,然后课下再看笔记,再理解。推荐印象笔记,在淘宝买一个账号,方便做笔记,电脑和平板同步,可以经常看看知识点,增加自己的理解。笔记这个东西还是很重要的,不要小看哦,我现在找工作面试,基本都是看之前的笔记,帮助很大。


3、要有一颗坚韧的心,别轻易放弃,看书,看视频,安装Anaconda软件,敲代码,跑一些简单点的数据,看看结果。这个过程需要反复。


4、本人从不玩游戏,更多的时间就是在看模型,理解,所以学这个方向,一定要多花时间,有些人的理解能力很强,但是大部分人的理解都需要时间,反复加强,反复学习。


5、鼓励自己,别轻易放弃。有人说,你学校不行,找算法相关的工作很难,没有985和211有优势,但是这个时候你也不要放弃,事在人为,因为我就是其中之一,我相信自己能行,所以在面对被人的嘲讽,我不在乎。这些人只是提醒你,形式比较严峻,不用多解释,你需要付出更多的时间和努力。加油,只要坚持学习,只要有梦想,只要相信自己,一切都会变得更好。如果有机会实习,和比赛还是要多参与,为自己的简历加分。


平时可以多看看别人写的博客,CSDN博客,博客园,以及推荐一些公众号如:算法和数学之美,算法爱好者,Python开发者,机器之心,AI科技大本营等等。


在学习的时候,不需要纠结语言,个人建议,平时跑模型的时候还是用Python比较好,方便,学习时间短,上手快。直接安装Anaconda软件,就能调用机器学习各个模型的算法。

2020-02-19 11:39:31 huashuixiuer 阅读数 19
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

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

号外!号外!
Dotcpp的单片机教程上线啦!
在这里插入图片描述
有的小伙伴可能对单片机有着比较模糊的定义,或对单片机的作用不太了解,那么,让我们首先简单介绍一下单片机

1、单片机了解

单片机是一块集成电路的控制芯片。单片机的用途包括智能仪器,工业控制,汽车电子,航空航天等领域。

2、单片机的就业与比赛

目前单片机在大部分电子通信专业的就业领域还是占有一席之地的,毕竟单片机功能强大,用途广泛,相关资料已经成熟,就业门栏相对于有基础实践经验的同学来说并不难。同样,单片机在比赛中所占有的地位也是举足轻重。

如今,更多的朋友们开始学习单片机,在这里向大家推荐一个学习网站:c语言网。这里面不仅仅有c语言,还有诸多意想不到的宝藏!在知识的天空中,尽情的翱翔!

网站名称:c语言网

单片机教程网址:单片机教程

除此之外,c语言网还有其他学习课程以供大家更好的学习,配套随堂练习,有助于大家全身心学习!

课程网址:dotcpp网课

让我们一起快乐的进行单片机的学习吧!

2020-03-10 08:45:50 byz666 阅读数 2414
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

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

1.三极管的应用——控制,驱动

*控制应用:通过单片机控制三极管的基极来简介控制后边小灯的亮灭。电路如图在这里插入图片描述

当IO口输出高电平时,b极和e极没有电压差,三极管没有导通,LED小灯不亮,当输入低电平时,馋了了足够的电压差,LED灯变亮。

  • 驱动应用:进行不同电压之间的转换控制。 电路如图在这里插入图片描述

这是NPN型三极管,与上面所谈到的IO口输入方式和结果刚好相反,即IO口输入高电平,三极管截止,OUT输出12V高电平,当IO口输入低电平时,三极管导通,OUT输出0V低电平。

2. 74H245驱动芯片的应用

事实上,当单片机的IO口输出高电平时,其输出的电流特别小,不足以点亮一个LED小灯,之所以能够点亮,是因为我们利用了三极管的放大作用。理论上,我们也可以直接用IO口低电平点亮LED小灯,但在实际操作中,低电平时产生的电流超出了单片机的承载范围,所以此方法是不可行的。

除了用三极管以外,其实还有一些驱动IC(例如74H245)可以作为单片机的缓冲器。

PS:74H245驱动只起到电流驱动缓冲的作用,不起到任何逻辑控制作用。

其功能图如下所示:在这里插入图片描述

*74H245是一个双向缓冲器,DIR引脚是方向引脚,接高电平时,右侧B编号的电压都与左侧A编号的电压相同;接低电平时,效果则相反(高电B随A,低电A随B)。

*OE时使能引脚,叫做输出使能,该引脚接低电平,就可以执行双向缓冲器的功能,接高电平时则不能实现。

3. 74HC138三八译码器

在设计单片机电路时,,单片机的IO口数量是有限的,有时满足不了设计需求,如我们学习所用的STC89C51单片机一共只有32个IO口。三八译码器就是用来解决IO口不足的问题的。

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

*顾名思义,三八译码器就是吧A口的三种输入状态转换成Y口的8种输出状态。

*E口的三个引脚也是使能引脚,只有E1,E2输出低电平,E3输入高电平时译码器才能正常工作,否则无论A口无论输入什么状态的电平,8个Y口总是高电平。

*对于A口的输入状态,从下表可以容易理解:在这里插入图片描述

,由于是自学,如有错误之处,期待读者斧正,如果有大佬能够指导一下单片机的学习方法,我将感激不尽,在评论区留下宝贵的意见,谢谢!*
最后,附一张LED小灯的整体电路图
在这里插入图片描述

单片机学习

阅读数 130

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