|
首先吹一句,就一句哈:我这套教法,与现有的所有的教材的思路都大不一样。 数码管是什么?就是可以用来显示数字的一种电子设备或叫做零部件或叫做电子元器件。下面的图,就是一种典型的数码管的结构图,这种叫七段数码管,分别用abcdefg这七个字母标注这七个段条,每段的位置安装有一个灯,如果是LED数码管,那每段就安装了一个LED灯,每一个灯都是可以单独点亮的,如果要控制它显示数字,比如说显示1,那点亮bc这两段就行了,如果全部点亮,那就是个8字,如果全部不亮,那个,也有可能坏了。 说明一下,这个结构图上还有个dp,它是一个点,可以作为显示小数点来用。至于两个com,那是这八个LED的公共端,就是说这八个LED的接地端都在这个器件的内部连在了这两个管脚上,这种类型的数码管也就是教材说的共阴极数码管。 知道了怎么让这个数码管显示不同的数字,那接下来我们就思考如何手工控制它来显示数字。电路原理图很简单,它上面有两个脚标注的是com,把这两个com脚接电源地就行了;abcdefgc以及dp这八个脚先各自接一个限流电阻,再各自接一个开关,再一起接到电源正极,电路图就算画完成了。接下来就是按电路图搭建好电路,什么?你说你不会?这个没关系,网上一大堆教程,照着做就是了,简单点的方法,就是在面包板上搭建,材料都很普通,至于开关,建议用DIP拨码开关,就是那种可以插在面包板上的成排的开关,你用8位的就行了。如果你对这些名词所表达的东西不明白,直接在小宝上搜。 电路搭建完成,手工控制数码管就大功告成,你可以随心所欲地让这个东西显示你所想要显示的数字了。 不过呢,我想大家感兴趣的不是什么手工控制,而是如何用单片机来控制,而且是随心所欲地。 简单,下面就来实现我们的这个愿望。 思路其实很简单,就是用单片机来代替上面电路中的八个开关就行了。 这里我们先简单说一句最简单的电路原理:LED灯之所以亮,开关的作用,就是在LED的正极上加上正电源,LED的正极有了正电位、负极有了零电位,它就亮了;如果LED的负极是零电位,正极也是零电位,它自然就不亮了。为什么我在这里要说这个谁都懂得的原理?因为是要引出0和1的概念。我们在这里指出个现有的规则:将电路中任意点的高电位状态标记为1,零电位状态标记为0,这个规则,是我们学习单片机的基础规则之一。 在这里说一件很重要的事,从物理学上来说,数字电路包括计算机,根本不认识什么0和1,它只有电位的概念,目前我们所用到的数字电路,只用到了电位的两种状态,即高电位和低电位。这个思路很重要,特别是搞芯片设计尤其是想抛开现有而另开新路的人,它关系到你对数字电路的基本原理的正确理解,但是,对于做程序设计的人来说,你得接受计算机只认识0和1这个理念,这样才利于编程,所以,在后面,我也会采用这种理念,将它们说成数值。关于这一点,有兴趣时我再详细解说。 好了,我们回归正题,先拿一个我们要用到的单片机的管脚图来,下面是STC89C52单片机某一型的管脚图,我们可以看到它共有40个管脚,其中的32个管脚,它们的标注都是以P开头的,这些P管脚的功能之一,就是单片机自己可以自由控制其为高电位或零电位,有了这个功能,我们就可以用它来给LED的正极授以高电位或零电位以达到控制其亮灭的目的,如果我们用上它的七个管脚,这样不就可以控制数码管的显示了么?如果用上八个管脚,那就连小数点一并也控制了。 接下来就做四件事,就可以达成我们随心控制数码管的大愿望:画电路图,搭建电路,在电脑上写程序,将写好的程序复制也就是下载到单片机中。 前图所展示的单片机共有32个可以用于输出的管脚,这32个管脚被设计成了4个组,每组由8个管脚组成,这4组端口分别标记为P0、P1、P2、P3组。在以下的实验电路设计上,我们用到单片机的P2组,当然,你也可以用其它几组中的任意一组。连接顺序是单片机的P2.0~P2.6管脚一一对应数码管的a~g脚;P2.7可以不接,也可以接dp以显示小数点。电路图如算了,这个电路图太简单,就不如下了,反正网上也找得到。 搭建好的电路实物图:略。 下面就是写程序了,咱们不用现有的教材上的什么keil不keil的方法去写程序,因为这个对初学者来说用起还是有些麻烦,有这个时间,咱们早都完成这个实验了,咱们简单点,咱们就用STC的程序下载软件,这个先在网上下载老妖的STC-ISP软件,官网,得到一个开头为stc-isp的压缩包,解压,得到一个开头为stc-isp的或开头为AiCube-isp的应用程序,这个程序根本不用安装,也没任何限制,不用你充话费不用你当会员去贡献点什么,你直接点击打开就是了,部分界面如下: 说一下哈,如果你着急看到结果,下面有几段你可以暂时不看,而是直接跳到后面的开始写程序部分。 我们编写程序的思路依据的就是单片机运行的机制,比如我们要显示7,就要置abc脚为高电位,对应的单片机的P2.0、P2.1、P2.2要由单片机控制为高电位,用0和1来标记,就是这三个管脚均为1,而其它管脚均为0,从高到低连起来写,就是00000111,这里再说一个规则,就是连写这一组管脚的电位标注时,规定Px.0为最末位,其它的管脚则顺序往高位排。 编程前,我们先要理清程序执行的流程,也就是,这个单片机在设计上,它自身有什么功能可以将P2端口的电位控制成我们想要的结果。 我们先不管这个芯片的设计是怎么样的,我们先思考如果是你自己,你会怎么来设计这个芯片以实现这个功能。 有一种方法,我们可以把这个00000111当成货物,而P2口呢,当成仓库,我们要做的事,就是把这个货物,送到名称叫做P2的仓库里去,而你,作为老板,就是跟员工下达一个指令,指令的内容必须很明晰以免员工不知所措:指令的第一个内容,是明确指出是送货;第二个内容,明确告诉他这个要送的货现在在哪,也就是源地址;第三个内容,明确告诉他货物的目的地地址。如果你将这些写在纸上,那在我们的工作中,叫做写计划书,而为单片机而写在电脑上,叫做编程。 以上只是我们自己考虑到的一种方法,那单片机是不是也是这种工作机制呢?幸好,设计这个单片机的人还是个正常人,他跟我们想得差不多一样。接下来的事就简单了,就按照这个思路来编程,写出这条指令的全部内容:01110101 10100000 00000111。 第一个数01110101是什么意思?不管你知道不知道,反正单片机是知道的,就是老板给他下了道命令,叫他去送货。货送到哪?那就是01110101包含的第二层指令内容:紧跟着的第二个数,就是货物的目的地的地址;01110101还包含着第三层指令内容:紧跟着的第三个数,就是货物本身,可以这样理解,老板在下达命令时,他是当面把货物交给员工的,也即货物就在你眼皮子底下,这类数据传送指令,教材中称为立即寻址,这个数,叫做立即数。这三层意思,固定用01110101这一个数来表达,如果改变了这个数。比如给改成了10000101,那他的指令的第三层内容,就变成了源地址,也即这类送货方式中,货物并不在眼前,而是在一个仓库中,这第三个数就是货物所在的仓库地址,10000101这个数还指明了这个仓库是距离最近的那类仓库。 我们在这里为什么要写成01110101 10100000 00000111?前面我们说了,单片机只认识0和1,所以这个指令的表现形式也就是0和1的组合。 开始写程序,编程软件用的就是上面说的STC-ISP程序,编程窗口在箭头1所指程序文件窗口里,这里该说明了,在这个窗口中,是没办法输入只有0和1这类数据的,这个软件就是这样设计的,我们只能望着叹气。只有0和1的数据叫二进制数,而这个编程窗口中,输入的只能是十六进制数,所以,我们必须将这三个二进制数转换成十六进制数,你理解不理解二进制十六进制这个概念现在没关系,反正这个有现成的转换工具,不用你去计算,转换的结果是75 A0 07,我们将这三个数顺序填写进去就行了。当然,为了防止程序跑飞,后面再附加两个数:80 FE,当然,这个你可以加,也可以试着不加,你自己观察结果。 这样编程就完成了,是不是特简单?更简单的是,接下来连好电脑,你再点一下左下方的“下载编程”方框,OK,7出来了。 为什么要点按“下载编程”?你在电脑上写完了程序,你得交给单片机啊,就象你的计划书,得交给你的员工一样,你交给他,他才能照着这个计划书去一步一步地执行啊。这个下载编程的作用,就是将写好的程序交给单片机,其实质就是复制到单片机中,专业称呼叫下载,以前叫烧写烧录之类的。这个程序写进去的时候,并不是十六进制数,还是前面说的那句话,它只认识0和1,所以,依然是二进制数。还有,这个程序写进单片机之后,单片机自身是不能改变其中的任何内容的,这个存放的地方也是专门设计的,教材上称为程序存储器的就是它。 这里补充说明程序文件窗口中输入程序的方法:如果窗口中是一片空白而看不到输入的位置,没关系,点一下这个空白窗口的任意位置,窗口的最上面一行会出现一个闪烁黑方块,黑方块左边有0000h字样,这个0000h表示的就是程序存储器的第一个地址,也就是说,我们这里写入的程序中,75这个十六进制数在复制进入单片机的程序存储器之后,它将存储在地址为0000h的程序存储器单元中。然后你就可以直接开始输入了;如果窗口中有内容,那请点按窗口下箭头3所指“清空区域”按钮,窗口里就什么都没有了,然后如同上面所说的一样用鼠标点击空白处,就能看到有光标闪烁,然后开始输入数据。 如果想改变数码显示的内容,你直接修改第三位也就是现在的07那个位置的数值就行,如果你搞不清楚该是什么值,你随心改也没人干涉你,至于数码管显示的是什么,管它呢,试一试也没什么关系,说不定,你会发现它还能显示AbCdEF之类的。 STC-ISP是有使用说明的,这里须重点注意几点:一是左上角的芯片型号栏显示的型号要与你所使用的芯片一致,先用“下载编程”按钮下方的“检测选项”按钮检查一下,软件会自行检测出芯片型号,如果检测不出则可以手动选择,实测这个89C52好象是不能自动检测出来的,那就得手动选择了,它在STC89C52RC系列下,选STC98C52RC/LE52RC,然后再按“检测选项”按钮检查一下看对不对;二是紧随其下的扫描串口中显示的串口号要正确,也是可以手动选择的。 STC89C52芯片的程序下载工作,是需要专门的硬件设备的,有现成的,给外星人的小店施舍几块钱,他会告诉你这个是什么东西,然后过几天送一个给你。这个小东西可能是要驱动程序的,在下载软件顶部菜单栏有一栏显示的是“USB驱动安装”,点击它然后按照提示进行安装就行了,安装前先插上这个下载器,安装可能有点慢,一个字,等,等到“扫描串口”按钮右侧出现内容即完成安装。检查是否安装正确且连接的是你的那个下载器的方法有几种,咱们粗暴点,直接拔掉这个小东西,如果“扫描串口”右边里的内容变化了或成了空白,蛮好,这个就对了。如果你的电脑上只有这么一个串口设备,你再插上这个小东西,那“扫描串口”右边的窗口内就会自动出现你的设备的串口号。 数码管有现成的,个人建议喜欢自己动手的自己搭一个,这样可以更清楚电路原理,掌控感满满。LED用方型的比较合适。 随心控制数码管的学习到此就算差不多了。学习这个内容,其主要目的,就是学习掌握单片机的输出功能。 单片机的核心功能,其实就两条,一条是控制其端口的电位的高低,以此向连接它的设备传递数据;二条是它也可以将端口电位高低的控制权交给外面的设备,以此获得连接到它的设备传递给它的数据。单片机所设计的其它所有的功能,可以说,都是围绕着这个核心功能来的,所以说,你只要掌握了这两样核心功能,你就是两只脚踏进了单片机的大门。 下面我们来实践一下用外部设备来控制端口的电位,然后单片机读取这个电位值并传送到另一个地方:P1的八个端口分别用一个电阻连接到电源正极,再用一只八位拨码开关串上电阻后一端连接P1的八个端口,拨码开关的另一端全部连接到地,P2改为串限流电阻后直接接八个LED,然后你自己设置这个八位开关为任意开关状态,比如用数值表达的11001001状态,然后让单片机将P1的状态送入P2,然后你再观察P2口八个LED的状态是不是也是11001001,然后你再改变拨码开关的状态,再试再观察。这里需要提醒一下,改变拨码开关的状态之后,是不用重新下载程序的,只需重启单片机就行了,重启的方法,我文化程度不高,就简单粗暴吧,断电后重新上电。 这个将P1口状态送入P2口,用到的机器命令的表达值是10000101,转换成十六进制是85,这个在前面已经说过了;P1口的地址的表达值是10010000,转换成十六进制是90。所以,程序就是85 90 A0 80 FE。这条机器码指令的格式比较奇怪,它是数据源地址值紧跟在命令值之后,之后才是目的地址,而这条指令对应的汇编指令,却依然是命令助记符之后顺序跟着目的地址、源地址。 这个实验,其实是我们学习单片机中最重要最基础的实验之一,实验的主要目的,就是了解单片机的输入接收功能,我们在单片机学习中,很大一部分学习的内容叫做通讯,也就是单片机的数据输入输出,其实际操作的,就是对端口的电位高低的控制(发送)与接收(读取),可知这个实验的重要性。 以上我们学习的是用机器码来编程,这种编程方式是最原始的,虽然它才是单片机工作的本来面目,但是它在实践应用中有一个很大的麻烦,入门容易掌控太难,所以入门学习时了解一下就够了,但这个学习是非常有必要的,通过这个学习,我们就可以了解到单片机的工作机制和编程规则,为接下来我们学习汇编和C打下理论基础。另外,如果你对单片机芯片级的设计感兴趣,这个学习可以给你打一点基础。我这个教法,不是让你亦步亦趋地跟我学,而是要打通你的自学能力的任督二脉,让你直接去了解单片机的工作机制和语言规则,了解了之后,你会对编制任何一个项目都有清晰的思路,剩下的,就是查资料,查器件资料,查编程语言有哪些功能语句以及它们的使用规则,查编程技巧和注意事项,等等。你比如控制数码管的例子,我们的目的就是将一个让数码管显示数字的值送到P2端口,这里面首先要查的是用什么样的命令,你可以查51单片机的机器指令表,它分了类的,显然,这是一个数据传送类指令,我们就在这一类里面查,然后我们就查到了一条最适合用在这里的指令:立即数传送指令;然后我们就查这条指令的使用规则:目的地址紧随其后,再跟着这个要传送的立即数;再查P2的地址,这个在芯片手册中查,当然,51机是统一的,现有教材中也都给出了这张表,叫做特殊功能寄存器表,里面给出的P0的地址是80H,P1是90H,P2是A0H,P3是B0H,完工。 如果你对芯片设计感兴趣,通过这些知识的学习,再学习一下逻辑电路,你甚至可以自行设计简单的单片机电路,比如说,用现有的逻辑集成电路,来搭建一个十以内的加法计算器,很容易的。如果你的电子电路水平比较象样,用分立元器件也不是不可以。 接下来我们可以进入汇编或C的学习了,个人建议先学一下汇编,熟悉了解后再正式进入C。 哦对了,总有一些人说什么汇编很难,真是奇怪的言论,对于理工科的人来说,真没什么不好懂的,入门非常容易,它只是难在复杂应用上的掌控,但是,我们只是达到熟悉了解的目的就行了,你学它,花不了几个时间,但对你打好学C用C的基础,效费比太高了。关于这个看法和解释,我已在前面的帖子中说过了。 在这个实验中,我们选用的单片机的型号是89C52,为什么要用这个型号,因为这个型号的是老款的,它不用配置端口的功能,入门时学起来简单多了。如果你用的是STC的15系列或8系列或32系列,那你还得先写几条端口配置语句,对于初学者来说这个学法就不太友好,至于什么STM的,那更是麻烦加茫然,三把两把,兴趣就给折腾得没了。当然这个型号也可以选用STC12系列的,它也不用配置端口,而且还可以省了晶振。用89系列的话,还得要配一个晶振及两片陶瓷电容,这个一定不能忘,否则单片机是不会工作的,至于晶振的频率参数,对于初学者来说,用不着多的,一个11.0592就够你用了,以后升级到高系列,也用不到晶振这个东西。还有90与89是一个系列的。从这个系列入门之后,肯定是要进到更高系列的,毕竟这个系列太古老,功能太少,速度也慢,特别是价格方面的意思,你可以自己去了解。 在实验中,如果你是用面包板来搭建电路,那要注意单片机的外观选型,要选用双列直插式、管脚间距2.54mm的,至于管脚数,满足你的试验需求就行,我们这里用的是40个管脚的,它叫双列直插式。你以后的实验,都要注意器件的管脚的间距,因为面包板的孔距就是2.54mm。 如果你不想用拨码开关,也可以简单点,就用跳线来代替。
|