C51单片机步步学笔记.docx
《C51单片机步步学笔记.docx》由会员分享,可在线阅读,更多相关《C51单片机步步学笔记.docx(31页珍藏版)》请在冰豆网上搜索。
C51单片机步步学笔记
C51单片机步步学笔记(最新更新)
作为一个初学者,如何单片机入门?
我需要那些知识和设备?
知识上,其实不需要多少东西,会简单的C语言,知道51单片机的基本结构就可以了。
一般的大学毕业生都可以了,自学过这2门课程的高中生也够条件。
设备上,一般是建议购买一个仿真器,这样才可以进行实际的,全面的学习。
日后在工作上,仿真器也大有用处
还有,一般光有仿真器是不行,还得有一个实际的电路,即学习板。
学习板一般价格都比较贵,而且许多学习板配套程序和讲解不够完善。
这里介绍的是最简单的学习板,4个按键加4个LED发光管,一个蜂鸣器,一个24c02即可。
通过30个教程,初学者可以学到:
单片机控制外部设备,读取外部设备状态,外部中断的应用,中断的深入理解,变量和标记的灵活应用,定时器的灵活应用,可编程自动控制的方法,按键控制设备动作的方法,PWM输出的设计,存储器的读写,延时报警器的设计,各种报警音的设计,音乐播放的设计,程序模块化的设计等等知识。
虽然,这些知识的覆盖面有限,但是,当你学习并掌握了这30个试验之后,您就会豁然开朗,单片机的编程控制如此简单!
学习完后,您就已经完全地入门了,并可以自主地对其它的单片机知识进行学习、试验,甚至进行项目开发!
第一课 了解单片机及单片机的控制原理,控制一个LED灯的亮和灭
本章学习内容:
单片机基本原理,如何仿真器,如何编程点亮和灭掉一个LED灯,如何进入KEILC51uV调试环境,如何使用单步,断点,全速,停止的调试方法
单片机现在是越来越普及了,学习单片机的热潮也一阵阵赶来,许多人因为工作需要或者个人兴趣需要学习单片机。
可以说,掌握了单片机开发,就多了一个饭碗。
51单片机已经有30多年的历史了,在中国,高校的单片机课程大多数都是51,而51经过这么多年的发展,也增长了许多的系列,功能上有了许多改进,也扩展出了不少分支。
而国内书店的单片机专架上,也大多数都是51系列。
可以预见,51单片机在市场上只会越来越多,功能只会越来越丰富,在可以预见的数十年内是不可能会消失的。
下面以51为例来了解一下单片机是什么东西,控制原理又是什么?
在数字电路中,电压信号只有两种情况,高电平和低电平,用数字来记录就是1和0。
单片机内部的CPU,寄存器,总线等等结构都是通过1和0两种信号来运作的,数据也是以1或者0来保存的。
单片机的输入输出管脚,也就是IO口,也是只输出或识别1和0两种信号,也就是高电平和低电平。
当单片机输出一个或一组电平信号到IO口后,外部的设备就可以读到这些信号,并进行相应操作,这就是单片机对外部的控制。
当外部一个或一组电平信号送到单片机的IO口时,单片机也可以读到这些信号,并进行分析操作,这就是单片机对外部设备信号的读取。
当然实际的操作中,这些信号可能十分复杂,必须严格地按照规定的时间顺序(时序)输入输出。
每种设备也都规定了自己的时序,只要都严格遵守,就可以控制任何设备,做出只要你想象得出的任何事情。
您可能会再问,我如何让单片机去控制和分析外部设备呢?
答案是程序,您可以编写相关的程序,并且把他们烧写到单片机内部的程序空间,单片机在上电时,就会一步一步按照您写的程序去执行指令,做您想做的事情。
在51标准芯片中,有32个输入输出IO,分为4组,每组8个,分别为P0口,P1口,P2口,P3口。
P1口的8条脚就用P1.0至P1.7表示,其余类似。
51就是用这32个口来完成所有外部操作的。
对于51的内部结构,如果您已经了解,那是最好;如果不懂,也可以先放下,在完成了本教程开始的几个章节之后,您就会大有兴趣,自己去寻找资料阅读了。
当然,如果您希望成为一个优秀的单片机开发程序员,还是必须熟悉单片机的内部结构及工作原理,切不可偷懒!
在这一章,您将用程序去控制一个LED发光管的亮和灭。
你应该知道,LED发光管在通过一定电流时亮,不通电就灭。
为了不让LED通过太大的电流把它烧坏,我们还要串上限流电阻。
51的IO是弱上拉的方式,在输出高电平时,只能输出几十微安的电流到地,而在输出低电平时,VCC电源可以输入几十毫安的电流到IO。
一般LED需要10毫安左右电流点亮,我们就将LED接在电源VCC和IO口之间,中间串上电阻,当IO输出低电平时,灯就亮了,反之,灯就灭了。
我们在这个程序里要控制的是P1.0。
请参考一下我们将要使用的试验板的电路图。
在实际的单片机学习和开发中,你可以用仿真器模拟一个CPU芯片,让它按照您编写的程序工作,并且进行调试,一步步排除程序的bug,使程序正常工作。
程序工作正常后,您就可以用烧写器将您编写的程序烧入购买来的单片机芯片中,让它自己去运行了。
要使用仿真器,还得有一个编译调试的环境,这个环境是在计算机上运行的,我们就在计算机上编写和调试程序,计算机和仿真器有连接,仿真器中的各种数据和程序,都可以从计算机上观察到,并可以观察变量,写入变量的值,单步调试程序,在程序中设置断点调试,全速运行,停止程序运行,等等操作。
我们使用keilC51编译调试环境,仿真器的选择太多了,你可以根据自己的实际情况来选择。
随后我将给大家提供keilc51相关的中文说明资料,这些资料详细地说明了如何使用C51编程和如何使用keiluV2环境调试。
现在可以开始做试验了,我们打开已经建立好的工程和编写好的程序试验。
顺便还会学习一下程序调试的技巧。
至于如何建立一个新工程,请参考C51的帮助文件。
请双击lessoncode01目录下的lesson1.uv2,打开后界面如下:
点一下上图第三排第2或者第3个按钮(您的编译器按钮位置不一定在那个位置,自己找找),就可以看到编译结果了。
上面显示是0errrs,0warnings,这是最佳的编译结果,如果有error,则无法进行下一步仿真,如果有warning,一定要尽量消除,确实无法消除的,也要确认不会对程序造成影响,才进行下一步的仿真。
在编译结果中,我们还可以看到有data,xdata,code等用了多少字节的报告,要注意您的单片机中是否有这么多的资源,如果不够,将来烧片运行时就可能出现问题。
比如AT89C51的程序空间是4K,xdata如果没有外扩就是0个,data是128个。
超出这些范围,程序就不能在AT89c51中运行。
不同的芯片有不同的容量,如SST89E516RD就有64K程序,内部768字节XDATA,还有256个字节的data。
我们的例程中肯定都考虑了这些了,肯定不会超出,将来自己开发时就要注意了。
下面我们故意把第9行的P10写成P11,点编译,因为没有预先定义P11,所以就报告错误了,如下图:
双击一下错误报告的那一行,窗口就也会跳到这一行,方便您进行修改。
好了,现在请把错误改回去,再编译一次,出现报告正确了以后,下面开始仿真了。
点一下第二行第5个一个放大镜里面一个d字母的按钮,就可以进入仿真了,仿真器要事先连接好哟。
进入仿真后要退出仿真环境也是点这个按钮。
注意,等会如果程序在正在全速运行时,仿真环境是不能直接退出的,得先点停止运行后,再点仿真按钮才可以退出。
点进入仿真按钮,程序开始装载,PC自动运行到了main()停下,并指向了main()函数的第一行。
进入仿真窗口后,如果出现的不是前面的源代码窗口,而是夹有反汇编代码的窗口,直接关掉这个窗口就会恢复到代码窗口。
下次进入也会直接进入到源代码窗口。
现在先试验单步,点单步(两个单步都可以,一般点单步跨过)。
可以看到灯亮了。
PC指针也指向了下一个
程序行。
再点一下单步,PC又走下一步,灯灭了。
再点一次,PC走到挂起的程序行了,继续点仍然在这一行。
这句指令其实就是使程序不断地跳到自己这一行,别的什么也不做。
一般称作程序挂起。
一般的实际应用中的程序是不会挂起的,一般是在main函数里做一个大循环,程序如下:
voidmain(void)//主程序
{
while
(1)
{
P11=0;//亮灯
P10=1;//灭灯
}
}
请将main函数程序改为上面的代码,我们下一步将试验断点的操作。
在第15行双击一下,可以看到程序行左边出现了一个红方块,这就是设置断点,再双击一次,断点就取消了。
如果程序在全速运行的过程中遇到断点,就会自动停下来给你分析。
注意在进入仿真后,并且程序是停止状态时,才可以设置或者取消断点。
现在点全速运行,可以看到程序在断点处停了下来,并且由于前一句指令刚刚执行了点灯,所以这时灯是亮着的。
现在在第14行设置断点,并且取消上一个断点。
现在点全速运行,可以看到程序在断点处停了下来,并且由于刚刚执行了灭灯,灯是灭着的。
好,现在试验全速运行和停止。
把断点取消,再点全速运行,可以看到灯是亮着的,但是不是很亮,这是由于程序是循环的,亮灭交替进行,亮的时间并不是全部的时间。
现在点停止,可以看到程序停止了,重复几次进行全速和停止,可以发现每次停止的地方不一定是同一位置。
第二课 用指令方式延时闪烁LED灯
本章将学习如何使LED闪烁,和如何查看变量的值。
单片机内部的CPU工作都是要靠时钟驱动的。
在标准51芯片中,每个指令周期是12个时钟。
所以只要外部时钟固定,某一条指令运行的时间也是固定的。
比如本试验中的单片机晶振振荡输出的时钟是HZ,一条单周期指令执行的时间就是12/秒=5.425347×10-7秒,这样如果你想在程序里延迟一段时间,就可以用循环执行多少条指令来实现。
这是一个最简单的延时方法,优点是不占用其他的单片机资源,缺点是不容易计算准确延时时间,而且延时过程中CPU无法做其他工作。
指令延时方法一般用在一些不用精确计时的场合。
在需要精确计时的场合,需要使用定时器,在之后的课程中将会学到。
程序由一个循环组成,在点亮P10口的LED之后,延时一段时间,再灭掉LED,又延时一段时间,之后循环到前面。
for()循环后面直接一个分号,表示这个循环里面什么事情也不做,就等循环完成指定的次数就退出来。
这也是指令循环延时的最常见的C写法。
编译后,按进入仿真。
按全速运行,可以看到P1.0的LED灯不断地闪烁。
下面我们用另一个更简单的方式点灯,就是取反IO口的状态。
取反指令将当前bit变量的状态反转,当前是1,取反后就是0,当前是0,取反后就是1。
IO口相当于一个bit变量,也可以这样取反。
请修改程序如下:
编译成功后,再点全速运行。
同样可以看到LED闪烁的现象。
可以看到,这种方法,我们只需要一次延时,就可以实现闪烁了。
下面我们再来学习如何查看变量n在运行中的值。
注意,要查看变量的值,只能在程序停下来的状态下查看。
在程序运行的过程中,程序不断地运行,变量也在不断地变化,一般是无法查看的。
点停止程序,将鼠标放在程序中的“n”上面。
可以看到旁边出现了一个小框框,上面显示了n=0x47D3,这就是变量此时的值。
如果觉得这样可能会点不准确,可以选中你要看的变量,同样会显示变量的值,个人感觉这种操作更为方便。
如图:
在命令行输入的