栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【LED指示灯的一般控制】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【LED指示灯的一般控制】

51单片机(国信天长单片机实训平台)基于keli的常用程序之 LED指示灯一般控制程序设计

文章目录
  • 51单片机(国信天长单片机实训平台)基于keli的常用程序之 LED指示灯一般控制程序设计
  • 前言
  • 一、国信长天单片机竞赛实训平台的电路图与分析
    • 1.观察电路图
    • 2.编写程序
  • 二、编写程序步骤
    • 1.编写一般性程序(主程序,延时程序,关闭外设程序)
    • 2.编写控制LED灯函数
    • 3.编写延时函数Delay
    • 4.编写关闭外设函数
    • 5.完善整体函数
  • 总结

前言

实验目的:让8路LED灯同时闪三次,再依次点亮LED灯,再依次熄灭

一、国信长天单片机竞赛实训平台的电路图与分析


国信长天单片机竞赛实训平台电路图

38译码器与或非门

38译码器真值表

1.观察电路图

通过观察电路图,我们可以发现,Y4C控制HC573锁存器,Y4控制Y4C,Q1~Q8由P0控制

2.编写程序 二、编写程序步骤 1.编写一般性程序(主程序,延时程序,关闭外设程序)

一般情况下,我会习惯性的编写出一般硬性格式的程序,因为一般都是这个框架,先让整体框架在你脑袋里形成,再一步一步完善。
主程序:

#include "reg52.h"
 void main()
 {
	 while(1)
	 { 
	 }

}
2.编写控制LED灯函数

先选择138引脚 使Y4非等于0 这是最简单的方式给三个引脚赋值,之后会写到其他:

#include "reg52.h"
 sbit HC138_A=P2^5;
 sbit HC138_B=P2^6;
 sbit HC138_C=P2^7;
void LEDrunning()
{
	unsigned char i;
    HC138_C=1;
	HC138_B=0;
	HC138_A=0;
}
 void main()
 {
	 while(1)
	 { 
	 }

}
3.编写延时函数Delay

计算机执行程序的速度非常快,如果不主动添加延时函数让程序被动等待,则肉眼观察不到灯的变化:

#include "reg52.h"
 sbit HC138_A=P2^5;
 sbit HC138_B=P2^6;
 sbit HC138_C=P2^7;
  void Delay(unsigned int t)
 {
  while(t--);
  while(t--);
}
void LEDrunning()
{
	unsigned char i;
    HC138_C=1;
	HC138_B=0;
	HC138_A=0;
}
 void main()
 {
	 while(1)
	 { 
	 }

}
4.编写关闭外设函数

一般比赛需要关闭外设,同时防止给电时蜂鸣器乱叫,这里因为需要使用LED等所以不关:

```c
#include "reg52.h"
 sbit HC138_A=P2^5;
 sbit HC138_B=P2^6;
 sbit HC138_C=P2^7;
 void stop()
 {
//P2=(P2&0x1f)|0x80;//关闭led 110
//P0=0xff;
//P2&=0x1f;
  P2=(P2&0x1f)|0xa0;//关闭继电器蜂鸣器 101
  P0=0;
  P2&=0x1f;
 }
 void Delay(unsigned int t)
 {
  while(t--);
  while(t--);
 }
 void LEDrunning()
 {
	unsigned char i;
    HC138_C=1;
	HC138_B=0;
	HC138_A=0;
 }
 void main()
  {
	 while(1)
	 { 
	 }
  }		 

关于底下这一行:

P2=(P2&0x1f)|0xa0;

展开来讲一下
在8051单片机中,初始P2的各个引脚都为高电平,P2 ^ 0 到 P2 ^ 7 ,高四位和低四位都为1111 1111。而P2=(P2 & 0x1f) | 0x80 可以一步一步来转换。P2 & 0x1f 即高三位为0,低五位为1
初始值为:0001 1111
HC138_A = 0;
HC138_B = 0;
HC138_C = 0;
P2 : 1111 1111
0x1f : 0001 1111
P2 & 0x1f :0001 1111
0xa0 : 1010 0000
P2=(P2 & 0x1f) | 0xa0 : 1011 1111
得到 1011 1111 即
HC138_A = 1;
HC138_B = 0;
HC138_C = 1;
至于为什么用Y5控制,烦请大家查询电路板电路图,由图可得。

5.完善整体函数

这时我们需要完成LED函数的编写并将主函数编写完成。

#include "reg52.h"
 sbit HC138_A=P2^5;
 sbit HC138_B=P2^6;
 sbit HC138_C=P2^7;
 void stop()
 {
//P2=(P2&0x1f)|0x80;//关闭led 110
//P0=0xff;
//P2&=0x1f;
  P2=(P2&0x1f)|0xa0;//关闭继电器蜂鸣器 101
  P0=0;
  P2&=0x1f;
 }
 void Delay(unsigned int t)
 {
  while(t--);
  while(t--);
 }
 void LEDrunning()
 {
	unsigned char i;
    HC138_C=1;
	HC138_B=0;
	HC138_A=0;
	for(i=0;i<3;i++)//利用for循环实现三次亮灭
	{
	P0=0x00;//00000000 
	Delay(60000);
	P0=0xff;//11111111
	Delay(60000);
	}
	for(i=1;i<=8;i++)
	{
  P0=0xff << i;
  Delay(60000);
  }
 }

for(i=1;i<=8;i++)
	{
  P0=~(0xff << i);
  Delay(60000);
  } void main()
  {stop();
	 while(1)
	 { 
	 LEDrunning();
	 Delay(60000);
	 }
  }		 

1.因为LED灯尾端接VCC为高电平,所以接低电平使电路流通。
2.使用右移运算符实现从低到高依次亮灭。
3.将程序写入主函循环中,并且关闭多余外设。
4.上为完整程序

经过编译后0error,0warning你就成功啦!

总结

通过实验使大家了解关于LED灯的控制,从中可以知道,38译码器在前期发挥了很大的作用,并且文章展示了两种给38译码器P2接口赋值的方式,与或式的方式在后期经常会用到,大家可以注意一下。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/857932.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号