从本文开始,我将介绍蓝桥杯比赛中使用的各部分外设。首先介绍的就是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,然后以此类推。
效果如下:
有疑问可以评论或私信