蓝桥杯单片机基础教程:LED灯和按键模块
文章目录
【蓝桥杯-单片机】Led、按键等基础模块
01 前置准备
(1)新建工程
每个不同的工程项目对应一个不同的文件夹
芯片选择AT89C52
点开品字工具栏,修改相关信息
点开魔术棒,勾选生成HEX文件
(4)编写程序



原理图:

02 基础模块:LED
(0)LED原理图
(1)对P1整体赋值,控制所有的LED灯
#include <REGX52.H>
void main()
{
while(1)
{
P1 = 0x5F;//0101 1111
}
}
(2)对P1中的的8个IO口单独复制,控制单个LED灯
#include <REGX52.H>
void main()
{
while(1)
{
//P1 = 0x5F;//0101 1111
P1_2 = 0;//点亮第3个灯
}
}
(3)控制LED灯闪烁
实现原理
通过不断给P1端口赋高低电平,实现LED灯的开与关,从而达到闪烁的目的
延时函数
在单片机代码中,每次执行一条代码是很快的,也就几微秒左右,那有时候我们想让某一条代码执行后等待一阵子,再去执行下一条,这时候就需要用到延时函数
延时函数的生成

自定义延时函数
延时1ms的代码
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
自定义的延时函数:
//自定义延时函数
void Delay(unsigned int x) //@12.000MHz
{
unsigned char i, j;
while(x--)
{
i = 2;
j = 239;
do{
while(--j);
}while(--i);
}
}
例如:x传入的值为1000,则这个延时函数实现了延时1s的功能。
(4)LED流水灯
方法一:通过给P1口赋不同的值从而达到流水灯的效果
方法二:通过内置函数库实现流水灯效果
以下代码通过定义变量time实现了让流水灯越流越快的功能:
void main()
{
while(1)
{
P1 = Led;
Led = _crol_(Led,1);
Time = Time - 100;
Delay(Time);
}
}
03 基础模块:按键(KEY)
(1)用KEYX控制LEDX的亮灭
按键消抖
Key_Val = Key_Read();//读取键码值
Key_Down = Key_Val & (Key_Val ^ Key_Old);//检测下降沿
Key_Up = ~Key_Val & (Key_Val ^ Key_Old);//检测上升沿
Key_Old = Key_Val;//扫描辅助变量
//按键读取函数
unsigned char Key_Read()
{
unsigned char temp = 0;
if(P3_4 == 0) temp = 1;
if(P3_5 == 0) temp = 2;
if(P3_6 == 0) temp = 3;
if(P3_7 == 0) temp = 4;
return temp;
}
//变量声明区域
unsigned char Led = 0xfe;//LED数据变量
unsigned int Time = 1000;
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;//按键扫描变量
void main()
{
while(1)
{
Key_Val = Key_Read();//读取键码值
Key_Down = Key_Val & (Key_Val ^ Key_Old);//检测下降沿
Key_Up = ~Key_Val & (Key_Val ^ Key_Old);//检测上升沿
Key_Old = Key_Val;//扫描辅助变量
switch(Key_Down)
{
case 1:
P1_0 = 0;//按键1控制第1个Led亮
break;
case 2:
P1_1 = 0;//按键2控制第2个Led亮
break;
case 3:
P1_0 = 1;//按键3控制第1个Led灭
break;
case 4:
P1_1 = 1;//按键4控制第2个Led灭
break;
}
}
}
(2)用按键控制流水灯的运行速度
//按键读取函数
unsigned char Key_Read()
{
unsigned char temp = 0;
if(P3_4 == 0) temp = 1;
if(P3_5 == 0) temp = 2;
if(P3_6 == 0) temp = 3;
if(P3_7 == 0) temp = 4;
return temp;
}
//变量声明区域
unsigned char Led = 0xfe;//LED数据变量
unsigned int Time = 1000;
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;//按键扫描变量
bit Flag = 0;
void main()
{
while(1)
{
Key_Val = Key_Read();//读取键码值
Key_Down = Key_Val & (Key_Val ^ Key_Old);//检测下降沿
Key_Up = ~Key_Val & (Key_Val ^ Key_Old);//检测上升沿
Key_Old = Key_Val;//扫描辅助变量
P1 = Led;
if(Flag == 1){
Delay(Time);
Led = _crol_(Led,1);
}
switch(Key_Down)
{
case 1:
Flag = 1;//流水灯运行
break;
case 2:
Flag = 0;//流水灯暂停
break;
case 3:
Time = Time -100;//加速
break;
case 4:
Time = Time + 100;//减速
break;
}
}
}
作者:verse_armour