用单片机实现流水灯的控制设计毕业资料Word下载.docx

上传人:b****1 文档编号:1524801 上传时间:2023-04-30 格式:DOCX 页数:18 大小:45.25KB
下载 相关 举报
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第1页
第1页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第2页
第2页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第3页
第3页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第4页
第4页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第5页
第5页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第6页
第6页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第7页
第7页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第8页
第8页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第9页
第9页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第10页
第10页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第11页
第11页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第12页
第12页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第13页
第13页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第14页
第14页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第15页
第15页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第16页
第16页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第17页
第17页 / 共18页
用单片机实现流水灯的控制设计毕业资料Word下载.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

用单片机实现流水灯的控制设计毕业资料Word下载.docx

《用单片机实现流水灯的控制设计毕业资料Word下载.docx》由会员分享,可在线阅读,更多相关《用单片机实现流水灯的控制设计毕业资料Word下载.docx(18页珍藏版)》请在冰点文库上搜索。

用单片机实现流水灯的控制设计毕业资料Word下载.docx

如果要让接在P0.0口的D5亮起来,那么只要把P0.0口的电平变为低电平就可以了;

相反,如果要接在P0.0口的D5灯熄灭,就要把P0.0口的电平变为高电平;

同理,接在P0.1~P0.7口的其他7个LED的点亮和熄灭的方法同D5。

因此,要实现流水灯功能,我们只要将发光二极管D1~D8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。

  从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;

相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;

同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭的方法同LED1。

因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。

在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。

3.软件编程

#include<

reg51.h>

intrins.h>

#defineucharunsignedchar//定义无符号字符

#defineuintunsignedint//定义无符号整数

sbitk1=P3^4;

//增加键

sbitk2=P3^5;

//减少键

unsignedcharPWM=0x7f;

//赋初值

intch=100;

unsignedchartemp=0xff;

unsignedcharshu=0x00;

unsignedchark=0;

unsignedcharm=1;

voiddelayms(charms);

//voidliu();

voidline();

voidshudu();

voidfangxiang();

voiddelay(uintt);

voidtiao();

unsignedcharconstzu[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,};

voidmain()

{P1=0xff;

//P0=0xff;

TMOD=0x21;

TH0=0xff;

//1ms延时常数

TL0=0x02;

//频率调节

TH1=PWM;

//脉宽调节

TL1=0;

EA=1;

ET0=1;

ET1=1;

TR0=1;

//P0=0xff;

//EA=1;

EX0=1;

EX1=1;

//TCON=0x01;

IE0=1;

IE1=1;

IT0=1;

IT1=1;

while

(1)

{

if(P1==0xef)

{

if(PWM!

=0xff)

{PWM++;

delayms(10);

}

}

if(P1==0xdf)

{

if(PWM!

=0x02)

{PWM--;

delayms(10);

}

if(P1==0x7f)

{

//delayms(10);

fangxiang();

}

}

/*********************************************************/

//设置LED灯的亮灭程度

//定时器0中断服务程序.

voidtimer0()interrupt1

{

TR1=0;

TR1=1;

if(PWM<

0xff)

P0=shu;

//启动输出

//定时器1中断服务程序

voidtimer1()interrupt3

P0=0xff;

//结束输出

//延时子程序

voiddelayms(charms)

{

chari;

while(ms--)

for(i=0;

i<

120;

i++);

//设置流水灯的方向

voidfangxiang()

{//while

(1)

uinti;

uintj;

uinta=1;

uintb=9;

//uchartemp;

//TR0=0;

//TR1=0;

while(P1!

=0xf7)

{if(m%2==1)

for(i=b;

i<

8&

&

P1!

=0xf7;

i++)//8个流水灯逐个闪动

{

if(m%2==1)

shu=zu[i];

delay(ch);

//调用延时函数

//b--;

}

b=9;

for(i=1;

9&

if(m%2==1)

shu=zu[i];

delay(ch);

a++;

if(m%2==0)

{for(j=a;

j>

0&

j--)

if(m%2==0)

shu=zu[j];

//a--;

a=1;

for(j=8;

j--)//8个流水灯逐个闪动

if(m%2==0)

shu=zu[j];

b--;

//TR0=1;

//TR1=1;

//{P0=0x0f;

shu=0x00;

voiddelay(uintt)//定义延时函数

registeruintbt;

for(;

t>

0;

t--)

for(bt=0;

bt<

255;

bt++);

voidint_0()interrupt0

{EX0=0;

//delayms

(1);

ch=ch+40;

if(ch>

=200)

ch=20;

//delayms(15);

EX0=1;

}

voidint_1()interrupt2

{//uintm;

EX1=0;

m++;

if(m==100)

m=1;

EX1=1;

  单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要告诉单片机怎么来进行工作,即编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。

软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。

下面我们以最简单的流水灯控制功能即实现8个LED灯的循环点亮,来介绍实现流水灯控制的几种软件编程方法。

  3.1位控法

  这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,从而来控制相应LED灯的亮灭。

程序如下:

  ORG 

 

0000H 

单片机上电后从0000H地址执行

  AJMP 

START 

跳转到主程序存放地址处

0030H 

设置主程序开始地址

  START:

MOV 

SP,#60H 

设置堆栈起始地址为60H

  CLR 

P1.0 

P1.0输出低电平,使LED1点亮

  ACALL DELAY 

调用延时子程序

  SETB  P1.0 

P1.0输出高电平,使LED1熄灭

  CLR  P1.1 

 

P1.1输出低电平,使LED2点亮

SETB  P1.1 

P1.1输出高电平,使LED2熄灭

 CLR  P1.2 

P1.2输出低电平,使LED3点亮

  SETB  P1.2 

nbsp;

P1.2输出高电平,使LED3熄灭

  CLR  P1.3 

P1.3输出低电平,使LED4点亮

  SETB  P1.3 

P1.3输出高电平,使LED4熄灭

  CLR  P1.4 

P1.4输出低电平,使LED5点亮

  SETB  P1.4 

P1.4输出高电平,使LED5熄灭

  CLR  P1.5 

P1.5输出低电平,使LED6点亮

  SETB  P1.5 

P1.5输出高电平,使LED6熄灭

  CLR  P1.6 

P1.6输出低电平,使LED7点亮

  SETB  P1.6 

P1.6输出高电平,使LED7熄灭

  CLR  P1.7 

P1.7输出低电平,使LED8点亮

  SETB  P1.7 

P1.7输出高电平,使LED8熄灭

调用延时子程序

  AJMP  

8个LED流了一遍后返回到标号START处再循环

  DELAY:

  

延时子程序

  MOV 

R0,#255  ;

延时一段时间

  D1:

MOV 

R1,#255

  DJNZ 

R1,$

R0,D1

  RET 

子程序返回

  END 

程序结束

本文相关DataSheet:

  3.2循环移位法

  在上个程序中我们是逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们利用循环移位指令,采用循环程序结构进行。

我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后延时一段时间,再让这个数据向高位移动,然后再输出至P1口,这样就实现“流水”效果啦。

由于8051系列的指令中只有对累加器ACC中数据左移或右移的指令,因此实际编程中我们应把需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”效果。

具体编程如下所示,程序结构确实简单了很多。

 ORG 

设置堆栈起始地址为60H

  MOV  

A,#0FEH 

ACC中先装入LED1亮的数据(二进制的11111110)

  MOV  P1,A 

将ACC的数据送P1口

  MOV  R0,#7 

将数据再移动7次就完成一个8位流水过程

  LOOP:

RL 

将ACC中的数据左移一位

P1,A 

把ACC移动过的数据送p1口显示

  ACALL 

DELAY 

R0,LOOP 

没有移动够7次继续移动

移动完7次后跳到开始重来,以达到循环流动效果

  3.3查表法

上面的两个程序都是比较简单的程序,“流水”花样只能实现单一的“从左到右”流方式。

运用查表法所编写的流水灯程序,能够实现任意方式流水,而且流水花样无限,只要更改流水花样数据表的流水数据就可以随意添加或改变流水花样,真正实现随心所欲的流水灯效果。

我们首先把要显示流水花样的数据建在一个以TAB为标号的数据表中,然后通过查表指令“MOVC A,@A+DPTR”把数据取到累加器A中,然后再送到P1口进行显示。

具体源程序如下,TAB标号处的数据表可以根据实现效果的要求任意修改。

DPTR,#TAB 

流水花样表首地址送DPTR

CLR 

累加器清零

  MOVC 

A,@A+DPTR 

取数据表中的值

  CJNE 

A,#0FFH,SHOW;

检查流水结束标志

所有花样流完,则从头开始重复流

  SHOW:

将数据送到P1口

 ACALL 

  INC 

DPTR 

取数据表指针指向下一数据

LOOP 

继续查表取数据

R0,#255   

子程序返回

  TAB:

     

下面是流水花样数据表,用户可据要求任意编写

  DB 

11111110B 

二进制表示的流水花样数据,从低到高左移

11111101B

11111011B

11110111B

11101111B

11011111B

10111111B

01111111B

01111111B 

二进制表示的流水花样数据,从高到低右移

11110111B

11111110B

0FEH,0FDH,0FBH,0F7H 

十六进制表示的流水花样数据

0EFH,0DFH,0BFH,7FH

7FH,0BFH,0DFH,0EFH

0F7H,0FBH,0FDH,0FEH

  ……

  DB0FFH 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2