蓝桥杯LED灯实验

蓝桥杯系列

一、实验任务

点亮第一个LED灯

二、步骤

1.按照之前的步骤建立一个实验一的文件夹,用keil软件在文件夹中建立实验一的项目。

项目名和文件名自己定。

2.编写代码

讲解及升级

首先是头文件
#include<stc15f2k60s2.h>
然后就是正常的C语言代码编写
void main()//这里和普通C语言不一样的是主函数返回值类型不同 这里使用void
{
P2=0XA0;P0=0X00; //初始化程序 后面的博客会讲到
P2=0X80;P0=0XFF; //初始化程序 后面的博客会讲到
P00=1; //在51单片机中,引脚的使用格式是P0^0,15单片机中是P00即可
P01=0; //原因在于在15的头文件中,已经预处理过了
P02=0; //在15开发板中,led是共阳极的,共阳极自己百度,这里不再多做介绍
//所以当引脚为0,就是所谓的低电平时才会亮
while(1); //在这执行while(1)的目的是让程序停留在这里,不然程序就会结束,后面的知识主要就是在while(1)里面循环执行的。
}

在这里还有一个就是,对P0口的整体赋值,如P0=0xff。这一条语句和P00=1,P00=1,P01=1……P07=1,效果一样,最终二级制表示为P0=1111 1111.如上面的程序,可以设置为P0=0xf5,即P0=1111 1001。

升级版:led闪烁
#include<STC15F2K60S2.H>

unsigned int i; //无符号的整型值

void main(void)
{
P2=0XA0;P0=0X00; //初始化程序
P2=0X80;P0=0XFF; //初始化程序
while(1)
{
P00=0;
for(i=0;i<65535;i++); // 在本程序中,就是让单片机在这一条语句中循环执行,占用“CPU”,达到等待的目的。
// 也可以调用类似的函数达到效果
P00=1;
for(i=0;i<65535;i++);
}
}

再次升级:led交替闪烁
//LED交替闪烁程序

#include<STC15F2K60S2.H>

unsigned int i;

void main(void)
{
P2=0XA0;P0=0X00; //初始化程序
P2=0X80;P0=0XFF; //初始化程序
while(1)
{
P00=0;
for(i=0;i<65535;i++);
P00=1;
P01=0;
for(i=0;i<65535;i++);
P01=1;
}
}

流水灯

初步完成功能

#include<STC15F2K60S2.H>

unsigned int i;

void main(void)
{
P2=0XA0;P0=0X00; //初始化程序
P2=0X80;P0=0XFF; //初始化程序
while(1)
{
P00=0;
for(i=0;i<65535;i++);
P00=1;
P01=0;
for(i=0;i<65535;i++);
P01=1;
P02=0;
for(i=0;i<65535;i++);
P02=1;
P03=0;
for(i=0;i<65535;i++);
P03=1;
P04=0;
for(i=0;i<65535;i++);
P04=1;
P05=0;
for(i=0;i<65535;i++);
P05=1;
P06=0;
for(i=0;i<65535;i++);
P06=1;
P07=0;
for(i=0;i<65535;i++);
P07=1;
}
}
这也太长了吧,废话也好多,那直接跳转到本文最后。

优化

如果是小白,那就跟着我一步一步来,下面缩短一下,可以用本篇最上面提到的对P0口整体赋值,精简代码。如下:
#include<STC15F2K60S2.H>

unsigned int i;

void main(void)
{
P2=0XA0;P0=0X00; //初始化程序
P2=0X80;P0=0XFF; //初始化程序
while(1)
{
P0=0XFE;
for(i=0;i<65535;i++);
P0=0XFD;
for(i=0;i<65535;i++);
P0=0XFB;
for(i=0;i<65535;i++);
P0=0XF7;
for(i=0;i<65535;i++);
P0=0XEF;
for(i=0;i<65535;i++);
P0=0XDF;
for(i=0;i<65535;i++);
P0=0XBF;
for(i=0;i<65535;i++);
P0=0X7F;
for(i=0;i<65535;i++);
P0=0XFF;
for(i=0;i<65535;i++);
}
}
还是好长,继续精简:
#include<STC15F2K60S2.H>

void Delayms(int ms); //这里是延时函数,上面讲到过

void main(void)
{
P2=0XA0;P0=0X00; //初始化程序
P2=0X80;P0=0XFF; //初始化程序
while(1)
{
P0=0XFE;
Delayms(100);
P0=0XFD;
Delayms(300);
P0=0XFB;
Delayms(500);
P0=0XF7;
Delayms(800);
P0=0XEF;
Delayms(1000);
P0=0XDF;
Delayms(2000);
P0=0XBF;
Delayms(3000);
P0=0X7F;
Delayms(2000);
P0=0XFF; //运行到这里的时候,所有的等都熄灭,我们通常称为消隐。
Delayms(200);
}
}

void Delayms(int ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j–);
}

最终

但是感觉还是长,有好多代码都是相似的,能不能用循环实现呢?答案是可以的,这就是最终版:
#include<STC15F2K60S2.H>

unsigned char LED;
void Delayms(int ms);

void main(void)
{
P2=0XA0;P0=0X00; //初始化程序
P2=0X80;P0=0XFF; //初始化程序
while(1)
{
for(LED=0;LED<8;LED++) //这里采用循环的方式实现功能,大幅度缩短了代码量
{
P0=~(0X01<<LED); //这里设计到左移右移的概念。在总结中给大家讲解一下,大家先观察代码。
Delayms(1000); /这里要延时一下。举个例子,如果不延时,当第一个灯亮了以后,我们还没反应过来,第一个灯就熄灭,第一个灯的光还没在我们眼睛里成像就没了,看到的内容就是第一个灯没亮,其余的也是。/
}
}
}

void Delayms(int ms) //延时函数的内容
{
int i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j–);
}

总结

在本篇中,我们学习到了,点亮led灯的实验,其中涉及到的知识有:头文件的预处理,进制转换,变量定义的类型,延时函数的原理,还有最后在代码的注释中没给大家讲解的左移右移。 <<左移符号,>>右移符号。 0x01<<1,意思就是左移一位,由原来的0000 0001 变为 0000 0010 0x80>>1, 意思就是右移一位,由原来的1000 0000 变为 0100 0000 通过左移右移达到实现流水灯的效果。 还有代码中出现的一个~符号,这个符号是取反的意思,如原来是0xff(1111 1111),取反后就是0x00(0000 0000)。 同样的能够实现LED流水灯还有一个函数,核心代码如下:

#include“intrins.h” //首先要加入头文件,crol()函数在此头文件中包含。
for(i=0;i<7;i++)
{
P0=crol(P0,1); //表示P0左移一位后重新将值赋给P0。
delay(1000);
}

点亮一个小灯泡很简单,但是点亮小灯泡也可以进行组合,产生花里胡哨的效果,流水灯只是简单的应用,大家自己去探索吧。

——————————————————————————————————————
本文纯原创,如有侵权请联系删除,如有错误,敬请批评指正,谢谢大家。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值