蓝桥杯--单片机--LED程序设计

LED电路图

在这里插入图片描述

74HC573锁存器

由LED电路图可以看出,LED并不是直接连接在单片机的IO口进行控制,而是通过74HC573锁存器间接控制。

锁存器左端输入端 D1~D7连单片机的P00-P07口,右端输出端Q1-Q2连八个共阳LED灯。

当锁存使能输入端(LE)输入高电平时,锁存器处于非锁存状态,即输入口Dx和输出口Qx电位一致;反之,锁存器处于锁存状态,Qx不受Dx控制。

74HC02或非门电路

在这里插入图片描述

由图可知,74HC02或非门电路控制Y4C,当输入端Y4和WR电平改变时,Y4C的电平随之改变。

  • 真值表
    在这里插入图片描述

74HC138译码器

在这里插入图片描述三个输入端控制八个输出端
在这里插入图片描述要使Y4输出低电平,则P25=0,P26=0,P27=1

程序设计:

使用前将J13调整为IO模式(2,3)脚短接
在这里插入图片描述

  • 关闭外设
    (有时一开机,单片机可能出现灯亮或者蜂鸣器响的情况,所以要关闭外设。)
// 关闭外设
void Cls_Peripheral(void)
{
P0 = 0xff;                             //关闭LED
P2 = P2 & 0x1f | 0x80;                 //P2高三位P27~P25清零,之后再给其赋值100,LED锁存器
P2 &= 0x1f;                            //高三位清零,关闭LED锁存器,释放P0口

P0 = 0;                                //关闭蜂鸣器
P2 = P2 & 0x1f | 0xA0;                 //P2高三位清零,然后再赋值101,蜂鸣器锁存器(Y5)
P2 &= 0x1f;                            //关闭蜂鸣器锁存器
}
  • LED显示
//LED显示
void Led_Disp(unsigned char ucLed)
{ 
  P0 = ~ucLed;
  P2 = P2 & 0x1F | 0x80;			// P27~P25清零,然后给其赋值,打开LED锁存器
  P2 &= 0x1F;						// P27~P25清零
}
  • 延时函数
// 延时函数(最小约1ms@12Mhz)
void Delay(unsigned int num)
{
 unsigned int i;
 while(num--)
   for(i=0; i<628; i++);
}
  • 主函数
void main(void)
{
  unsigned char i, j;

  Cls_Peripheral();             //调用函数,关闭外设,LED灯灭,蜂鸣器不响。

  while(1)
  { // 4个亮度等级
    for(i=0; i<4; i++)
      for(j=0; j<100; j++)
      {
        Led_Disp(0xff);      //调用函数->形参ucled=0xff->现象:LED全亮
        Delay(i+1);             //延时i+1,期间ucled值不变,led状态不变。
        Led_Disp(0);            //调用函数->形参ucled=0x00->现象:LED全灭
        Delay(4-i);             //延时4-i,期间ucled值不变,led状态不变。
      }
  }
}
  • 整体函数
// 使用程序前,将J13调整为IO模式(2,3脚短接)
#include "reg52.h"
// #include "absacc.h"
// 关闭外设
void Cls_Peripheral(void)
{ // IO模式(J13-2和J13-3相连)
 P0 = 0xFF;
 P2 = P2 & 0x1F | 0x80;			
 P2 &= 0x1F;						
 P0 = 0;
 P2 = P2 & 0x1F | 0xA0;			
 P2 &= 0x1F;						
//XBYTE[0x8000] = 0xFF;				// MM模式(J13-2和J13-1相连)
//XBYTE[0xA000] = 0;
}
// LED显示
void Led_Disp(unsigned char ucLed)
{ // IO模式(J13-2和J13-3相连)
 P0 = ~ucLed;
 P2 = P2 & 0x1F | 0x80;			
 P2 &= 0x1F;						
//XBYTE[0x8000] = ~ucLed;		// MM模式(J13-2和J13-1相连)	
}
//延时函数
void Delay(unsigned int num)
{
 unsigned int i;
 while(num--)
   for(i=0; i<628; i++);
}
//主函数
void main(void)
{
 unsigned char i, j;

 Cls_Peripheral();

 while(1)
 { // 4个亮度等级
   for(i=0; i<4; i++)
     for(j=0; j<100; j++)
     {
       Led_Disp(0xff);
       Delay(i+1);
       Led_Disp(0);
       Delay(4-i);
     }
 }
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值