0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CHANBAEK 来源:Zi Jin Code 作者: 锟酱不是酱 2023-11-02 10:55 次阅读

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

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

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

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

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

图片

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

图片

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

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

图片

现在对程序分析一下

程序框图

图片

首先我们要明白,我们使用的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位定时器的设置流程

以下是程序框图

图片

下面是代码

#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;//设置好初始值后再复位定时器
      }
  }
}

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6014

    文章

    44200

    浏览量

    624976
  • led灯
    +关注

    关注

    22

    文章

    1565

    浏览量

    107213
  • 定时器
    +关注

    关注

    23

    文章

    3195

    浏览量

    112912
  • C51单片机
    +关注

    关注

    11

    文章

    164

    浏览量

    34564
收藏 人收藏

    评论

    相关推荐

    C51单片机实现独立按键点亮LED

    :stc-isp-15xx-v6.85H.exe驱动:ch341ser(适用于win10操作系统)实验部分1C51单片机实现流水灯实验2、美化你的流水灯(自加)3、
    发表于 12-13 06:37

    使用51单片机定时器中断控制LED1S的程序免费下载

    本文档的主要内容详细介绍的是使用51单片机定时器中断控制LED1S的程序免费下载。
    发表于 07-04 17:41 8次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b>定时器中断控制<b class='flag-5'>LED</b><b class='flag-5'>灯</b>亮<b class='flag-5'>1S</b>的程序免费下载

    使用51单片机闪烁LED的代码免费下载

    本文档的主要内容详细介绍的是使用51单片机闪烁LED的代码免费下载。
    发表于 07-03 17:41 2次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>闪烁</b><b class='flag-5'>LED</b><b class='flag-5'>灯</b>的代码免费下载

    使用单片机实现不同频率闪烁1LEDC语言程序实例免费下载

    本文档的主要内容详细介绍的是使用单片机实现不同频率闪烁1LED
    发表于 11-06 17:11 9次下载
    使用<b class='flag-5'>单片机</b><b class='flag-5'>实现</b>不同频率<b class='flag-5'>闪烁</b><b class='flag-5'>1</b>个<b class='flag-5'>LED</b><b class='flag-5'>灯</b>的<b class='flag-5'>C</b>语言程序实例免费下载

    C语言||利用C51单片机编程实现转向实验

    实验内容:单片机P1口控制转向实验:有51单片机,三个开关(K0,K1,K2),两组
    发表于 11-12 12:21 8次下载
    <b class='flag-5'>C</b>语言||利用<b class='flag-5'>C51</b><b class='flag-5'>单片机</b>编程<b class='flag-5'>实现</b>转向<b class='flag-5'>灯</b>实验

    【Practical】51单片机软件延时1S

    51单片机软件延时1S
    发表于 11-12 14:51 13次下载
    【Practical】<b class='flag-5'>51</b><b class='flag-5'>单片机</b>软件延时<b class='flag-5'>1S</b>

    51单片机如何延时1s,让LED闪烁

    精确地延时1s需要准确地计算,粗略地延迟1s可以自定义一个delay函数,下面我们让第一个LED延迟1s
    发表于 11-18 15:06 11次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>如何延时<b class='flag-5'>1s</b>,让<b class='flag-5'>LED</b><b class='flag-5'>灯</b><b class='flag-5'>闪烁</b>

    STM32和C51单片机实现程序设计与仿真测试(LED闪烁

    STM32和C51单片机实现程序设计与仿真测试(LED闪烁
    发表于 11-20 11:36 24次下载
    STM32和<b class='flag-5'>C51</b><b class='flag-5'>单片机</b><b class='flag-5'>实现</b>程序设计与仿真测试(<b class='flag-5'>LED</b><b class='flag-5'>闪烁</b>)

    c51单片机——led的初步学习

    #让亮起来下面的代码可以让51单片机上的亮起#include <reg52.h>sbit led P2^0;void mai
    发表于 11-21 10:06 10次下载
    <b class='flag-5'>c51</b><b class='flag-5'>单片机</b>——<b class='flag-5'>led</b><b class='flag-5'>灯</b>的初步学习

    51单片机如何跳出wile循环_51单片机闪烁LED

    闪烁LED 51单片机是较为简单的8位单片机,意思是一次能处理8位2进制数据。这一
    发表于 11-23 10:06 21次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>如何跳出wile循环_<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>闪烁</b><b class='flag-5'>LED</b><b class='flag-5'>灯</b>

    单片机led闪烁实验总结_Linux下单片机开发2(C51):LED闪烁

    :/**************************************************************************************然后make 代码没有什么问题就写入单片机中效果如下LED
    发表于 01-17 10:51 2次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>led</b><b class='flag-5'>灯</b><b class='flag-5'>闪烁</b>实验总结_Linux下<b class='flag-5'>单片机</b>开发2(<b class='flag-5'>C51</b>):<b class='flag-5'>LED</b><b class='flag-5'>闪烁</b>

    51单片机使用C语言点亮闪烁LED

    下面是点亮51单片机使用C语言闪烁LED的的一段代码,也是我们迈入
    的头像 发表于 08-16 08:59 1.2w次阅读

    基于89C51单片机的不同频率闪烁1LED源程序

    基于89C51单片机的不同频率闪烁1LED源程序
    发表于 05-16 09:44 9次下载

    基于89C51单片机的不同频率闪烁多个LED源程序

    基于89C51单片机的不同频率闪烁多个LED源程序
    发表于 05-16 09:43 2次下载

    使用51单片机实现延时控制LED闪烁

    这篇文章我们讲解使用51单片机控制LED闪烁。那么为了方便理解,我们要从最基础的讲起。闪烁
    发表于 07-11 11:39 4774次阅读
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>实现</b>延时控制<b class='flag-5'>LED</b><b class='flag-5'>灯</b><b class='flag-5'>闪烁</b>