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

本文介绍了如何使用C51单片机实现LED小灯1秒闪烁一次,并在闪烁10次后通过外部中断1触发蜂鸣器报警。文章详细阐述了控制LED闪烁的原理,包括利用定时器延时和对P1口的操作,以及外部中断1的设置和服务程序。此外,还提到了数码管显示功能的实现。
摘要由CSDN通过智能技术生成

嵌入式开发学习笔记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[
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值