基于C51单片机实现LED灯1s闪烁

发布时间:2024-03-20  

C51使用的晶振频率是11.0592MHz一颗LED灯接在C51的P0.0,现在要求设计程序,让这颗LED灯以1s为间隔闪烁。


我们不只是设计程序,更要对这个单片机项目分析一下


顺便看看这道题的难度~~~~~~~~~~~


顺带一提,本节课要用到单片机定时器》》看我上一篇文章,详细介绍定时器


设计一个电路图,单片机用80C52RC,晶振11.0592MHz,一颗LED接在P0.0


535b78d97ebb595471abd37010f0fdcb_wKgaomVDDs-AX4Z-AAJ8DpvdvCI842.jpg

这里说明一下,C51的IO只支持弱上拉,这就意味着单片机的IO上拉的时候只能提供很弱小的电流,这个电流可能不足以点亮一颗LED灯(或者这颗LED灯的亮度很低),为了让LED正常发光,我们使用上拉的方法。这里简单介绍一下使用方法哈

194d5daa1762b0dfd0626c637243c64f_wKgZomVDDs-AZnFXAABHppr1zbQ096.jpg

当P0.0低电平的时候LED灯导通,正常点亮,P0.0给高电平的时候LED不导通,熄灭


考虑到手头的资源问题,我使用现成的开发板来完成这个程序设计,这个开发板使用的是上拉LED,LED1接在P1.0,实际电路图修改后如下:

d1eba55d7fc788cf66b0af6a497893f1_wKgaomVBx7SABco-AADHqvUpCvE716.jpg

现在对程序分析一下


程序框图


111d48747cebc57998a18a912f7f525a_wKgZomVDDs-AODMjAAE32iA-mZ0238.jpg

首先我们要明白,我们使用的LED是上拉模式的,P1.0 = 1的时候关闭LED,P1.0 = 0的时候点亮LED


既然要控制LED,这里就讲一下方法


三条特殊的指令


sfr P0 = 0x80;

这条指令存放在reg52.h里面,已经对IO组的寄存器的地址进行定义,像P0,P1,P2这些关键字我们可以直接用。方便我们对IO的寄存器进行操作,值得一提的是,IO寄存器是可以位寻址


sbit LED = P1^0

sbit指令给IO上的一个端口定义名字,比如说给P1.0(写作P1^0)定义一个叫LED的名字,下次对这个IO进行操作的时候用以下方法


sbit LED = P1^0;//这是前面的定义



LED= 1;//给P1.0IO写高电平

LED= 0;//给P1.0IO写低电平电平

此外,还可以直接对整个IO组进行操作,方法


那么,接下来就是程序了


【1】软件延迟实现


所谓的软件延迟,就是通过执行空代码,实现延迟的效果,这种延迟实现的延迟有一个特点,时间不准,因为单片机里面每次执行C语言下的一条操作的时间是不固定的


程序如下


#include< reg52.h >



sbit LED = P1^0;



void delay(unsigned int xms)  //调用时需提供参数xms的实际值。

{

  unsigned int i,j;   //定义无符号整型变量i、j

  for(i=0; i< xms; i++)  //后面没带";",下一条语句是循环体。参数xms延时x毫秒。

      for(j=0; j< 110; j++);  //后面带";",表示这个for语句的循环体是空语句。

}//这个值得学习,这里的代码是延迟代码



void main ()

{

  LED = 1;//先关闭LED灯


  while(1)

  {

    LED = !LED;//LED状态取反

    /*

    这里说明一下取反

    取反用“!”

    取反前,LED = 1,取反后,LED = 0

    */

    delay(1000);//软件延迟1000ms = 1s

  }

}


这就是效果了,怎么样,还可以吧,但是……


题目要求我们延迟1s,如此精确的提到1s,肯定是希望我们用定时器来完成这个项目


我想,用软件延迟,老师应该会给特别低的分数,而且也体现不出我们的能力


下面我们用定时器完成这一道题


关于定时器的用法


#include< reg52.h >

void main()

{//注意设置定时器初始值要在main函数里面设置



  TMOD = 0x01;


  /*设置定时器模式寄存器TMOD为 0000 0001

  GATE = 0

  C/T = 0

  M1 =0

  M0 = 1

  标准16位定时器

  */


  //先设置定时器初始值

  TL0 = 0x3A;//设置定时器初始值低位

  TH0 = 0x8E;//设置定时器初始值高位


  TR0 = 0;//记得一定要设置定时器开启


  while(1)

  {

    if (TF0 == 1)

      {//这里可以先放下你的定时器计时满了以后要执行的代码


       //溢出后你需要先给你的定时器再次设置初始值

        TL0 = 0x3A;//设置定时器初始值低位

        TH0 = 0x8E;//设置定时器初始值高位


        TF0 = 0;//设置好初始值后再复位定时器

      }

  }

}

我们要设置一个标准的16位定时器,设置方法和流程参考我写过的文章,上面是16位定时器的设置流程


以下是程序框图


0748eaa5ef138fd13182266f31113094_wKgaomVDDs-AOCBNAAFlVYYQ_qA721.jpg

下面是代码


#include< reg52.h >



sbit LED  = P1^0;

unsigned char counter = 0;



void main()

{//注意设置定时器初始值要在main函数里面设置

  TMOD = 0x01;

  /*设置定时器模式寄存器TMOD为 0000 0001

  GATE = 0

  C/T = 0

  M1 =0

  M0 = 1

  标准16位定时器

  */


  //先设置定时器初始值

  TL0 = 0x4B;//设置定时器初始值低位

  TH0 = 0xF5;//设置定时器初始值高位

  TR0 = 1;//记得一定要设置定时器开启



  while(1)

  {

    if (TF0 == 1)

      {

        counter++;

          if(counter >200)

          {

            counter = 0;

            LED = !LED;

          }

        TL0 = 0x4B;//设置定时器初始值低位

        TH0 = 0xF5;//设置定时器初始值高位

        TF0 = 0;//设置好初始值后再复位定时器

      }

  }

}

图片

图片


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    在实际工程中共阴极二极管比共阳极二极管的线路复杂,共阳极不需要那么多的高电平线路驱动。 二、单个LED闪烁 2.1 KEIL文件的建立 具体的keil工程文件创建可以参考[1]中的过程。 2.2 LED闪烁程序 #include......
    ;/************************************************************************************** *               LED闪烁实验   * 实现现象:下载程序后D1指示灯闪烁 注意事项:无......
    面需立即触发继电器动作,使纺纱机器停止运转,另一方面控制LED灯闪烁,提醒工人进行处理。 3 系统软件设计 3.1 软件设计思路 系统的软件设计采用C语言,可以大大提高程序编写时的效率。软件......
    51单片机学习:LED闪烁实验;实验名称:LED闪烁实验接线说明:实验现象:下载程序后“LED模块”的D1指示灯闪烁......
    需要在一个名为“Keil uVision2”的软件中汇编完成,汇编后得到一个*.hex文件,这就是目标文件,然后用编程器将该文件“写”到单片机89s51中,这样该89s51就具有自动控制小灯闪烁的功能了。 在实......
    视看纵向为东西,从左边斜着看和实物是一样的。因此,实物和仿真是一一对应的! 加载“基于毕业51单片机的交通灯设计.hex”文件到单片机,点击运行,交通灯开始工作(二极管显示红、黄、绿三色灯,LED显示......
    闪烁5次后亮红灯,东西向绿灯亮,如此往复。请用单片机设计其控制系统并调试运行。 电路原理图 元件清单 C语言程序 #include  //包含头文件reg51.h,定义51单片机......
    ISP_CONTR中“SWRST”置1来进行软件复位。要说明的是这里的软件复位是真正意义上的复位,同硬件复位的效果一模一样。 在main函数中,初始化外部中断后进行LED灯闪烁一阵时间,然后进入while(1)死循......
    51单片机制作简易电风扇定时控制器;自己的床头风扇的机械定时器坏掉了,准备51单片机给设计了一个.程序在实验板初步调试通过,等待元件寄到就可以做板子了,只是有点浪费单片机的资源。 一,设计......
    51单片机上实现的交通灯程序;  这是我前几天无聊自己写的交通灯程序,在51单片机上实现的。基本的定时的交通灯转换是实现了,根据时间来改变交通灯的变换。可以下载下来看看的,电路图和原程序都有,代码......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>