找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4028|回复: 3
收起左侧

初识单片机

[复制链接]
ID:107189 发表于 2016-3-3 18:56 | 显示全部楼层 |阅读模式
    笔者是在大一暑假接触的单片机,现今已是大三狗了。在这一年半的时间里,我用过stm32、学过FPGA,从40腿的控制器件到140多脚的处理器件,从几十行代码到上百上千行代码,也算是一种“步步高升”吧。然而对单片机的态度却是从崇拜到鄙视再到敬重的转换。也深深懂得了什么叫做“莫在浮沙筑高台”。
    记得起初,花了150多大洋买的单片机开发板,对单片机的顶列膜拜与对教科书的“万马奔腾”齐头并进。对了,现价竟是78,靠!想当初,自己是多么单纯——哇哦,这样灯就亮了、额滴神,这就是流水灯啊、我勒个去,竟然还能和电脑交流,真让人兴奋。那种感觉就好像刚恋爱那样,虽已存活二十余载仍就“孑然一身”,但觉得应该是这种感觉吧<(^-^)>。当然,让人苦恼的莫过于看不懂的教科书,那都是些什么鬼,一个又一个搞不清的名词,一段有一段不理解的句子,心中奔腾的马必然是草泥马。不过现在我明白了,人到达了一定的高度就会忽略当初的幼稚,然而如同《编码的奥妙》这样是个人都能看懂的书,也只有大师级的人才能够完成。
    记得去年暑假,在偶然的机会接触了stm32F4,个头虽比51小,但却有144条腿(当时并没有意识到这是贴片的)。而且还可以库开发,真是简直了,经过一个多月的学习,心中油然而生对51的鄙夷,那玩意简直是low爆了。随后又用到了FPGA,学会了用它来描述出自己想要的东西,哎呀,这才是我想要的嘛。对51 的鄙夷之情再次加深。我想我已经脱离低级转向高端,可摆脱菜鸟身份了吧。而然,这一切的一切只能说明
143753clky51sfu1ksyy1f.jpeg.thumb.jpg                               
    到了大三,学了数电,开了一个名叫《单片机原理及其应用技术》的课程,开始接触单片机的内部原理,ALU、ACC、PC、DPRT一系列名词铺面而来,JC、SUBB、INC、DEC一连串指令符迎头痛击,彻底击败了我那脆弱的自信心,只得对自己说一句
143725etcw6sdqn0s9sidl.jpg.thumb.jpg
    棍哥都说了海明威的“一个人可以被毁灭,但不能给打败”。我岂能落后,我相信只要思想不滑坡,方法总比困难多。于是萌生了搞懂单片机的念头,还提出了一个所谓的三步走战略,即用C语言会使单片机,用汇编理解单片机,用verliog掌握单片机。
     就我而言,初学时任何一个名词都可能成为一个很大的障碍,对单片机内部结构的了解更简直是噩梦。但是,对单片机的程序控制而言,程序的本质是寄存器之间的数据传递。用C语言我们可以学会用单片机,但对其内部结构不了解就难以掌握真正的掌握单片机。单片机不是凭空造出来的,用C语言,只是学习“单片机编程”。用汇编,才是学习“单片机”的正确姿势,写汇编其实就是帮你理清楚内在原理。当然了,如果只追求会用的话,的确不需要学汇编。然而学校开设单片机一课落脚于原理,在笔者看来懂其原理才能融会贯通,才能游刃于各种控制器件,才能不只是学了80C51单片机。可以说学单片机就是学微机原理,不懂微机原理即便再会写程序,也只是代码的搬运工。
     Verilog是可编程逻辑语言,它的魅力就在于描绘出自己想要的逻辑器件,若是用它来造个单片机,虽然没有什么实用价值,但对我们掌握单片机可以说是绝妙之笔。
    故此,为了自己不再是菜鸟,为了不做代码的搬运工,写下层层深入单片机的系列笔记。
143433n9agofsfftfie1gr.jpg.thumb.jpg


  何为单片机?网上有云:“单片机是在一片硅片上集成了CPU、存储器(RAM、ROM、EPROM)和各种I/O接口(定时器、计数器、并行I/O口等)具有一台计算机功能的设备,又称单板机、单片微型计算机、微控制器、嵌入式控制器”。我觉得这句话说得很好,不过在这里我更想说.


        所以,先说一下单片机并记住一句话,单片机的引脚可以接收或发出高低电平。人家的原则貌似是“不求规模大,力求小而全”。n(*≧▽≦*)n
   150402kjasmj0tpazyz0g6.png.thumb.jpg
        上图是51单片机实物图,右图是引脚图,引脚什么鬼?引脚,又叫管脚,英文叫Pin。就是从集成电路(芯片)内部电路引出与外围电路的接线。即左图白色的短小矩形,我们先要用意念控制住自己,不要想这黑块内部是什么,只需要知道这些引脚可以接收或发出高低电平,接收的电平或可影响着输出,输出的也可左右着输入,如要里二者的相互影响的奥秘,就是知道这个黑块的原理。对于刚接触单片机的在下来说,还是简单的认识一下能看得见的东西吧。
       引脚。20接负极,40接正极,这家伙是供电, 5V电压最好。P1、P2口共16个,它们是一样的,都是输出或接收所谓的高低电平。P3脚比较勤劳,不仅有与P1、P2相同的功能,而且还兼职,也就是第二功能,这个先不说。P0口则有些先天不足,需要给它提供驱动力,才能与P1口一样,这个驱动力叫做上拉电阻。当然,这样的设计,是有人家的目的的,具体为什么,也先不说了吧。我们现在主要用的就是这些P口。
学习C语言Java什么的,第一件事是说“hello world”,那么,学习单片机首先要亮一个灯,我们初中就知道怎么亮了,拿一两块电池,把灯的一头接在负极,一头接在正极,他就亮了。就像这样
150447xbg858r88lpl82kg.png.thumb.jpg


       现在我们要用单片机来点亮一个灯,先说这个灯,我们管它叫led,即是发光二极管(我记得当初并不知道led就是发光二极管(⊙﹏⊙))。
       二极管想必都知道,具有单项导通性,如下图
150517pp6txvpv0gmkb0tg.png.thumb.jpg
        A接正极,B接负极,它是导通的,如果反过来就不管用了,当然,你可以暴力的击穿它,让它与世长辞。那么发光二极管呢?顾名思义,当A接正极,B接负极时,导通灯亮,反之不会亮。而在这里,我们又有了新的词汇来形容正极和负极。这就是高电平和低电平。物理解释中,正极指电源中电位(电势)较高的一端,负极与之相对。高电平对应正极,负极与低电平相对应。我们说的“水平”,词典中解释与水平面平行、或在某方面达到一定高度,引申指事物在同等条件下的比较结论。
150535k59yoikvy5eijoxk.png.thumb.jpg
       看这幅图,水从高的地势下泄,水从高水平面向低水平面溜达。现在再想想高电平和低电平也就了然了,电荷从高电平溜达到低电平,就是从正极流窜到负极。就是这个道理。在数字系统中,我们用1来表示表示高电平,用0来表示低电平,为什么呢?用0表示高电平当然也可以,不过,0比1大有没有觉得很别扭,接下来就说说发光二极管,看下图
150559h5rppdkt3epddxvk.png.thumb.jpg
        A高电平,B低电平就亮了。那么这和单片机有什么关系呢?还记得开头怎么说没?单片机的引脚可以接收或发出高低电平。所以,当把A接的高电平用单片机来提供,B接到负极,灯就亮了,若将A外接高电平,B接单片机发出的低电平,灯也亮了。其实这俩种接法又称共阳、共阴,这以后再谈。那么如何让单片机发出高低电平呢?这就需要软件来实现。我用的是在keil3,软件如何应用,就不赘述了~( ̄0 ̄)/。
       我觉得不得不说一句,任何不看电路图所写的程序都是瞎扯淡,所以这里假设led连接在P1.1角上。
#include
要想知道这个头文件干什么很简单,选中头文件,右键,选中open  document #include就可以看到一些内容。
150641kede02zsuu2ljesj.png.thumb.jpg
        document 是文件的意思。include是包含,reg52.h是针对51/52单片机定义的头文件,主要包括寄存器定义。所以也就大概理解了这个头文件的意思了。SFR = special funtion register //特殊功能寄存器。举例来说,如果你写P0=0x01烧写软件会给0x80这个地址赋0x01,就是这样,打起来了C语言与单片机的桥梁。如果学了汇编,相信会对这些内容很熟悉的。如果不太清楚我想也不必要纠结,写程序的时候写上这些也就可以了,以后会懂得。要知道,程序的本质是寄存器之间的数据传递。
#include
sbit led = P1^1;// 定义特殊功能寄存器的位变量。在函数中不允许对P0~P3                                                                        //口进行为位操作的,故使用前要先进行位定义。
main()
{
        while(1)
        {
                led=1;                              
        }
}
         150736l2zsaqu9n7i277y8.png.thumb.jpg
    那为什么写while(1)嘞?main是主程序, while(1)是无线循环的意思。学过C语言的知道,让led=1;一直保持下去。为什么非要加while(1)来保持下去呢?引脚输出1他不就亮了么?确实是这样,可是我们先要清楚一点,单片机是顺序执行,led=1;不是它的最后一句,如果不加while(1),led=1确实是最后一句啊,是的,对于C语言是这样,但汇编不是这样,对于单片机。并不是传递了led=1就停止工作了,这需要我们探索内部结构才能知晓,现在知道这样一个概念吧。再补充一句,忘了加限流电阻了 。/(ㄒoㄒ)/~~
一节流水犹未尽,下节接着说废话,学识浅薄出拙文,如察错误望赐教,小弟在此感涕零。

回复

使用道具 举报

ID:92052 发表于 2016-3-4 06:36 | 显示全部楼层
好文,用自己的理解来普及单片机。
回复

使用道具 举报

ID:102389 发表于 2016-3-4 09:17 | 显示全部楼层
往事回首   
回复

使用道具 举报

ID:69776 发表于 2016-3-9 22:50 来自触屏版 | 显示全部楼层
期待下节,感觉自己好渺小!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表