前言
接着上一篇蜂鸣器与继电器,我们这次来说说LED,相对来说比较简单。
一、蓝桥杯板的LED
蓝桥杯板子上的LED是由74HC573控制的LED的正极外接1k电阻接VCC,控制信号为低电平,LED就点亮,要注意的是74HC573由Y4引脚控制。
二、程序
1.引入头文件
本小节头文件与上一节的相同。
#include "stc15f2k60s2.h"
#include "absacc.h"
2.函数定义
代码如下:
//IO模式,控制外部设备,蜂鸣器和继电器
void externaldevie_IO(unsigned char beep,unsigned char relay);
//MM模式,控制外部设备,蜂鸣器和继电器
void externaldevie_MM(unsigned char beep,unsigned char relay);
void delay_ms(unsigned char delay);//延时函数————ms
void LED_IO(unsigned char LEDdata);//IO模式,控制LED
void LED_MM(unsigned char LEDdata);//MM模式,控制LED
延时函数以及LED函数。
3.主程序
代码如下:
void main(void)
{
//实现LED流水灯
unsigned char i=0;
while(1)
{
externaldevie_IO(0,0); //关闭蜂鸣器与继电器
LED_IO(~(0x01<<i)); //LED左移一位
delay_ms(50);
i++;
if(i==8)i=0;
}
}
这里实现的是每隔一段时间,首先关闭蜂鸣器与继电器,防止干扰,然后LED左移一位,LED是低电平电亮,所以给它取反一下。由于i是char型变量,所以增加一个if判断,使得i==8时,i=0,流水灯回到起始点。
4.函数编写
代码如下:
//IO模式,控制外部设备,蜂鸣器和继电器
void externaldevie_IO(unsigned char beep,unsigned char relay)
{
unsigned char extdev=0;
if(beep) extdev |= 0x40;//蜂鸣器
if(relay) extdev |= 0x10;//继电器
EA = 0;//关闭中断总使能
P0 = extdev;
P2 = (P2 & 0x1f) | 0xa0;//作用,使138译码器Y5输出低电平,573的LE为高电平
P0 = extdev;
P2 = P2 & 0x1f; //作用,使138译码器Y5输出高电平,573的LE为低电平,573数据锁存
EA = 1;//打开中断总使能
}
//MM模式,控制外部设备,蜂鸣器和继电器
void externaldevie_MM(unsigned char beep,unsigned char relay){
unsigned char extdev=0;
if(beep) extdev |= 0x40;//蜂鸣器
if(relay) extdev |= 0x10;//继电器
EA = 0;//关闭中断总使能
XBYTE[0xA000]=extdev; //需要用到 absacc.h 头文件
P2 = P2 & 0x1f;
EA = 1;//打开中断总使能
}
void delay_ms(unsigned char delay)//延时函数————ms
{
unsigned char i,j;
while(delay--)
for(i=100;i>0;i--)
for(j=100;j>0;j--);
}
void LED_IO(unsigned char LEDdata)//IO模式,控制LED
{
EA = 0;//关闭中断总使能
P0 = LEDdata; //保险起见,给P0送两次数据
P2 = (P2 & 0x1f) | 0x80; //打开Y4
P0 = LEDdata;
P2 = P2 & 0x1f; //关闭Y4
EA = 1;//打开中断总使能
}
void LED_MM(unsigned char LEDdata)//MM模式,控制LED
{
EA = 0;//关闭中断总使能
XBYTE[0x8000]=LEDdata;
P2 = P2 & 0x1f;
EA = 1;//打开中断总使能
}
LED_IO中有一个参数,用于给P0口赋值LEDdata应该为0xxx的形式来控制8个LED。
注意:函数中的EA使能可以看情况添加,有时候添加了可能会让蜂鸣器、继电器或者LED失灵。
5.完整程序
代码如下:
#include "stc15f2k60s2.h"
#include "absacc.h"
//函数定义/
void externaldevie_IO(unsigned char beep,unsigned char relay);
//IO模式,控制外部设备,蜂鸣器和继电器
void externaldevie_MM(unsigned char beep,unsigned char relay);
//MM模式,控制外部设备,蜂鸣器和继电器
void delay_ms(unsigned char delay);//延时函数————ms
void LED_IO(unsigned char LEDdata);//IO模式,控制LED
void LED_MM(unsigned char LEDdata);//MM模式,控制LED
///主程序/
void main(void)
{
//实现以秒为间隔,LED流水灯
unsigned char i=0;
while(1)
{
externaldevie_IO(0,0);
LED_IO(~(0x01<<i)); //LED全灭
delay_ms(50);
i++;
if(i==8)i=0;
}
}
/函数编写//
void externaldevie_IO(unsigned char beep,unsigned char relay)
//IO模式,控制外部设备,蜂鸣器和继电器
{
unsigned char extdev=0;
if(beep) extdev |= 0x40;//蜂鸣器
if(relay) extdev |= 0x10;//继电器
EA = 0;//关闭中断总使能
P0 = extdev;
P2 = (P2 & 0x1f) | 0xa0;//作用,使138译码器Y5输出低电平,573的LE为高电平
P0 = extdev;
P2 = P2 & 0x1f; //作用,使138译码器Y5输出高电平,573的LE为低电平,573数据锁存
EA = 1;//打开中断总使能
}
void externaldevie_MM(unsigned char beep,unsigned char relay)
//MM模式,控制外部设备,蜂鸣器和继电器
{
unsigned char extdev=0;
if(beep) extdev |= 0x40;//蜂鸣器
if(relay) extdev |= 0x10;//继电器
EA = 0;//关闭中断总使能
XBYTE[0xA000]=extdev; //需要用到 absacc.h 头文件
P2 = P2 & 0x1f;
EA = 1;//打开中断总使能
}
void delay_ms(unsigned char delay)//延时函数————ms
{
unsigned char i,j;
while(delay--)
for(i=100;i>0;i--)
for(j=100;j>0;j--);
}
void LED_IO(unsigned char LEDdata)//IO模式,控制LED
{
EA = 0;//关闭中断总使能
P0 = LEDdata;
P2 = (P2 & 0x1f) | 0x80;
P0 = LEDdata;
P2 = P2 & 0x1f;
EA = 1;//打开中断总使能
}
void LED_MM(unsigned char LEDdata)//MM模式,控制LED
{
EA = 0;//关闭中断总使能
XBYTE[0x8000]=LEDdata;
P2 = P2 & 0x1f;
EA = 1;//打开中断总使能
}
总结
这是关于蓝桥杯LED的一些代码及思路,相对来说比较简单,需要注意的就是LED是用低电平点亮的。