1、项目二:8位流水灯的单片机控制,项目目标 项目任务 项目分析 项目预备知识 项目实施 知识点链接,项目目标通过单片机控制8个发光二极管的顺序点亮,学会使用MCS-51单片机芯片的P1口进行输出控制,进一步学习汇编程序的分析方法,并能熟练运用RR、RL等基本指令。,项目任务要求应用AT89C51芯片,控制8个发光二极管的有序亮灭,呈现流水灯的效果。设计单片机控制电路并编程实现此功能。项目分析利用单片机P1口连接8个发光二极管,利用各引脚输出电位的变化,控制发光二极管的亮灭。P1口各引脚的电位变化可以通过指令来控制,为了清楚地分辨发光二极管的点亮和熄灭,在P1口输出信号由一种状态向另一种状态变化时
2、,编写延时程序实现一定的时间间隔。,项目预备知识:循环移位指令,RL A 将累加器A中的数据依次左移一位 RR A 将累加器A中的数据依次右移一位RLC A 将累加器A中的数据连同进位标志 位 CY一起依次 左移一位RRC A 将累加器A中的数据连同进位标志位CY一起依次右移一位,RL A RR A RLC A RRC A,后两条指令,影响P标志和CY。,循环移位指令(4条),例:,若A=5CH,CY=1,执行RLC A后,,对RLC、RRC指令,在CY=0时RLC相当于乘以2RRC相当于除以2,结果:A=B9H,CY=0,P=1,CLR A 将累加器A中的数据清零 CPL A 将累加器A中的
3、数据取反,项目预备知识:清0与取反指令,取反:CPL A ;/AA 例:若A=5CH,执行CPL A结果:A=A3H,清0:CLR A ;0A,在项目一和项目二中,为了能清晰的分辨出蜂鸣器的鸣叫和发光二极管的变化,我们进行了延时程序的编写。CPU执行完延时程序耗费的时间即是我们所要延时的时间,通常可以利用时钟频率、指令周期结合寄存器中的数据进行延时时间的计算。延时程序如下:DELAY:MOV R7,#10 ;1S D0:MOV R6,#100 ; 1SD1:MOV R5,#200 ; 1SD2:DJNZ R5,D2 ; 2SDJNZ R6,D1 ; 2S DJNZ R7,D0 ; 2SRET,
4、项目预备知识:软件延时程序的时间计算,采用12MHz的晶振,则一个机器周期是1S,“MOV R7,#10”是一条单周期指令,执行1次需要1S(关于指令的执行周期可以查附录二)。“DJNZ R5,D2”是双机器周期指令,执行1次需要21=2S。计算第1层循环(D2 )的时间:2002S=400S第2层循环(D1 )的时间:(1+400+2)100=40300S 第3层循环(D0 )的时间:(1+40300+2)10=403 030S0.4S,(一)设计思路在AT89C51单片机芯片及基本外围电路组成的单片机最小系统基础上,利用P1口的8个引脚控制8个发光二极管。由于发光二极管具有普通二极管的共性
5、-单向导电性,因此只要在其两极间加上合适的正向电压,发光二极管即可点亮;将电压撤除或加反向电压,发光二极管即熄灭。根据发光二极管的特性,结合单片机P1口的输出信号,即可实现流水灯的控制效果。,项 目 实 施,一、硬件电路设计,(二)电路设计 1、P1口结构及流水灯电路,左图是P1口中某一位的位结构电路图。P1口为8位准双向口,每一位均可独立定义为输入或输出口,当作为输出口时,1写入锁存器,T2截止,内部上拉电阻将电位拉至“1“,此时该口输出为1;当0写入锁存器, ,T2导通,输出则为0。作为输入口时,锁存器置1,T2截止,此时该位既可以把外部电路拉成低电平,也可由内部上拉电阻拉成高电平,所以P
6、1口称为准双向口。,P1.0P1.7: 准双向I/O口(内置了上拉电阻),2,1,D,Q,CK,/Q,读引脚=0,读锁存器=0,写锁存器,内部总线,Vcc,引脚P1.X,内部上拉电阻,(1)P1.0P1.7作为输出口【输出1】,2,1,D,Q,CK,/Q,读引脚=0,读锁存器=0,写锁存器,内部总线,Vcc,引脚P1.X,内部上拉电阻,输出数据 = 1 时,1,1,0,截止,=1,2,1,D,Q,CK,/Q,读引脚=0,读锁存器=0,写锁存器,内部总线,Vcc,引脚P1.X,内部上拉电阻,输出数据 = 0 时,0,0,1,=0,导通,(2)P1.0P1.7作为输出口【输出0】,2,1,D,Q,
7、CK,/Q,读引脚 =1,读锁存器=0,写锁存器,内部总线,Vcc,引脚P1.X,内部上拉电阻,输入数据时,要先对其写“1”,1,1,0,截止,(3)P1.0P1.7作为输入口,发光二极管的连接方法:若将它们的阴极连接在一起,阳极信号受控制,即构成共阴极接法,如图a所示;若将它们的阳极连接在一起,阴极信号受控制,则构成共阳极接法,如图b所示。由于P1口引脚输出高电位时电压大约是5V,为保证发光二极管的可靠工作,必须在发光二极管和单片机输出引脚间连接一只限流电阻。 本项目选用硅型普通发光二极管,限流电阻取220。,P1口控制流水灯(8个发光二极管)电路,综合以上的分析,得到下图所示电路原理图。,
8、(三)材料表 从原理图可以得到实现本项目所需的元器件。元器件的选择应该合理,以满足功能要求为原则,否则会造成资源的浪费。,二、 控制程序的编写 (一)绘制程序流程图 本控制使用简单程序设计中的顺序结构形式实现,程序结构流程图如下图。,(二)编制汇编源程序,2、程序执行过程,ORG 0000HLJMP MAIN2ORG 0200HMAIN2:MOV P1,#0FEH; L0亮LCALL DELAYMOV P1,#0FDH; L1亮LCALL DELAYMOV P1,#0FBH ; L2亮LCALL DELAYMOV P1,#0F7H ; L3亮LCALL DELAYMOV P1,#0EFH ;
9、L4亮LCALL DELAYMOV P1,#0DFH ; L5亮LCALL DELAY,MOV P1,#0BFH ; L6亮LCALL DELAYMOV P1,#7FH ; L7亮LCALL DELAYSJMP $;重复执行本条指令ORG 0F00HDELAY: MOV R7,#10D0: MOV R6,#100D1: MOV R5,#200D2: DJNZ R5,D2DJNZ R6,D1DJNZ R7,D0RET ;子程序返回指令END ;程序结束标记,在本项目中,利用P1口实现8个发光二极管的流水灯控制,主要利用了送数指令,将要显示的现象对应的数据通过P1口送出。在编写控制程序时,应首先将
10、每个对应现象分析清楚,比如:要让L3亮,其余发光二极管灭,则P1口的数据应为11110111B;要让L7亮,则P1口的数据应为01111111B。然后找到能实现此操作的指令即可。下面使用我们在本项目中学习的移位指令编写程序如下:ORG 0000H ORG 0F00H LJMP MAIN2 DELAY:MOV R7 ,#10ORG 0200H D0:MOV R6 ,#100MAIN2:MOV A,#0FEH D1:MOV R5, #200XH:MOV P1,A D2:DJNZ R5,D2LCALL DELAY DJNZ R6,D1RL A DJNZ R7,D0LJMP XH RETEND,知 识 点 链 接,分析后可知,本段程序与项目中给出的参考程序功能相似,但是指令数量较少,所占存储器空间较小。根据发光二极管的点亮次序,通过分析每次给P1口所送数据,发现不断变换的是数据中“0”的位置。若点亮次序是从L0L7,则“0”是自低位(右)向高位(左)移动的,符合指令“RL A”的功能。同时还可以总结出,若应用“RR A”指令,则8个发光二极管的点亮次序是从L7L0。应用了移位指令后,程序更简洁易懂了,因此在今后的学习中,应注意类似情况的处理。,三 、程序PROTUES仿真与调试,