蓝桥杯单片机(一)流水灯

  • Post author:
  • Post category:其他


从本文开始,我将介绍蓝桥杯比赛中使用的各部分外设。首先介绍的就是LED灯了,毕竟学习开发板最简单的外设了。


我们先在Keil5建立一个新工程

在这里插入图片描述


在D盘建立一个keilproject文件夹,再在里面建立Class,然后在Class里面建立一个LED文件夹,然后下面名字写为led,后续学习别的可以再在Class重新创建一个文件夹。


在这里插入图片描述


选择STC15F2K60S2


在这里插入图片描述

在这里插入图片描述


然后新建一个main.c文件


在这里插入图片描述

在这里插入图片描述


然后把创建HEX选项选上,后面烧写程序要使用。


在这里插入图片描述

首先,我从蓝桥杯这款开发板的LED部分

原理图

开始讲解。

在这里插入图片描述

我们打开蓝桥杯单片机的原理图找到LED,然后找到与LED相关的连接在一起的几个元件。首先是左上角的74HC138,这是一个译码器,P25,P26,P27是译码器的输入,输出的Y4连接到了与非门Y4,与非门的输出Y4C连接到了锁存器M74HC573M1R的Y4C,然后在与八个LED灯相连。



首先LED右端接到了VCC(高电平),也就是说另外一端接低电平才能导通,LED才能亮,LED的左端接到的锁存器。

锁存器的作用就是锁定D0-D8的状态,当锁存器的Y4C为高电平时,锁存器上的D0-D8才能被改变,这时候才能把单片机P0口的电平输入到Q1-Q8。所以当我们想要改变LED的亮灭状态时,首先要将Y4C置为高电平。而Y4C又是与非门的输出,所以只要Y4为低电平时,Y4C一定是高电平,要让Y4C为低电平,所以译码器对应的值为100,首先要将P27=1,P26=0,P25=0,才能改变LED的状态。

然后就可以编写代码了。


首先引入STC15F2K60S2的头文件

#include <stc15f2k60s2.h>

然后创建一个主函数,使用while循环锁死,让程序一直在while循环运行。

然后再while循环里面点亮一个LED

void main(void)
{
	//上电首先要关闭蜂鸣器
	//防止的蜂鸣器一直响
	P2=0XA0;P0=0X00;
	while(1)
	{
	//0X80==1000 0000
	//0X01==1111 1110
	//也会就是先选上锁存器,再打开LED第一个
		P2=0X80;P0=0XFE;
	}
}


P2=0XA0;P0=0X00;这句话可以用上面同样分析LED的来获得关闭蜂鸣器的代码。

然后使用stc-isp进行烧录程序


在这里插入图片描述

效果如图:

在这里插入图片描述



能够点亮一个LED灯,接下来就是流水灯了。

所谓流水灯,就是首先第一个灯亮,然后延时一段时间,然后下一个灯亮,然后一直循环下去。

延时函数可以在stc-isp直接生成。(stc-isp考试也能直接使用)

我生成的是1s的延时函数



在这里插入图片描述

然后复制到程序中。代码如下

#include <stc15f2k60s2.h>
#include "intrins.h"

void Delay1000ms(void);
void main(void)
{
	unsigned char i;
	P2=0XA0;P0=0X00;
	while(1)
	{
		for(i=0;i<8;i++)
		{
			P2=0X80;P0=~(0X01<<i);
			Delay1000ms();
		}
	}
}

void Delay1000ms(void)		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 43;
	j = 6;
	k = 203;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



多引入了一个intrins.h的头文件是因为生成的delay1000ms函数中使用了intrins.h头文件中NOP指令,这个作用是让单片机不进行操作一个机器周期。

主函数只有一个for循环,定义了一个i变量进行循环,第一次i=0,P0=0X01取反,也就是第一个灯亮,延时1s,也就是让第一个灯亮1s。然后i=1,P0=0X01向左位移再取反,也就是0X02取反,也就是第二个灯亮1s,然后以此类推。





效果如下:



在这里插入图片描述



有疑问可以评论或私信



版权声明:本文为darlingqx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。