小工具知识网

当前位置: 首页 > 行业知识 > 【蓝桥杯-单片机】基础模块LED和按键

行业知识

【蓝桥杯-单片机】基础模块LED和按键

2026-11-14 05:20:43 来源:互联网转载

文章目录

  • 【蓝桥杯-单片机】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 void main(){while(1){P1 = 0x5F;//0101 1111}}

                        (2)对P1中的的8个IO口单独复制,控制单个LED灯

                        #include 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;}}}

上一篇:网签了怎么查看有没有备案过

下一篇:dhcp服务器中继怎么设置方法?