《八只LED灯做流水灯试验报告.docx》由会员分享,可在线阅读,更多相关《八只LED灯做流水灯试验报告.docx(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、51 八只 LED 灯做流水灯试验第一节:单片机在上电初始后, 其各端口输出为高电平。 假设我们现在想让接在 P1.0 口的 LED1 亮,那么我们只要 把 P1.0 口的电平变为低电平就可以了。想让 LED1 灭,LED0 亮,只需将 P1.0 上升,P1.1 变低,LED1 就熄灭 LED2 随后既点亮!依始类推如下所示 8 只 LED 变会一亮一暗的做流水灯了。本试验在 SP-51试验板”学习套件上的相关图纸:P1.0 低、P1.0 高、P1.1 低、P1.1 高、P1.2 低、P1.2 高、P1.3 低、P1.3 高、P1.4 低、P1.4 高、P1.5 低、P1.5 高、P1.6 低
2、、P1.6 高、P1.7 低、P1.7 高、返回到开头、程序完毕。我们不能说 P1.1 你变低,它就变低了。由于单片机听不懂我们的汉语的,只能承受二进制的码。我们又怎样来用二进制语谈论使单片机按我们的意思去工作呢?为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。“、0代”今日,我们不必用烦人的二进制去编写程序,完全可以将我们简洁理解的程序语言”通过 翻译”软件 翻译”成单片机所需的二进制代码,然后交给单片机去执行。这里的 程序语言”目前主要有汇编和 C 两种;在这里我们 所说的翻译”软件, 同行们都叫它为 编译器”,将程序
3、语言”通过编译器产生单片机的二进制代码的过程叫 编译。前面说到,要想使 LED1 变亮,只需将对应的单片机引脚电平变为低电平就可以了。现在让我们将 上面提到的 8 只 LED 流水灯试验写为汇编语言程序。汉语”语言汇编语言开头:star:P1.0 低clr p1.0P1.0 高setb p1.0P1.1 低clr p1.1P1.1 高P1.2 低setb p1.1clr p1.2P1.2 高setb p1.2P1.3 低clr p1.3P1.3 高setb p1.3P1.4 低clr p1.4P1.4 高setb p1.4P1.5 低clr p1.5P1.5 高setb p1.5P1.6 低c
4、lr p1.6P1.6 高setb p1.6P1.7 低clr p1.7P1.7 高setb p1.7返回到开头ljmp star完毕end这里用到了四条汇编指令:clr、 setb、 Ijmp、end ;clr :是将其后面指定的位清为 0;setb :是将其后面指定的位置成1 ;Ijmp :是无条件跳转指令,意思是:跳转到指定的标号处连续运行。end :是一条告知编译器:程序到此完毕的伪指令。伪指令只告知编译器此程序到此有何要求或条件,它不参与和影响程序的执行。这里需要说明的是,按汇编语法要求,所编制的程序下称源程序之格式和 书写要求必需依以下原则:1、源程序必需为纯文本格式文件,如用Wi
5、ndows ”附件冲的记事本”编写的文本文件;2、源程序的扩展名应是*.ASM ; 3、一行只能写一条语句,以回车作为本句的完毕, 每一语句行长度应少于 80 个字符即 40 个汉字。4、每行的格式应为:标号: 命令参数;注释即一行由四部份组成,各部份的挨次不能搞错,依实际要求可以缺省其中的一部份或几部份,甚至全部省去,即空白行。需要使用标号时标号后面必需有假设命令有多个参数,则参数与参数之间必需用:“”冒号,而命令语句和参数之间必需用空格分开,“ ”逗号分开,需要注释时注释前必需用;”分号,;”后面的语句可以写任何字符,包括汉字用于解释前面的汇编语句,它将不参与汇编,不生成代码。由于汇编程序
6、对我们还不直观,所以在编写源程序时,应当养成多写注释的习惯,这样有助于今后源程序的 阅读和维护。标号是标志程序中某一行的符号名,编译后标号的数值就是标号所在行代码的地址。在宏汇编ASM51 中标号的长度不受限制,但标号中不能包含:或其它的一些特别符号,也不能用汉字,可以用数字作标号,但必需用字母开头。当标号作参数用如标号作转移地址,在命令后面岀现时,必需舍去序中的 LJMP STAR 中的 STAR 是不能再有:。每行只能有一个标号,一个标号只能用在一处,假设有两行用了同一个标号,则汇编时就会出错。由于标:如上面程号的长度没有限制,可以用有意义的英文或汉语拼音来说明行,使源程序读起来更便利。源
7、程序中的字母不区分大小写,也就是说star 和 STAR 是一样的,请不要用大小写方式去区分不同的标号。好拉!法规知道了,现在该来看看前面我们编写的源程序该怎样处理了:编写源程序:先将编译软件安装好c51eval 软件的安装。软件安装好我们就可以编写程序了。第一步:双击 图标,消灭如图一 Uvw51所示的主界面其次步:建文件单击菜单栏内的 文件建”或者单击这时我们就中以在这里编辑程序了。如图二所示图标按钮则在上图所示的灰色区域内岀现一个白色的编辑区,图二第三步:编程程序建立了一个的编程文件后,我们就可以在这里编写我们所需要的程序了,下面我们就来编写前面所说的程序吧。!如图三所示:第四步:保存文
8、件程序编写好了,我们固然要记得保存了,要不我们编写程序就白费力了。好了,下面我们将上面编写的程序保存起来:单击 文件-保存”或者单击 图标,岀现如图四所示的对话框:图四这时参照图五所示将对话框的内容设置好:c51eval 保存文件时默认的文件扩展是名*.C,请按图五所示转变为为*.a51 :图五我们这里就先将文件保存在D/DDW 文件夹中,文件名你可以任凭取,这里先叫他为LED.a51 ;需强调的是保存文件的文件夹和文件名不能使用中文!即保存文件时不能以如下格式保存:正确的保存路径:D/DDW/LED.a51 固然,保存的文件夹名 DDW、编写的程序的文件名 LED,你都可以任凭的取一个,可以
9、是D/ABC/000.a51 。这就取决于你的兴趣了。错误的保存路径:D/源程序/DDW/LED.a51 ,或者是 D/DDW 流水灯程序.a51。总之在源程序的保存路径下不能有中文的岀现,同时文件名不能取的太长。第五步:建立工程将汇编的源程序保存后,还没有得到我们所需要的文件,这时我们还需要再建立工程,以便得到我们所需的 hex 文件。 建工程的步骤如下:首先先翻开建工程的对话框文件,如图六所示:图六点击建工程后岀现如图七所示的对话框,我们将对话框的参数设定好。将文件名设置成与刚刚源程序的 文件名一样,即设为LED.prj,同时保存的路径跟前面的源程序保存的路径一样,在D/DDW 上。现在就
10、可以把刚刚建立的工程文件 LED.prj 添加到刚保存的 LED.A51 源程序上了, 留意它们都在同一个根名目下。图七按图七所示操作后,会消灭如图八所示的对话框:图八点击“A加”消灭如图九所示画面:图九按图九所示完成操作后,软件会自动翻开一个对话框,如图十所示:图十如图十所示点击保存后,系统会自动回复到汇编状态。这时点击*创立全部图标*按钮,则进展了转换,并消灭如图十一所示的状态显示画面:图十一完成上述操作后,在图十一,我们看到了创立成功了的提示画面,这时我们点击0K 就大功告成了。翻开我们文件的保存路径:我的电脑 /D/DDW 我们可以看到包含hex 文件在内的全部相关程序文件了。我们上
11、面的工程文件也在其中了。他的名字叫作 LED.hex 文件。好啦,到此我们已将第一个流水灯程序编写、编译、烧写进展完啦,再下来就是将烧写好的AT89C51 从编程器上取下,放到 SP-51 试验板”学习套件的试验部份通电让 LED1LED8”流水”说明:由于单片机的时钟高达12MHz,8 个 LED 发光与熄灭的时间很短,实际试验结果凭我们的肉眼是看不到请连续学习下节课流水”效果的!那怎样才能让我们肉眼看到流水”灯效果呢?流水灯试验详解二上一节的试验最终没有得到“流水”显示的效果,主要是单片机执行每条指令的时间很短,我们肉眼无法 看到 LED 的熄灭与点亮。单片机内部能按部就班的自开工作,正是
12、在系统时钟的作用下,内部各规律硬件 产生各种所需脉冲信号而实现的。这个时钟信号既晶体振荡信号的周期称“振荡周期”。我们这个实 验中晶体使用的是 12MHZ.在单片机中,要处理最短周期的一条指令需要由期组成的,这个叫“机器周期”。12 个振荡周期既晶振振荡周8051 核的单片机,大多数指令只用一个机器周期既单周期,也有双周期和四周期的指令。 本试验中用到的 SETB P.x 和 CLR P.x 均属于单周期指令,也就是说,执行一句 SETB P.x 用时仅 1uS微秒, CLR P.x 也是 1uS;难怪我们前面的程序不能看到流水效果。DDW:CLR;程序开头P1.0;LED1 亮ACALLDE
13、LAYSETBP1.0;调用延时子程序;LED1 灭CLRP1.1;换灯,同上帚CLRP1.4旷ACALLDELAYSETBP1.4序改动一下,在每点亮一个 LED 后,让程序干点别的事,也就是让它等一会再将该面的程序:现在,将程LED 熄灭,连续执行下ACALLDELAYSETBP1.1?CLRP1.2ACALLDELAYSETBP1.2?CLRP1.3?ACALLDELAY?SETBP1.3?CLRP1.5旷ACALLDELAY?SETBP1.5?CLRP1.6?ACALLDELAY?SETBP1.6?CLRP1.7?ACALLDELAY?SETBP1.7?LJMPDDW;返回到开头循环D
14、ELAY:?;延时子程序MOVR1,#50AD10:?MOVR2,#100帚AD11:?MOVR3,#100?DJNZR3,$?DJNZR2,AD11?DJNZR1,AD10?RET;延时子程序完毕,返回到调用处的下一句END?请将上面的程序保存为 ILED.asm,进展编译,并烧写到 AT89S51 中,之后将 89S51 安装到套件的试验部份 插座上试验, 这回显示的就是“流水灯”的效果了!?回过头,让我们看看延时子程序是怎样工作的:单片机内部有不少存放器,这些存放器在单片机通电时,你可以给他写入数据是单片机按你程序要求写的数 据,而不是编程器写的,当其次次给他写入数据时,前次的数据就被数
15、据掩盖;固然也可以从存放 器中读取数据。当单片机没有电源供给时,存放器内部的数据也随即消逝;这些存放器人们叫他用编程器将我们编写的程序烧写到单片机中的存储器叫RAM 而ROM 现在,我们应当清楚:RAM 是让程序去使用的,ROM!我们编写的程序存放的地方!前面说过,单片机内部有不少RAM 本试验用的 AT89C51 有多少存放器?我们现在不必关心,现在只须知道单片机内部知名叫R0R7 的这 8 个存放器。这 8 个存放器每个都由8 个单独的位存放器组成,最大存放数据为二进制的时留意不要大于其有效范围。上面延时程序中,先用到1111 1111,十六进制=FF,十进制=255。在使用MOV R1,
16、#50,MO是移动的意思,该句是将 50 这个十进制数放到 R1 中;50 是马上数,按汇编语言要求前面要加“ 面要加“ ?H”,十六进制数的高位是字母时在字母前面还要加“#”号,汇编语言还规定,十六进制数后0”,例如:#0F8H;二进制数后面加“ B”,例如:#11110000B。十进制不加,例如:#100。延时程序的其次、三句为:MOV R2,#100 ; MOV R3,#100 ;这两句意思同前。第四句中DJNZ R3,$的意思是将 R3 里面的数减 1 后假设 R3 不等于 0 则跳到后面指定的程序位置,这里的“ $”既要跳转的程序位置,“ $”代表当前语句处,也就是说,R3 不等于
17、0 ,程序返回再次执行本句。假设 R3 减 1 后等于 0,程序完毕本句,连续执行下面的语句。延时程序的最终一句 是 RET,意思是退岀本子程序,返回到调用本子程序处的下一句。依据上面的解释,一进入延时子程序首 先为 R1, R2, R3 存放器装入我们需要的数据,然后先对R3 进展减数,每次减 1 ,R3 减完后减 R2,减R2 时就费事啦,由于 R2 每减 1 后不为 0 需要跳转到 AD11 标号处执行下面的语句,此时 R3 再次装入 数据 100,并且还要再次对 R3 进展减数, R2 减完后减 R1,减 R1 的过程你争论争论看看。每执行DJNZ ?Rn,rel Rn 指 R0R7,
18、rel 指转移地址指令一次,需要 2 个机器周期,单片机需耗时 2uS 指本试验,假设无视装数等语句,延时子程序从开头到完毕,单片机共耗时100*100*50*2nS,既 1000000uS=1 秒!假设加上装数等语句的耗时,延时时间大于 1 秒。到此,我们做的流水灯已成功,原理大致也明白 啦,假设你自认为这一课你完全明白了,那请你将“流水灯”的流向转变一下,也可以改为两边向内流,内 部向外流,我想你确定能用前面学到的方法实现这些功能。可能有些高手说,前面的编程方法是最 最笨的!,不错!但玩单片机初期不必讲究语言的简练,只要能完成预先要求就好,这是初学者要知道的。那么还有更好的编程思路吗?有!
19、请连续学习下节课做流水灯试验详解三在上节课中让 LED 流水是去逐个把握 P1 端口的每个位来实现的,那么我们在程序一开头就给 P1 口送一 个数,这个数本身就让 P1.0 先低,其他位为高,然后让这个数据向高位移动不就实现如此!惋惜,8051 没有让 P1 数据移动的指令,但有对累加器 ACC 中数据左移或右移的指令,流水”效果啦?确实ACC 是 8051 单片机内部算术规律单元中的一个存放器”这里叫他存放器是不正确的,但你可以先这样理解,ACC 在指令中常写为 A,他在数据传输和数据处理过程中作用格外重要,ACC 为 8 位。他可与片内全部单字节存放器交换数据,实际上P1 和其他端口在单片
20、机中也是一个存放器。这样我们可以将需移动的数据的数据即二进制的 1111 1110;因上句送到? p1 口的数据就熄灭了一位,所以将数据再 移动 7先放到 ACC 中,让其移动,然后将 ACC 移动后的数据再转送到 P1 口,这样同样可以实现 流水”效果。程序如下:DDW:?;开头MOVMOVACC,#0FEtACC 中先装入 LED1 熄灭HP1,ACC;将 ACC 的数据送 P1 口MOVR0,#7LOOP:?次就完成一个 8 位流水过程;数据移动循环RlA;将 ACC 中的数据左移一位MOVP1,A;把 ACC 移动过的数据送 p1 口显示ACALLDELAY;调用延时DJNZR0,LO
21、OP;没有移动够 7 次连续移动LJMPDDW;移动完 7 次后跳到开头重来,以到达循环流淌效果DELAY:?;延时子程序,就是上节课中的延时子程序MOVR1,#50?AD10:?MOVR2,#100?AD11:?MOVR3,#100?DJNZR3,$?DJNZR2,AD11?DJNZR1,AD10?RET?;延时子程序完毕,返回到调用处的下一句END?;本汇编程序到此完毕接下来,将上述程序编译,并烧写到前面我们的试验芯片中,流水效果与其次节课的一样。其实 8051 单片机有 111 条指令,这 111 条指令好比以前我们使用数字传呼机时的短语代码”一样,可以用几个 短语代码”去表示一句完整、通顺的语句段落。有的指令常用,有的指令不常用,只要遵守语法规章,你可以用这 些指令 组合”成你想象到的任何程序。固然,有时一条指令可以替代很多条指令,这样会使程序简捷,费 码削减,在编写较大程序时可以让程序存储器放得下你需要的代码。这也是单片机高手所追求的。固然, 在程序存储器空间不成问题时,你不这样做但也可以到达预期的功能,这也不算错。单片机内部还有很多部件”我们只是用到什么说什么,很不系统。但是我也不想系统的介绍这些,因系统介绍单片机构造和指 令的书很多,何况写的远比我好,因此,期望你在看本讲座的过程中,还要结合正规的教材学习其更多的 指令和 “部件”。