嵌入式开发学习笔记9-做一个好玩的LED闪烁

  • 前言
  • 实际操作
    • 程序功能
    • 实现思路
    • 程序源码
    • 实现效果展示

前言

LED小灯闪烁实质是控制单片机上的I/O口,通过向I/O口循环输入高低电平,从而控制LED小灯的亮灭。但由于单片机的机器周期一般为12/11059200 s,而人眼一般不能识别这种快速转换,因此我们还需要利用定时器实现延时,降低到人眼可识别的闪烁效果,从而实现LED灯闪烁,这就是LED小灯闪烁的基本原理。

实际操作

程序功能

我们需要实现的功能的就是让LED小灯1 s闪烁一次,并且数码管依次显示数字,闪烁10次后打开蜂鸣器报警
在这里面我们主要要用到P1口、定时器0和外部中断1,整体的实现架构如下

实现思路

单片机开发板上的小灯接入了C51上的P1口,因此需要对P1口进行控制,可利用16进制数实现8个LED小灯的控制,此处为了简便,直接实现全亮和全灭,全亮对应16进制为0xFF,对其进行取反即为全灭,循环该过程则实现LED小灯的闪烁。

由于人眼的暂留效果,我们还需要采用定时器对其进行延迟,定时器能定时的最大机器周期为65536,约为71ms,虽然可能能够让我们看到LED闪烁,但是LED闪烁太快,因此我们需要使用多次循环进行扩展。此处为便于计算,选取定时器定时事件为50ms,对应机器周期为46080,因此定时器初值应为19456,对应十六进制为0x4BFD。

基于上述数据,采用函数来封装定时器初始化过程,定时器初始化主要分为三个步骤:
1、定时器工作模式的设置,设置其工作模式为第二种方式,即TMOD=0x01;
2、定时器初始值的设置,设置TH0=0x4B,TL0=0xFD
3、打开定时器,设定TR0=1
由此完成定时器0的设定,在对其进行循环20次,然后再实现对P1口取反,即可实现LED小灯1s闪烁一次,此处需要注意,由于没有使用内部中断T0,因此在定时器溢出后用软件将TF0置0,然后重新设定初值

实现上述功能后,本来任务应该完成了,但是我想着使用一下中断来熟悉一下,因此采用了外部中断1来实现另一个功能:10次闪烁后实现蜂鸣器报警。
实现外部中断的套路和实现定时器的套路差不多:
1、打开中断总开关EA
2、打开外部中断开关EX1
3、设定触发方式,此处设为下降沿触发方式,即IT1=1
由此完成外部中断1的设置,然后在设定外部中断1的服务程序,即满足触发条件后需进入中断执行服务程序,即打开蜂鸣器,循环一次后再关闭(或者可以实现延时一段时间后关闭),此处需要注意的是,在单片机开发板上需要连接P37口与P33口,然后在P3^7口产生一个下降沿来触发中断。
我在里面还加上了一个数码管显示函数,实现方式基本差不多,但是需要你去了解一下数码管的显示原理,此处不再详细说了,之后有时间再开一篇博客来谈谈电路问题

程序源码

#include<reg52.h>sbit DU = P2^6;//段选锁存器
sbit WE = P2^7;//位选锁存器
sbit beep = P2^3;//蜂鸣器
sbit flag = P3^7;//产生下降沿控制进入中断//数码管位置地址     加code存放在R0M区,在执行过程中不会被更改
code unsigned char location[]={0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
//数码管显示内容
code unsigned char nums[]={//0     1     2     3     4    5     6      7     8    9
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,
//A     b     C     d     E    F     G      H     L     N    -
0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 ,0x76, 0x38, 0x37, 0x3E, 0x40 };//外部中断1初始化
void INIT1()
{EA = 1; //开总中断EX1 = 1; //开外部中断1IT1 = 1; //外部中断1下降沿触发
}//外部中断1服务程序
//如果进入中断,蜂鸣器交替工作
void int1() interrupt 2
{beep = ~beep;
}//定时器初始化
void TimerInit()
{TMOD = 0x01; // 设置定时器工作模式TH0 = 0x4B; //(65536-46082) / 256;TL0 = 0xFD; //(65536-46082) % 256; 定时50msTR0 = 1; //打开定时器
}//数码管显示定时器计数时间
//locationInfo--选择显示的数码管位置,从1开始
//numInfo--选择显示的数字,默认显示为0
void Display(unsigned char locationInfo,unsigned char numInfo)
{P0 = 0xFF;//清除断码,单片机处理效果较快,肉眼可能还会混合在上一个P口的值WE = 1; //打开位选锁存器P0 = location[locationInfo-1]; //打开数码管 1111 1110WE = 0; //锁存数据,不受IO口影响DU = 1; //打开段选锁存器P0 = nums[numInfo]; //显示数据 0000 0110DU = 0;
}void main()
{unsigned char msec,sec = 0;//毫秒和秒存储变量TimerInit();P1 = 0x00; //LED亮while(1)//10s一个循环{if(TF0 == 1)//定时器溢出标志{TF0 = 0;//定时器溢出标志位清零TH0 = 0x4B;    //TL0 = 0xFD;msec++; //50ms到if(msec == 20)//1s到{msec = 0;P1 = ~P1;//实现LED灯闪烁Display(2,sec);//默认第二个数码管显示sec++;//1s时间到       }}if(sec == 10) {sec = 0;INIT1();//外部中断1初始化flag = 1;//进入中断flag = 0;//通过P3^7下降沿变化传送到P3^3口--单片机上需要有线连接}}
}

实现效果展示


------------------------以上内容由作者原创,欢迎转载,有疑问下方留言----------------------------------

嵌入式开发学习笔记9-做一个好玩的LED闪烁相关推荐

  1. 嵌入式开发学习笔记6-了解单片机中的特殊功能寄存器(定时器/计数器)

    嵌入式开发学习笔记6-了解单片机中的特殊功能寄存器(定时器/计数器) 定时器/计数器简介 TH与TL TMOD工作模式寄存器 TCON定时器控制寄存器 定时器操作实例 定时器/计数器简介 在单片机中, ...

  2. 嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器B、累加器A和程序状态字PSW)

    嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器.累加器和程序状态字) 累加器A 寄存器B 程序状态字PSW 累加器A 累加器A是ACC(Accumulator)的缩写,累加器A是一个具有特 ...

  3. Polyworks脚本开发学习笔记(七)-完成一个自动化任务

    Polyworks脚本开发学习笔记(七)-完成一个自动化任务 利用之前的命令建立一个自动化脚本 第一步: 设置环境参数 设置注释字体避免出现不兼容中文的乱码,常用微软雅黑 #设置注释字体 VIEW A ...

  4. 龙芯1C300B主板V3.4嵌入式开发学习笔记二

    1 PMON更新 接着笔记一:https://blog.csdn.net/weixin_38709708/article/details/81271493 笔者手中的开发板一开始就烧写了PMON,当是 ...

  5. CAD二次开发学习笔记二(创建一个对话框)

    打开资源视图->右击->添加资源->Dialog 双击对话框,弹出MFC类向导,输入类名FirstClass, 确定,创建对话框类.FirstClass.h与FirstClass.c ...

  6. 龙芯1C300B主板V3.4嵌入式开发学习笔记一

    1 硬件连接,驱动安装,串口访问: 刚拿到板子,打开配套了一条USB转TTL线,电源适配器,备用PMON芯片(?) 问题一:怎么连接USB-TTL线到主板,这里涉及到线的规定 观察转接线的末端,有四条 ...

  7. stm32滴答计时器_STM32嵌入式开发学习笔记(四):使用滴答计时器实现精准计时...

    前面我们讲过,因为在STM32上没有系统时间的接口,因此无法调用sleep函数,在本文中,笔者将利用滴答计时器实现精准延时. 查阅技术手册,滴答计时器依赖于一个SysTick_Type类型寄存器,定义 ...

  8. golang游戏开发学习笔记-创建一个能自由探索的3D世界

    此文写在golang游戏开发学习笔记-用golang画一个随时间变化颜色的正方形之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里,我们将创建一个非常简单(只有三个方块)但能自由探索的的3D世 ...

  9. golang游戏开发学习笔记-开发一个简单的2D游戏(基础篇)

    此文写在golang游戏开发学习笔记-创建一个能自由探索的3D世界之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里我们要创建一个简单的2D游戏场景以及配套的人物,并实现人物运动和碰撞检测功能 ...

最新文章

  1. zabbix trapper方式监控
  2. Hrefer教程【超越官方】
  3. MySQL 数据库常用命令—insert delete update select
  4. matlab-robtics学习笔记
  5. 7-1 输出全排列 (20 分)(全排列+递归+图解)Come Baby
  6. python集合的两种类型_python 入门之 – 集合类型(十九)
  7. AFNetworking 3.0源码阅读 - AFURLResponseSerialization
  8. shell脚本触发java程序传参数
  9. python哪个更强大_Ruby和Python哪个更强大?学习分析
  10. vue父组件变量传递子组件_Vue.js 父组件向子组件传递数据通过 props
  11. 转→js数组遍历 千万不要使用for...in...
  12. Steve Pavlina:如何ASAP找到人生目标?
  13. it书籍分享免费下载
  14. matlab结构地震,结构地震反应解析递推格式的Matlab实现
  15. 联想HINKPAD X220安装MacOS Mojave
  16. 现代电力电子期末考试
  17. 解析HTTPS加密原理
  18. Hadoop 调优之Linux操作系统调优篇
  19. 网站怎么赚钱? 靠流量赚钱吗? 广告吗? 建什么网站赚钱
  20. H.266/VVC的编码结构和块划分

热门文章

  1. Hive Sql中六种面试题型总结
  2. 中国跨境电商现状及发展前景
  3. 一文搞懂PV、UV、VV、IP及其关系与计算
  4. 计算机二级考试公网入口和教育网入口,考试入口
  5. 联想z5 android pie,联想z5成功吃上安卓pie
  6. Shader玉石效果
  7. 利用python做微信公众号标题的词云图
  8. markdown 不等于
  9. Android recyclerview上拉加载更多
  10. 博雅数智|第四次直播|PageRank算法