- 51单片机(国信天长单片机实训平台)基于keli的常用程序之 LED指示灯一般控制程序设计
- 前言
- 一、国信长天单片机竞赛实训平台的电路图与分析
- 1.观察电路图
- 2.编写程序
- 二、编写程序步骤
- 1.编写一般性程序(主程序,延时程序,关闭外设程序)
- 2.编写控制LED灯函数
- 3.编写延时函数Delay
- 4.编写关闭外设函数
- 5.完善整体函数
- 总结
实验目的:让8路LED灯同时闪三次,再依次点亮LED灯,再依次熄灭
一、国信长天单片机竞赛实训平台的电路图与分析
国信长天单片机竞赛实训平台电路图
38译码器与或非门
38译码器真值表
1.观察电路图2.编写程序 二、编写程序步骤 1.编写一般性程序(主程序,延时程序,关闭外设程序)通过观察电路图,我们可以发现,Y4C控制HC573锁存器,Y4控制Y4C,Q1~Q8由P0控制
一般情况下,我会习惯性的编写出一般硬性格式的程序,因为一般都是这个框架,先让整体框架在你脑袋里形成,再一步一步完善。
主程序:
#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;
5.完善整体函数展开来讲一下
在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控制,烦请大家查询电路板电路图,由图可得。
这时我们需要完成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接口赋值的方式,与或式的方式在后期经常会用到,大家可以注意一下。



