51单片机--LED闪烁、流水灯的简单试验

发布者:创新思绪最新更新时间:2020-04-15 来源: eefocus关键字:51单片机  LED闪烁  流水灯 手机看文章 扫描二维码
随时随地手机看文章

一、LED闪烁 

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

LED闪烁的简单试验     *****************************************************************/

include    //此文件中定义了51的一些特殊功能寄存器

/*******延时函数**************************************/

// 定义一个演示函数,定时时间大概为一个ms。

 

void delay(unsigned int i)

{

    unsigned char j;

    for(i; i > 0; i--)   

        for(j = 100; j > 0; j--);

}

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

main()

    while(1)

  { 

  P2  = 0x00;       //置P2口为低电平    led灯点灭

  delay(1000);      //调用延时程序   led持续灭,保持

  P2  = 0xff;      //置P2口为高电平   led灯熄亮

  delay(1000);     // 调用延时程序   led持续亮,保持

 //重复以上语句, led灯点亮,保持亮的状态,熄灭,保持熄//灭状态   循环这个4个过程。

 }

}

 

/*  */作用,它是用来注释一段内容的,编译器不对其进行编译,只要在/*  */直接的内容都被注释掉。


// 是用来注释其后面的内容,只能注释一行。


#include //这句告诉我们包涵51的头文件,头文件放的是什么东西,放的是51单片机对应的操作的寄存器地址,如我们直接用来操作的P1口就是代表0x90地址,我们可以将光标低位在上然后右键 


打开头文件,


#ifndef __REG51_H__

#define __REG51_H__

 

/*  BYTE Register  */

sfr P0   = 0x80;

sfr P1   = 0x90;

sfr P2   = 0xA0;

sfr P3   = 0xB0;

sfr PSW  = 0xD0;

sfr ACC  = 0xE0;

…………………………….

/*  SCON  */

sbit SM0  = 0x9F;

sbit SM1  = 0x9E;

sbit SM2  = 0x9D;

sbit REN  = 0x9C;

sbit TB8  = 0x9B;

sbit RB8  = 0x9A;

sbit TI   = 0x99;

sbit RI   = 0x98;

#endif

头文件中定义了51系列单片机的所有功能寄存器,我们直接使用其代号就可以,P0,P1等


如 sfr P0=0x80,意思是把单片机内部地址0x80处的寄存器重新起名字叫P0,以后我们在程序中直接操作P0,就相当于对单片机内部0x80地址处的寄存器进行操作。通俗的讲,也就是说,通过sfr这个关键字,让Keil编译器在单片机与人之间搭建一个桥梁,我们操作P0口,单片机对应就去操作内部0x80的地址。所以我们写程序要在开始处直接包涵单片机的头文件。


sbit  SM0  = 0x9F;是定义位操作地址0x9F的,这个地址只代表一个位。我们操作SM0,对应单片机就是操作位地址0x9F。


总结起来sfr与sbit区别


sfr 是定义字节的  8位


sbit 是定义位的   1位


我们在返回主程序:


void delay(unsigned int i)


{


    unsigned char j;


    for(i; i > 0; i--)  


        for(j = 100; j > 0; j--);


}


定义一个函数delay();与c语言一样,要用一个函数,先定义,我们可以叫它子函数,可以调用的。


main()  // 结构同c语言一样,main()函数开始


{  // 大括号。


  P2  = 0x00; //置P2口为低电平


从这句开始,你现在控制单片机了,告诉单片机把你的P2口都输出0,如果你不操作P2口了,那么P2口一直保持这个状态,直到你去改变它。


delay(1000); //调用延时程序


调用子函数delay(),告诉单片机去执行delay那个函数,那么P2口一直保持0这状态。


P2  = 0xff; //置P2口为高电平


这时告诉P2口全部输出1,(0xff=1111 1111).转太有0变成1了,对应的灯的输出也由低电平变成高电平了


delay(1000); // 调用延时程序,再进行延时,


}


这个程序里执行完了一次又干什么呢,


Keil编译器会编译成一直重复执行main()函数里面的代码,整个代码的效果就是:


1)P2输出低电平


2)延时一段时间,目的是P2输出的低电平保持一段时间


3)P2输出高电平


4)延时一段时间,目的是P2输出的高电平保持一段时间


5)重复1)到4)的过程   实际效果就是led一闪一闪


通过更改delay(延时时间t),参数t,可以改变闪烁频率。


实际操作:


打开软件(提前装好驱动)

点击打开文件,打开我们刚刚编译的led.hex文件,下载程序,就会看到led闪烁。

二、流水灯的简单试验

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

流水灯

延时实现P2口LED流水灯效果 (用循环移位指令)

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

#include             //此文件中定义了51的一些特殊功能寄存器

void delay(unsigned int i)     // 延时子程序

{

    unsigned char j;

    for(i; i > 0; i--)   

        for(j = 100; j > 0; j--);

}

main()

{

unsigned char LED;

LED = 0xfe;               //0xfe = 1111 1110 此时,led灯的最低一位亮

  while(1)

{

    P2 = LED;

delay(300);

LED = LED << 1;      //循环左移1位,点亮下一个LED "<<"为左移位

if(P2 == 0x00 )

  {LED = 0xfe;  }    // 0xfe = 1111 1110

    }

}

 

代码注释:


void delay(unsigned int i)    // 延时子程序

{                        

    unsigned int i;  //定义一个无符号变量i,16位宽度,最大可表示二进制1111 1111 1111 1111,对应十进制是65535共计65536个数,从0开始。

      for(i; i > 0; i--)   //传过来的参数进行自减,只要不为0就执行循环里的参数,执行一次减1,直到i变为0,跳出循环

    {

        for(j = 100; j > 0; j--); //i=0开始,判断i是否>0,不是的话,j自动减1,之后再判断i是否>0,直到i<=0,跳出for 循环。整个延时子程序 每次调用都要执行i*100个for 循环。由于c语言编译的结果时间不确定,不是很精确,这里暂不计算时间。

    }  }

unsigned char LED;    //定义一个无符号8位变量。

LED = 0xfe;           //0xfe = 1111 1110   把刚刚定义的变量赋值

while(1)            // 无限循环以下程序

    {

         P2 = LED;         //  第一次吧0xfe送给P2口,那么最低位连接的led点亮

         delayms(300);     //延时,就是上一个语句状态保持一段时间

         LED = LED << 1;    //循环左移1位,点亮下一个LED "<<"为左移位

        if(P2 == 0x00 )         //判断P2的值,是否都为0,如果都为0的话就要重新赋值

{LED = 0xfe;  }    // 0xfe = 1111 1110

       }

以上程序实现led依次亮,循环执行。


以下是我们的硬件电路,led从D11~D18,排阻RP20和RP21。

元器件介绍:


排阻:


一般在排阻上都标有阻值号,其公共端附近也有明显标记。如下下图表示为472,表示47*(10^2)=4700欧姆,

还有的标号如3R0,表示阻值为3欧姆, 4K7表示阻值为4.7kΩ, R002表示阻值为0.002欧姆。


(2)发光二极管。它具有单向导电性,通过5mA左右电流即可发光,电流越大,其亮度越强,但若电流过大,会烧毁二极管,一般我们控制在3 mA-20mA之间。在这里,给发光二极管串联一个电阻的目的就是为了限制通过发光二极管的电流不要太大,因此这个电阻又称为“限流电阻”。当发光二极管发光时,测量它两端电压约为1.7V,这个电压又叫做发光二极管的“导通压降”。图2.2.9和图2.2.10分别为直插式发光二极管和贴片式发光二极管实物图。发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极。直插式发光二极管长脚为阳极,短脚为阴极。仔细观察贴片式发光二极管正面的一端有彩色标记,通常有标记的一端为阴极。

                 

关于排阻大小的选择:欧姆定律想必大家都清楚,U=IR,当发光二极管正常导通时,其两端电压约为1.7V,发光管的阴极为低电平,即0V,阳极串接一电阻,电阻的另一端为Vcc , 为5V,因此加在电阻两端的电压为5V-1.7V=3.3V,计算穿过电阻的电流,3.3 V/ 1000Ω=3.3mA


即穿过发光管的电流也为3.3mA,若想让发光管再亮一些,我们可以适当减小该电阻。


看我们的原理图,可以知道:LED的正极接在VCC上,只要给了低电平,那么LED就会亮,低电平对应到单片机的逻辑就是0,只要单片机的某一个管脚输出0,那么对应的发光二极管就会亮。

关键字:51单片机  LED闪烁  流水灯 引用地址:51单片机--LED闪烁、流水灯的简单试验

上一篇:51单片机实现呼吸灯
下一篇:单片机流水灯简单C语言代码--位操作和字操作

推荐阅读最新更新时间:2024-11-02 19:10

51单片机定时器中断设计电子钟
把前天设计的时钟的功能补全了一些,贴上来, #include reg52.h #define uchar unsigned char sbit rd=P2^6; sbit wr=P2^5; sbit lcde=P2^7; sbit k1=P1^0; sbit k2=P1^1; sbit k4=P1^3; sbit k8=P1^7; uchar code table1 = 2011-11-05 ; uchar code table2 = 00:00:00 ; uchar code table3 ={{ MON },{ TUE },{ WED },{ THU },{ FRI },{ SAT },{ SUN }};
[单片机]
51单片机实现爱心跑马灯程序
本人闲来无事做,见实验室的小伙伴用LED等做了一个跑马灯,顿时引来了一大群妹子,当时就不服了,哼,不就是一个流水灯,说的跟谁不会一样 制作的是32个LED灯的爱心流水灯,至于灯怎么安放,我就不多说了,关键是怎么连接布线。 由于条件有限,没有制作PCB的工具,所以就用的洞洞板,32个LED共阴极,连接在51单片机的GND上,每个LED的正极分别连接单片的一个引脚, 我的所有线路全是用电烙铁焊接的,线路丑爆了,在此就不上图了,为了后续程序好写一点,LED的正极和单片机的引脚的连线最好多考虑一下 好了,废话不多说了,直接上代码,只做了几个动画,可以按照自己的想法再添加 #include reg52.h #inclu
[单片机]
基于51单片机设计的比例电磁铁控制技术
引言   比例电磁铁作为执行元件,是机电一体化的关键产品之一,广泛应用于各种自动化控制系统中;比例电磁铁的推力大,结构简单,维护方便,成本低廉,是应用非常广泛的电—机械转换器 ;比例电磁铁的特性及工作的可靠性,对于整个控制系统具有十分重要的影响,是决定控制系统品质的关键部件之一。比例电磁铁作为电—机械转换元件,其功能是将比例控制放大器输给的电流信号,转换成位移或者力信号输出。   比例电磁铁适用于直流电压为24 V比例控制放大器的控制线路中,作为连续地、按比例地控制系统执行元件的运动、速度和方向的动力元件。比例电磁铁在其额定行程范围内的推力与通入其线圈的电流成正比,可在其他需要作用力自动控制的装置上作为线性动力元件,如自动油门
[单片机]
基于<font color='red'>51单片机</font>设计的比例电磁铁控制技术
PIC16F785 LED流水灯程序
#include p IC .h __CONFIG(0x33f4); //看门狗关,复位脚做复位,内部RC振荡,RA4/RA5做I/O //------------------------------------ //延时函数 void delay() { int i; //定义循环变量 for(i=5000;i 0;i--) //循环次数控制 { NOP(); //消耗一个指令 周期 时间 NOP(); } } //------------------------------------ //初始化函数 void init() { TR ISA
[单片机]
51单片机实验15:DS1302时钟模块应用
开发板DS1302模块电路图如下: 目的:单片机查询DS1302时钟模块时间,并将其显示在数码管上。 DS1302的初始化时间为2019年1月1日12:00(星期二) #include reg52.h #include dse1302.h sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; uc code x ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uc tim ; void delay(uc x) { uc i,j; for(i=1;i =x;i++) for(j=1;j =110;j++);
[单片机]
<font color='red'>51单片机</font>实验15:DS1302时钟模块应用
学习51单片机有关晶振的问题总结
  今天笔者把自己当年学习51单片机有关晶振的问题一并总结出来,希望对初学51的童鞋来说能有帮助。   一、为什么51单片机爱用11.0592MHZ晶振?   其一:因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(19600,19200),不管多么古怪的值,这些晶振都是准确,常被使用的。   其二:用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特
[单片机]
详细LCD1602串行或者并行数据传输51单片机程序
单片机串行源程序如下: #include reg52.h #include intrins.h //LCD1602接口定义 #define LCD_DATA P1 //P1口(P14~P17)与LCD高四位(D4~D7)对应相接 sbit LCD1602_RS=P1^2; //数据指令 sbit LCD1602_EN=P1^3; //使能 //延时函数,12mhz 6t延迟时间10*255us void LCD_init(void); void LCD_en_write(void); void LCD_write_command(unsigned char comma
[单片机]
51单片机教程:单片机寻址方式与指令系统
通过前面的学习,我们已经了解了单片机内部的结构,并且也已经知道,要控制单片机,让它为我们干学,要用指令,我们已学了几条指令,但很零散,从现在开始,我们将要系统地学习8051单片机的指令部份。 一、概述 1、指令的格式 我们已知,要让计算机做事,就得给计算机以指令,并且我们已知,计算机很“笨”,只能懂得数字,如前面我们写进机器的75H,90H,00H等等,所以指令的第一种格式就是机器码格式,也说是数字的形式。但这种形式实在是为难我们人了,太难记了,于是有另一种格式,助记符格式,如MOV P1,#0FFH,这样就好记了。 这两种格式之间的关系呢,我们不难理解,本质上它们完全等价,只是形式不一样而已。 2、汇编 我们写指令使用
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved