八只LED灯做流水灯实验报告
流水灯实验·

实验一发光二极管流水灯实验一、实验要求利用单片机及8个发光二极管等器件,制作一个单片机控制的流水灯系统。
单片机的P0.0~P0.7接有8个发光二极管,运行程序,则8个发光二极管进行流水灯操作,流水灯从上到下依次点亮,反复循环。
二、实验目的1.掌握单片机最小系统的构成。
2.掌握P0口作为基本I/O口使用时,外部电路的连接方法。
3.如何控制I/O口来驱动LED发光二极管。
4.学会用PROTEUS 设计电路原理图,并进行仿真的方法。
5.学会使用Keil C编程。
三、实验步骤(一)电路原理图设计1.启动PROTEUS ISIS仿真工具。
参照实验指导书P24页2.5节的方法,设计电路原理图。
2.在元器件模式下,单击选取元器件,在Keywords一栏中输入元器件名称,如AT89C51,双击所匹配的元器件,便可将其加入到对象选择器中。
本实验需要选取的元器件有单片机AT89C51、发光二极管LED-BIRG、瓷片电容CAP、电解电容CAP-ELEC、电阻RES、上拉排阻RESPACK-8、晶振CRYSTAL、按钮BUTTON、双极性晶体管ST5771-1。
3.按图一电路原理图,在编辑区放置相应元器件,单击选择终端模式,放置电源和地,并连线。
4.设置元器件参数值,本实验中晶振X1频率为12MHz,瓷片电容C1、C2的值为30pF,电解电容C3的值为10uF,电阻R1为470,R2、R3的值为10K,电阻R4~R11的值为470,单片机AT89c51的时钟频率12MHz。
5. 设计完成电路后,单击电气检测按钮,会出现检查结果窗口,若有错,会给出详细的说明。
如没有错,将设计保存到自己的工作目录中。
(二)编写源程序,并生成.HEX文件。
1.启动KEIL Uvision4。
2. 按照实验指导书P50页4.1节的方法输入源程序并生成.HEX文件。
(注意:程序设计时考虑到实验学习板上的电路的设计,要使P2.7 = 0; 关闭液晶使能位,防止液晶数据口输出干扰P0口; 使P3.7 = 0, 选通WS 系列实验板的LED 流水灯的电源控制端)(三)仿真回到PROTEUS ISIS环境,并按照实验指导书P60页4.2节的方法加载.HEX文件进行仿真。
电路板流水灯实训报告

一、实验目的1. 掌握电子电路板的基本制作流程,包括电路设计、元件焊接、电路调试等。
2. 熟悉流水灯电路的工作原理,理解其电路设计及编程方法。
3. 提高动手能力和电子电路分析能力。
二、实验原理流水灯电路是一种常见的电子电路,通过单片机或其他控制器控制LED灯的依次点亮和熄灭,形成流水效果。
本实验采用51单片机作为控制器,通过编写程序控制LED灯的亮灭顺序,实现流水灯效果。
三、实验器材1. 51单片机实验板2. LED灯8个3. 电阻(220Ω)8个4. 接线端子5. 编程器6. 电源7. 焊接工具四、实验步骤1. 电路设计根据实验要求,设计流水灯电路原理图。
电路主要由51单片机的P0口输出,连接8个LED灯和8个220Ω电阻组成。
电阻起到限流作用,保护LED灯不被烧毁。
2. 元件焊接根据电路原理图,将元件焊接在实验板上。
注意焊接顺序和焊接质量,确保电路连接正确。
3. 编程使用编程器将编写好的程序烧录到51单片机中。
程序主要实现以下功能:- 初始化P0口为输出模式;- 设置延时函数,控制LED灯的点亮和熄灭时间;- 循环控制P0口的值,实现LED灯的流水效果。
4. 电路调试连接电源,观察LED灯的流水效果。
若流水效果不理想,检查电路连接是否正确,调整延时函数参数,直至达到预期效果。
五、实验结果与分析实验成功制作了一块流水灯电路板,实现了LED灯的流水效果。
实验过程中,遇到以下问题:1. 电阻值选择不当,导致LED灯亮度不稳定。
2. 焊接过程中,个别焊点虚焊,导致电路连接不良。
针对以上问题,采取以下措施:1. 调整电阻值,使LED灯亮度均匀。
2. 重新焊接虚焊点,确保电路连接良好。
六、实验总结通过本次电路板流水灯实训,掌握了以下知识和技能:1. 电子电路板的基本制作流程。
2. 流水灯电路的工作原理及编程方法。
3. 电子元件焊接技巧和电路调试方法。
本次实验提高了自己的动手能力和电子电路分析能力,为以后的学习和工作打下了基础。
单片机流水灯实验报告

单片机流水灯实验报告本实验旨在通过单片机控制LED灯的亮灭,实现流水灯效果。
通过对实验的设计、搭建和调试,我们可以更深入地理解单片机的工作原理和掌握相应的编程技巧。
实验器材和元件:1. 单片机,我们选用了STC89C52单片机作为控制核心;2. LED灯,我们使用8个LED灯作为实验的输出设备;3. 电阻,为了限流,我们使用了适当的电阻;4. 连接线、面包板等。
实验步骤:1. 搭建电路,首先,我们按照电路图将单片机、LED灯和电阻连接在一起,并将电路连接到电源上;2. 编写程序,接下来,我们使用C语言编写单片机的控制程序,实现LED灯的流水灯效果;3. 烧录程序,将编写好的程序通过烧录器烧录到单片机中;4. 调试程序,将烧录好的单片机连接到电路上,进行程序的调试和验证;5. 完善电路,根据实际调试情况,对电路进行必要的调整和完善,确保LED 灯能够按照预期的流水灯效果工作。
实验结果:经过反复调试和完善,我们成功实现了单片机控制LED灯的流水灯效果。
在程序控制下,8个LED灯按照顺序依次亮起并熄灭,形成了流水灯的效果。
整个实验过程非常顺利,取得了预期的效果。
实验心得:通过本次实验,我们对单片机的控制原理有了更深入的理解,也掌握了一定的C语言编程技巧。
在实验的过程中,我们遇到了一些问题,如LED灯未按预期工作、程序逻辑错误等,但通过分析和调试,最终都得到了解决。
实验不仅提高了我们的动手能力,也培养了我们的分析和解决问题的能力。
总结:本次实验不仅让我们熟悉了单片机的控制方法,也让我们体验了从实验设计到调试完善的整个过程。
通过这次实验,我们不仅学到了专业知识,也培养了动手能力和解决问题的能力。
希望在以后的学习和实践中,能够更好地运用所学知识,不断提升自己的能力。
以上就是本次单片机流水灯实验的报告内容,希望对大家有所帮助。
流水灯实验报告

流水灯实验报告实验目的1.了解单片机I/O口的工作原理。
2.掌握51单片机的汇编指令。
3.熟悉汇编程序开发,调试以及仿真环境。
一、实验内容通过汇编指令对单片机I/O进行编程(本实验使用P0口),以控制八个发光二极管以一定顺序亮灭。
(即流水灯效果)二、实验原理通过更改P0口8位的高低电平,分别控制8个发光二极管的亮灭。
具体的亮灭情况如下表:要实现“流水灯”效果,也就是需要将P0口的输出值发生以下变化:FE→FD→FB→F7→EF→DF→BF→7F→BF→DF→EF→F7→FB→FD→FE→......可以使用一个循环,不断对数据进行移位运算实现。
这里的移位指令采用RL和RR,即不带进位的位移运算指令。
如果使用带进位的位移运算指令(RLC和RRC),则需要定期把CY置0,否则会出现同时亮起两个发光二极管的情况。
三、实验过程1.在仿真系统中绘制好单片机的电路图2.编写汇编程序,程序如下:ORG 0000HDelay: MOV R0,#0FFHSJMP StartDelay1: MOV R1,#0FFHStart: MOV A, Delay2: NOP#0FEHMOV P0, A DJNZ R1,Delay2 CLR P2.7 DJNZ R0,Delay1 CLR P3.7 RETMove: MOV R2, #7H ENDMOV R3, #7HRMove: RL AMOV P0, ACALL DelayDJNZ R2,RMoveLMove: RR AMOV P0, ACALL DelayDJNZ R3,LMoveSJMP Move四、实验结果为了便于实验结果的描述,下面分别把P0.0, P0.1…, P0.7对应的发光二极管编号为1, 2, …, 8号二极管。
在仿真系统中,先从1号二极管下面是在仿真系统中的实验结果:1.只有1号二极管点亮2.只有2号二极管点亮3.只有3号二极管点亮4.只有4号二极管点亮5.只有5号二极管点亮6.只有6号二极管点亮7.只有7号二极管点亮8.只有8号二极管点亮实验的结果:二极管的发光状态从1→2→3→4→5→6→7→8→7→…→1→2;如此往复循环。
流水灯控制实验

综合实验:流水灯控制一、实验要求:根据开关状态选择八个流水灯的工作方式,且在任何状态下如有开关状态发生改变,则能立即转入最新开关状态所对应方式工作。
模式一:顺序点亮八个灯,一直循环,直到开关状态改变。
模式二:八个灯闪烁,即八盏灯全亮后全灭,一直循环,直到开关状态改变。
模式三:间隔点亮八个灯,如对八盏灯编号为L1、L2、L3、L4、L5、L6、L7、L8 ,则灯亮的方式为:L1 L3 L5 L7 ,L2 L4 L6 L8 ,L1 L3 L5 L7 ,L2 L4 L6 L8(从左往右循环)。
二、实验内容:开关S1、S2 分别与P3.1、P3.0连接,用于流水灯工作方式控制,开关组合为00、01、02、03,其中00为无效状态,01、02、03分别对应连续方式点亮灯、闪烁、间隔点亮。
八盏灯L1、L2、L3、L4、L5、L6、L7、L8分别与P1.0~P1.7连接,八盏灯为共阴极连接,即高电平点亮。
由于灯的状态改变时间间隔小于肉眼能分辨的最小时间间隔,所以在程序实现的时候必须在灯两种状态之间引入延时处理,以便肉眼能够分辨。
1.延时子程序(条件转移侧N,竖Y此页有效)四、程序代码:ORG 0000HSJMP MAINORG 0030HMAIN:MOV SP,#60HRESCAN:MOV A,#00HMOV P1,A ;灯全灭LCALL SCAN ;扫描P3口状态CJNE R0,#01H,NEXT1AJMP MODE1 ;如果P3=FDH,则转入MODE1执行(灯连续点亮)NEXT1: CJNE R0,#02H,NEXT2AJMP MODE2 ;如果P3=FEH,则转入MODE2执行(灯闪烁)NEXT2: CJNE R0,#03H,NEXT3AJMP MODE3 ;如果P3=FFH,则转入MODE3执行(间隔点亮灯)NEXT3: SJMP RESCAN ;如果P3=FCH(无效状态),则不停的对P3口扫描MODE1: ;灯连续点亮,从左往右(MODE1), P3=FDH MOV A,#00HMOV P1,AMOV R2,#80H ;R2=1000,0000LOOP1: MOV A,R2MOV P1,ARR AMOV R2,A ;A向右移一位后回送R2LCALL DEL200 ;调用200Ms延时子程序LCALL SCAN ;扫描P3口状态CJNE R0,#01H,NEXT01SJMP LOOP1 ;如果P3状态没变,跳到LOOP1执行NEXT01:CJNE R0,#02H,NEXT02AJMP MODE2 ;如果P3变为P3=FEH,跳到MODE2执行NEXT02: CJNE R0,#03H,NEXT03AJMP MODE3 ;如果P3变为P3=FFH,跳到MODE3执行NEXT03: AJMP RESCAN ;如果P3=FCH(无效状态),则不停的对P3口扫描MODE2: ;灯闪烁(MODE2), P3=FEHMOV A,#00HLOOP2: MOV P1,ACPL ALCALL DEL200 ;延时200MsPUSH ACC ;扫描P3状态前,保护现场LCALL SCAN ;扫描P3口POP ACC ;恢复现场CJNE R0,#02H,NEXT001SJMP LOOP2 ;如果状态没变,转到LOOP2执行NEXT001: CJNE R0,#01H,NEXT002AJMP MODE1 ;如果模式改变,P3=FEH,跳到MODE2NEXT002: CJNE R0,#03H,NEXT003SJMP MODE3 ;如果模式改变,P3=FFH,跳到MODE3NEXT003: AJMP RESCAN ;如果P3=FCH(无效状态),则不停的对P3口扫描MODE3:MOV A,#00H ;间隔点亮灯(MODE3),R0=03HMOV P1,AMOV R3,#04H ;R3,R4都用来控制当前趟第一个灯亮的初始位置MOV R4,#04HMOV A,#80H ;准备给P1送1000,0000LOOP3 :MOV P1,ARR ARR ALCALL DEL200 ;延时200MsDJNZ R3,LOOP3 ;判断当前(从第一个开始亮)趟结束MOV R3,#04H ;如果此趟结束,重设计数,为下一次做准备MOV A,#40H ;设置下一趟灯亮的初始位置(第二个)LOOP4: MOV P1,ARR ARR ALCALL DEL200 ;延时200MsPUSH ACC ;保护现场LCALL SCAN ;扫描P3口POP ACC ;现场恢复CJNE R0,#03H,NEXT21DJNZ R4,LOOP4 ;如果模式不变,且该趟没结束,则到LOOP4MOV R4,#04H ;如果此趟结束(模式没变),则重置计数,为下一次做准备MOV A,#80HSJMP LOOP3 ;执行当前模式的第二次亮灯NEXT21:CJNE R0,#01H,NEXT22AJMP MODE1 ;模式改变为MODE1则装到对应位置执行NEXT22: CJNE R0,#02H,NEXT23AJMP MODE2 ;模式改变为MODE2则装到对应位置执行NEXT23: AJMP RESCAN ;如果R0=00H(无效状态),则不停的对P3口扫描DEL200: ;如果晶振频率f=6MHz,误差为0MOV R7,#13HDL1: MOV R6,#14HDL0: MOV R5,#82HDJNZ R5,$ ;R5-1<>0时重复执行此句DJNZ R6,DL0DJNZ R7,DL1RETSCAN:JB P3.0,MM ;P3口状态扫描子程序JB P3.1,VVMOV A,#00HMOV R0,ARETVV:MOV A,#02HMOV R0,ARETMM:JB P3.1,NNMOV A,#01HMOV R0,ARETNN:MOV A,#03MOV R0,ARETEND五、实验分析1、误差分析:假如晶振频率f = 6MHz,那么一个机器周期t = 0.002Ms。
单片机实验LED流水灯实验

LED流水灯实验一、实验内容将LED灯逐个点亮,然后全亮,全灭。
二、实验原理8个LED发光二极管,分别对应单片机IO口的P0.0到P0.7口,8个单片机IO口组成一个字节,用一个八位二进制的左移和右移来确定灯的亮灭,并用定时器延时。
三、描述该实验中运用的理论知识1、LED的点亮:8个LED发光二极管,分别对应单片机IO口的P0.0到P0.7口,8个单片机IO口组成一个字节,在程序编写过程中,可以直接用P0来进行操作。
2、流水效果:C语言的8位二进制数代表了8个IO口,左移,最低位填0,然后按位取反,就可以将灯逐个点亮3、延时:特殊功能寄存器TMOD,如图T1和T0分别代表单片机两个计数器。
GATE:该位被置位时为门控位。
仅当TR1被置位并且INT1脚为高,定时器开始计数。
当该位被清零时,只要TR1被置位,定时器1马上开始计数。
C/T:该位为0的时候,用作定时器,该位为1的时候,用做计数器。
0.5秒的延时12 * (65536- x)/11059200 = 0.001四、实验步骤1、流程图2、结果程序:#include <reg52.h>typedef unsigned char uint8;typedef unsigned int uint16;sbit ENLED = P1^4;sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;main(){uint8 counter;uint16 i,j;ENLED = 0;ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1;TMOD = 0x01;TH0 = 0xB8;TL0 = 0x00;TR0 = 1;while(1){if(1 == TF0){TF0 = 0;TH0 = 0xB8;TL0 = 0x00;counter++;}if(25 == counter){counter = 0;if(8 == j){P0 = 0X00;for(i=0;i<=38000;i++);P0 = 0XFF;for(i=0;i<=38000;i++);j = 0;}P0 = ~(1 << j++);}}}。
四、实现8个LED流水灯

/***************项目名称:实现8个LED流水灯***************/ #include<reg52.h> //引用S52单片机头文件/***************定义8个LED引脚***************************/ sbit LED1=P1^0; //定义一个LED的引脚sbit LED2=P1^1; //定义另一个LED的引脚sbit LED3=P1^2;sbit LED4=P1^3;sbit LED5=P1^4;sbit LED6=P1^5;sbit LED7=P1^6;sbit LED8=P1^7;void Delay(void); //子函数的声明,后面要加分号。
void main() //主程序main函数{while(1) //在主程序中设置死循环"while(1)"{LED1=0; //P1.0口输出低电平,使LED1灯亮Delay(); //延时字函数的调用LED1=1; //P1.0口输出高电平,使LED1灯灭LED2=0; //P1.1口输出低电平,使LED2灯亮Delay(); //延时字函数的调用LED2=1; //P1.1口输出高电平,使LED2灯灭LED3=0; //P1.2口输出低电平,使LED3灯亮Delay(); //延时字函数的调用LED3=1; //P1.2口输出高电平,使LED3灯灭LED4=0; //P1.3口输出低电平,使LED4灯亮Delay(); //延时字函数的调用LED4=1; //P1.3口输出高电平,使LED4灯灭LED5=0; //P1.4口输出低电平,使LED5灯亮Delay(); //延时字函数的调用LED5=1; //P1.4口输出高电平,使LED5灯灭LED6=0; //P1.5口输出低电平,使LED6灯亮Delay(); //延时字函数的调用LED6=1; //P1.5口输出高电平,使LED6灯灭LED7=0; //P1.6口输出低电平,使LED7灯亮Delay(); //延时字函数的调用LED7=1; //P1.6口输出高电平,使LED7灯灭LED8=0; //P1.7口输出低电平,使LED8灯亮Delay(); //延时字函数的调用LED8=1; //P1.7口输出高电平,使LED8灯灭}}void Delay(void) //子函数的建立,延时一段时间的子函数{unsigned int i=50000; //声明一个int型的变量,即"int"的范围为0~65536 while(--i); //延时一段时间}。
流水灯实验报告

单片机流水灯试验一、实验目的:1、进一步熟悉Keil C51集成开发环境调试功能的使用2、学会自己编写程序,进行编译、仿真调试3、学会使用单片机的P0口作为I/O口去控制外围电路,实现LED灯以固定的频率进行闪烁。
二、实验设备:1、PC机2、SW-51PROC单片机综合实验平台三、实验内容:1、编写一段程序,用单片机P0口的8个输出去控制8个LED灯,实现如下功能:先使8个LED灯轮流点亮,从左向右移动,时间间隔0.5s。
以上过程循环实现。
四、实验步骤:1、实验原理:单片机流水的实质是单片机各引脚在规定的时间逐个上电,使LED灯能逐个亮起来但过了该引脚通电的时间后便灭灯的过程,实验中使用了单片机的P2端口,对8个LED灯进行控制,要实现逐个亮灯即将P2的各端口逐一置零,中间使用时间间隔隔开各灯的亮灭。
使用rl或rr a实现位的转换。
A寄存器的位经过rr a之后转换如下所示:然后将A寄存器转换一次便送给P2即MOV P2,A便将转换后的数送到了P2口,不断循环下去,便实现了逐位置一操作。
2、实验电路图a11a223a34a4b1b2b3b45678GND0a11a223a34a4P2.4P2.5P2.6P2.75678a11a223a34a4P2.0P2.1P2.2P2.35678Vcc10+5v80C513通过仿真实验正确性代码如下:ORG 0MOV A,#00000001BLOOP:MOV P2,ARL AACALL DELAYSJMP LOOPDELAY:MOV R1,#255DEL2:MOV R2,#250DEL1:DJNZ R2,DEL1DJNZ R1,DEL2RETEndORG 0000HLJMP MAIN4、实验程序:ORG 0050HMAIN:MOV R0,#14MOV DPTR,#TABLEL0: MOV A,#0L1: MOVC A,@DPTR+AMOV P0,AACALL DELAY1INC A41DJNZ R0,L1SJMP L0DELAY1:MOV R1,#250LOOP1:MOV R2,#250LOOP2:NOPNOPNOPNOPNOPDJNZ R0,LOOP2DJNZ R1,LOOP1RETTABLE:DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FD HEND5、实验结果:五、实验总结这次试验我通过Proteus仿真实现对流水灯功能的实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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低、P1.6高、P1.7低、P1.7高、返回到开始、程序结束。
我们不能说P1.1你变低,它就变低了。
因为单片机听不懂我们的汉语的,只能接受二进制的“1、0......”代码。
我们又怎样来用二进制语议论使单片机按我们的意思去工作呢?为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。
今天,我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,然后交给单片机去执行。
这里的“程序语言”目前主要有汇编和C两种;在这里我们所说的“翻译”软件,同行们都叫它为“编译器”,将“程序语言”通过编译器产生单片机的二进制代码的过程叫编译。
前面说到,要想使LED1变亮,只需将对应的单片机引脚电平变为低电平就可以了。
现在让我们将上面提到的8只LED流水灯实验写为汇编语言程序。
“汉语”语言汇编语言开始:star:P1.0低clr p1.0P1.0高setb p1.0P1.1低clr p1.1P1.1高setb p1.1这里用到了四条汇编指令:clr、setb、ljmp 、end;clr:是将其后面指定的位清为0;setb:是将其后面指定的位置成1;ljmp:是无条件跳转指令,意思是:跳转到指定的标号处继续运行。
end:是一条告诉编译器:程序到此结束的伪指令。
伪指令只告诉编译器此程序到此有何要求或条件,它不参与和影响程序的执行。
这里需要说明的是,按汇编语法要求,所编制的程序(下称源程序)之格式和书写要求必须依下列原则:1、源程序必须为纯文本格式文件,如用Windows“附件”中的“记事本”编写的文本文件;2、源程序的扩展名应是*.ASM;3、一行只能写一条语句,以回车作为本句的结束,每一语句行长度应少于80个字符(即40个汉字)。
4、每行的格式应为:标号:命令参数;注释即一行由四部份组成,各部份的顺序不能搞错,依实际要求可以缺省其中的一部份或几部份,甚至全部省去,即空白行。
需要使用标号时标号后面必须有“:”(冒号),而命令语句和参数之间必须用空格分开,如果命令有多个参数,则参数与参数之间必须用“,”(逗号)分开,需要注释时注释前必须用“;”(分号),“;”后面的语句可以写任何字符,包括汉字用于解释前面的汇编语句,它将不参与汇编,不生成代码。
由于汇编程序对我们还不直观,所以在编写源程序时,应当养成多写注释的习惯,这样有助于今后源程序的阅读和维护。
标号是标志程序中某一行的符号名,编译后标号的数值就是标号所在行代码的地址。
在宏汇编ASM51中标号的长度不受限制,但标号中不能包含‘:’或其它的一些特殊符号,也不能用汉字,可以用数字作标号,但必须用字母开头。
当标号作参数用(如标号作转移地址),在命令后面出现时,必须舍去‘:’(如上面程序中的LJMP STAR中的STAR 是不能再有:)。
每行只能有一个标号,一个标号只能用在一处,如果有两行用了同一个标号,则汇编时就会出错。
由于标号的长度没有限制,可以用有意义的英文或汉语拼音来说明行,使源程序读起来更方便。
源程序中的字母不区分大小写,也就是说star 和STAR 是一样的,请不要用大小写方式去区分不同的标号。
好拉!规矩知道了,现在该来看看前面我们编写的源程序该怎样处理了:编写源程序:先将编译软件安装好(c51eval 软件的安装)。
软件安装好我们就可以编写程序了。
第一步:双击Uvw51图标,出现如图一所示的主界面第二步:新建文件单击菜单栏内的“文件----新建”或者单击图标按钮则在上图所示的灰色区域内出现一个白色的编辑区,这时我们就中以在这里编辑程序了。
如图二所示。
图二第三步:编程程序建立了一个新的编程文件后,我们就可以在这里编写我们所需要的程序了,下面我们就来编写前面所说的程序吧。
!如图三所示:第四步:保存文件程序编写好了,我们当然要记得保存了,要不我们编写程序就白费劲了。
好了,下面我们将上面编写的程序保存起来:单击“文件----保存”或者单击图标,出现如图四所示的对话框:图四这时参照图五所示将对话框的内容设置好:c51eval保存文件时默认的文件扩展是名*.C,请按图五所示改变为为*.a51:图五我们这里就先将文件保存在D/DDW文件夹中,文件名你可以随便取,这里先叫他为LED.a51;需强调的是保存文件的文件夹和文件名不能使用中文!即保存文件时不能以如下格式保存:正确的保存路径:D/D DW/LED.a51 当然,保存的文件夹名DDW、编写的程序的文件名LED,你都可以随意的取一个,可以是D/ABC/000.a51。
这就取决于你的兴趣了。
错误的保存路径:D/源程序/DDW/LED.a51,或者是D/DDW 流水灯程序.a51。
总之在源程序的保存路径下不能有中文的出现,同时文件名不能取的太长。
第五步:建立项目将汇编的源程序保存后,还没有得到我们所需要的文件,这时我们还需要再建立项目,以便得到我们所需的hex文件。
新建项目的步骤如下:首先先打开新建项目的对话框文件,如图六所示:图六点击新建项目后出现如图七所示的对话框,我们将对话框的参数设定好。
将文件名设置成与刚才源程序的文件名相同,即设为LED.prj,同时保存的路径跟前面的源程序保存的路径一样,在D/DDW上。
现在就可以把刚才建立的项目文件LED.prj添加到刚保存的LED.A51源程序上了,注意它们都在同一个根目录下。
图七按图七所示操作后,会出现如图八所示的对话框:图八点击“(A)加”出现如图九所示画面:图九按图九所示完成操作后,软件会自动打开一个对话框,如图十所示:图十如图十所示点击保存后,系统会自动回复到汇编状态。
这时点击*创建所有图标*按钮,则进行了转换,并出现如图十一所示的状态显示画面:图十一完成上述操作后,在图十一,我们看到了创建成功了的提示画面,这时我们点击OK就大功告成了。
打开我们文件的保存路径:我的电脑/D/DDW 我们可以看到包含hex文件在内的所有相关程序文件了。
我们上面的项目文件也在其中了。
他的名字叫作LED.hex文件。
好啦,到此我们已将第一个流水灯程序编写、编译、烧写进行完啦,再下来就是将烧写好的AT89C51从编程器上取下,放到“SP-51实验板”学习套件的实验部份通电让LED1~LED8“流水”。
说明:由于单片机的时钟高达12MHz,8个LED发光与熄灭的时间很短,实际实验结果凭我们的肉眼是看不到“流水”效果的!那怎样才能让我们肉眼看到“流水”灯效果呢?请继续学习下节课流水灯实验详解二上一节的实验最后没有得到“流水”显示的效果,主要是单片机执行每条指令的时间很短,我们肉眼无法看到LED的熄灭与点亮。
单片机内部能按部就班的自动工作,正是在系统时钟的作用下,内部各逻辑硬件产生各种所需脉冲信号而实现的。
这个时钟信号(既晶体振荡信号)的周期称“振荡周期”。
我们这个实验中晶体使用的是12MHZ. 在单片机中,要处理最短周期的一条指令需要由12个振荡周期(既晶振振荡周期)组成的,这个叫“机器周期”。
8051核的单片机,大多数指令只用一个机器周期(既单周期),也有双周期和四周期的指令。
本实验中用到的SETB P.x和CLR P.x均属于单周期指令,也就是说,执行一句 SETB P.x 用时仅1uS(微秒),CLR P.x 也是1uS;难怪我们前面的程序不能看到流水效果。
现在,将程序改动一下,在每点亮一个LED后,让程序干点别的事,也就是让它等一会再将该LED熄灭,继续执行下面的程序:请将上面的程序保存为 1LED.asm,进行编译,并烧写到AT89S51中,之后将89S51安装到套件的实验部份插座上实验,这回显示的就是“流水灯”的效果了!?回过头,让我们看看延时子程序是怎样工作的:单片机内部有不少寄存器,这些寄存器在单片机通电时,你可以给他写入数据(是单片机按你程序要求写的数据,而不是编程器写的),当第二次给他写入新数据时,前次的数据就被新数据覆盖;当然也可以从寄存器中读取数据。
当单片机没有电源供给时,寄存器内部的数据也随即消失;这些寄存器人们叫他RAM,而用编程器将我们编写的程序烧写到单片机中的存储器叫ROM;现在,我们应该清楚:RAM是让程序去使用的,ROM是我们编写的程序存放的地方!前面说过,单片机内部有不少RAM,本实验用的AT89C51有多少寄存器?我们现在不必关心,现在只须知道单片机内部有名叫R0~R7 的这8个寄存器。
这8个寄存器每个都由8个单独的位寄存器组成,最大存放数据为二进制的 1111 1111,十六进制 = FF,十进制 = 255。
在使用时注意不要大于其有效范围。
上面延时程序中,先用到 MOV R1,#50 ,MOV是移动的意思,该句是将50这个十进制数放到R1中;50是立即数,按汇编语言要求前面要加“#”号,汇编语言还规定,十六进制数后面要加“?H”,十六进制数的高位是字母时在字母前面还要加“0”,例如:#0F8H;二进制数后面加“B”,例如:#11110000B。
十进制不加,例如:#100。
延时程序的第二、三句为: MOV R2,#100 ;MOV R3,#100 ;这两句意思同前。
第四句中DJNZ R3,$ 的意思是将 R3 里面的数减 1 后如果 R3 不等于 0 则跳到后面指定的程序位置,这里的“$”既要跳转的程序位置,“$”代表当前语句处,也就是说,R3不等于 0,程序返回再次执行本句。
如果R3 减 1 后等于0,程序结束本句,继续执行下面的语句。
延时程序的最后一句是RET ,意思是退出本子程序,返回到调用本子程序处的下一句。
根据上面的解释,一进入延时子程序首先为R1, R2, R3 寄存器装入我们需要的数据,然后先对R3 进行减数,每次减 1 ,R3 减完后减R2 ,减R2 时就费事啦,因为R2 每减 1 后不为 0 需要跳转到AD11 标号处执行下面的语句,此时R3 再次装入数据100,并且还要再次对R3 进行减数......,R2 减完后减R1,减R1的过程你研究研究看看。