文章目录
- 【蓝桥杯-单片机】Led、按键等基础模块
- 01 前置准备
- (1)新建工程
- (4)编写程序
- 02 基础模块:LED
- (0)LED原理图
- (1)对P1整体赋值,控制所有的LED灯
- (2)对P1中的的8个IO口单独复制,控制单个LED灯
- (3)控制LED灯闪烁
- 实现原理
- 延时函数
- 延时函数的生成
- 自定义延时函数
- (4)LED流水灯
- 方法一:通过给P1口赋不同的值从而达到流水灯的效果
- 方法二:通过内置函数库实现流水灯效果
- 03 基础模块:按键(KEY)
- (1)用KEYX控制LEDX的亮灭
- 按键消抖
- (2)用按键控制流水灯的运行速度
【蓝桥杯-单片机】Led、按键等基础模块
01 前置准备
(1)新建工程
-
每个不同的工程项目对应一个不同的文件夹
-
芯片选择AT89C52
-
点开品字工具栏,修改相关信息
-
点开魔术棒,勾选生成HEX文件
(4)编写程序
- 右键点击User栏添加用户主程序(main.c)
- 右键引用51头文件
- 编写程序主体框架
- 按照原理图编写程序
- 烧录程序
原理图:
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 1111P1_2 = 0;//点亮第3个灯}
}
(3)控制LED灯闪烁
实现原理
通过不断给P1端口赋高低电平,实现LED灯的开与关,从而达到闪烁的目的
延时函数
在单片机代码中,每次执行一条代码是很快的,也就几微秒左右,那有时候我们想让某一条代码执行后等待一阵子,再去执行下一条,这时候就需要用到延时函数
延时函数的生成
- 打开STC-ISP烧录工具
- 打开软件延时计算器
- 系统频率选择12MHz,定时长度选择500毫秒,指令集选择STC-Y1
- 生成C代码,粘贴至工程文件中,并删除nop语句
自定义延时函数
延时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口赋不同的值从而达到流水灯的效果
方法二:通过内置函数库实现流水灯效果
- crol:循环左移
- cror:循环右移
- 所属库:intrins.h
以下代码通过定义变量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;}}
}