学习,心境很重要

2020-02-08 09:09发布

本帖最后由 zlc 于 2012-3-30 23:28 编辑

当你掌握了如何用单片机完成一个项目,你也就学会了如何使用单片机。不知道这样理解对不对,我是个新,目前还不会使用单片机。做为一个维修电工,不会用单片机总觉得少了点什么,但也不迫切,学习单片机应该是兴趣使然。

在网上看过不少新手或是为怎么学习单片机而困惑,或是为学习什么单片机而困惑,还有为学不学而困惑的。我原来也很困惑,但现在不了,想要看清庐山真面目,就要站在比庐山还要高的高度。学习单片机也是一样吧,不管出于什么目的(有爱好单片机、有必须用单片机、有以此为筹码多赚点钱的,还有认定此路必是光明大道的),单片机总是要揉进项目里去的,哪怕是只点亮一只LED。从项目的角度去看单片机,去学习单片机,也许不会觉得困惑和迷茫。每一个项目都应该可以是这样的,对需求进行提取、抽象为功能,运用各种手段实现功能,最后升华为满足需求,至此一个项目完成。学习单片机也是一样,在学习单片机之前先完成这样一个项目:
1、        我为什么要学习单片机?
2、        我要学习什么单片机?
3、        我要怎么要学习单片机?

1、        我为什么要学习单片机?俗话说,技多不压身。多一技能总不是坏事,多学学没有坏事,学吧!
2、        我要学什么单片机?其实学什么单片机都是一样的,51说简单也不简单,那ARM就难吗?虽然我没学,但我不认为它有多难。一切从应用出发,需要什么样的单片机就用什么样的单片机,就学什么样的单片。如果没有基础还是有些束缚的,还是要从8位机出发的。比如51、AVR、PIC都可以。我就是没有基础,所以选择PIC,选择PIC不是偶然。如果就单一芯片,我觉得51比PIC应用要多,AVR同理,PIC没有优势,但PIC族群庞大(不知道我说的是不是那么回事)。再说硬件稳定性和参数的一致性,我觉得PIC就有优势了(这里我并不想提抗干扰,那与个人水平密切相关)。这里的选择与芯片本身的架构、指令、难易成度无关,完全从需求出发(如果没有基础还是一步步来的)。以上基于我个人的片面了解,拍砖可以,别打脸。
3、        我要怎么学单片机?其实这是最重要的(有人经常问我:“在学校里你都学到了什么啊”,我会告诉他:“学习方法”)。其实曾经学过什么,学到了什么并不重要,重要的是你要知道如何学习你需要的,这就是所谓的学习方法。这一点在单片机这一行业,或者嵌入式系统,再者软件行业,无不如此。CPU:4位、8位、16位、32位、64位,谁知道会不会再出来个128位。单片机:51、PIC、AVR、ARM7、ARM9、ARM11,现在有M0。软件:原来有B语言,后来有C语言,再后来C++、C#、JAVA、delphi、.NET等等。那么,你觉得我们学得过来吗,无论学多少,都会有新的东西出来,那么你还要学习什么,还要学习多久?我的这段话你是否会明白些什么?这也许和学习单片机没什么联系,但这很重要。从小学到大学,再到生活、工作,我都在学习中,通过不段的学习我们了解知识,了解生活,了解工作,同时也在认识自我,但在学习的过程中,你有没有发现一些东西,像软件的架构,也像欧姆定律(其实并不是“欧姆”,而是“定律”),像习惯成自然,也有点像“潜规则”。那么在学习的过程中,你有没有发现你的“软件架构”呢?这就是所谓的学习方法。如果你掌握了学习方法,无论在哪个角落你都会是一个亮点。说了这么多,还是要回到单片机上来,学习单片机也是一样,要确定学习方法,也许这比学习的过程要纠结,但这是事半功倍的事,没理由不去办(当然有好的学习方法,你不去学,也是没有用的。)

说到这里,我想我可以明确我的单片机学习方法了,就是把单片机揉到项目里去(还是那句话:哪怕是只点亮一个LED)。就拿点亮一个LED为例吧:
分析需求:使一个LED点亮。
抽象功能:用一个MCU控制一只LED点亮,上电即点亮。
功能实现(硬件):电源(要有电才行),MCU最小系统(这是MCU工作的基础,不了解就查资料吧),一个LED并且连接到MCU(查LED的工作参数并匹配外围器件)。
功能实现(软件):确定实现语言,选择软件开发环境,用编程语言抽象功能。(我想学习单片机软件占的比例大些,以后慢慢分析吧,必竟我还不会编程)
升华到满足需求。
{
明天继续学
}

不知道我理解的对不对,没自信啊!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
27条回答
zlc
2020-02-08 13:06
本帖最后由 zlc 于 2012-3-30 23:42 编辑

/*************************************************************************
第一个PIC项目:走马灯"教材例程"
编辑编译环境:MPLABv8.84+PICC9.83
仿真环境:ISIS7.7SP2
主要学习目的:1,熟悉C语言编程
             2,熟悉开发环境
             3,熟悉PIC端口的设置
**************************************************************************/
#include<pic.h>
#include"myfuncs.h"                    //自己编写的头文件,里面声明了DelayMs(ms)
__CONFIG(FOSC_XT&WDTE_OFF&LVP_OFF);    //调试配置,开发环境的版本不同,此配置也不同
main()                              
{       
        char iData=0;                      //显示数据初始化
        TRISD=0;                           //设置D口为输出
        while(1)                           //这是一个死循环
        {
                int i=0;
                iData=1;                       //显示初值
                for(i=0; i<8; i++)             //8个二极管的循环,每循环一次,刷新一次数据.
                {
                    PORTD=iData;               //输出显示数据到D口
                    DelayMs(200);              //延时函数
                    iData=iData<<1;            //输出数据的计算,根据显示要求来确定算法.
                    PORTD=0;                   //关闭输出
                    DelayMs(200);              //延时函数
                }
        }
}

自己的解析:

第一句:#include <pic.h>
解析:#include在C语言中称为文件包含命令(预处理命令)(以#开头的,都称为预处理命令),     其格式为    #include <文件名>  或  #include"文件名"。两种格式的区别:尖括号会告诉编译器这个文件在编译器安装目录的include文件夹里,而双引号则会告诉编译器这个文件可能在源文件目录中,如果没有那就去编译器的include吧(当然有的编译器不会这样)。对于pic.h,我只知道PIC的每个寄存器都这里面有定义,想要用C语言对PIC编程,那就必须得有它。文件包含命令还有更深层次的应用,但我没有深究。

第二句:#include"myfuncs.h"
解析:myfuncs.h是我自己编写的一个头文件,其实工程项目里还包含了一个myfuncs.c。myfuncs.h和myfuncs.c构成了一个模块,这也就是模块化编程的一个最小例程吧。这里涉及到头文件的编写与源码文件的编写(这里指模块的源码文件),关于头文件的编写与源文件的编写不在这里深入,涉及到条件编译,涉及到函数的声明和定义,涉及到宏定义。

注:预处理命令语句后面是不可以有“;”的。

第三句:__CONFIG(FOSC_XT&WDTE_OFF&LVP_OFF);
解析:这是PIC的配置字。__CONFIG前面是两个“_”,__CONFIG()是HT-PICC专有的语句,用来定义PIC单片机的配置字的内容。FOSC_XT用来设定晶振频率。WDTE_OFF用来关闭看门狗定时器。LVP_OFF应该是关闭低压编程功能吧。

第四句:main()
             {
             }
解析:上面的放在一起说,因为这是一个整体,所有的C语言都必须有而且只能有一个main()。

第五句:char iData=0;
解析:变量的定义与赋值。char 定义一个字符型数据,iData为变量名,iData=0定义变量同时赋值是个好习惯(书上这么说的)

第六句:TRISD=0;
解析:TRISD是PIC16f877a的端口方向控制寄存器,1为输入,0为输出。不做深入理解(自己看看PIC通用端口的设置与使用,其实很简单)

第七句:while(1)
            {
            }
解析:这是个死循环,在我的理解,是不是每一个单片机程序都可以看做是一个死循环,这里着重理解while(),用while构成的循环语句形式:
while(表达式)
{
    语句1;
   语句2;
}
当表达式的值为真(非0)时循环,否则退出循环。

第八句:int i=0;
解析:同第5句。

(明天接着学)





补充内容 (2012-3-31 21:46):


补充内容 (2012-3-31 21:50):
晕,刚分析完全部语句,然后告诉我超时,唉,那就再写了!以后要word里写完再copy过来吧,还安全点。

补充内容 (2012-3-31 21:51):
晕,刚分析完全部语句,然后告诉我超时,唉,那就不再写了!以后要word里写完再copy过来吧,还安全点。

补充内容 (2012-3-31 21:51):
没办法,只能补充,不能编辑

一周热门 更多>