找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6|回复: 0
收起左侧

我的51单片机入门实践2 键控LED灯 含原理图和源码

[复制链接]
ID:1171491 发表于 2026-5-18 00:09 | 显示全部楼层 |阅读模式
OK这是第二次的实践,前来记录一下
麻烦大家多多指导谢谢!
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. // 按键连接到P1.4-P1.7
  6. sbit KEY1 = P1^4;  
  7. sbit KEY2 = P1^5;  
  8. sbit KEY3 = P1^6;  
  9. sbit KEY4 = P1^7;  

  10. // LED连接到P0.0-P0.7(共阳接法:P0=0亮,P0=1灭)
  11. #define LED_PORT P0  

  12. // 毫秒级延时
  13. void delayms(uint j)
  14. {
  15.     uchar i;
  16.     for(; j > 0; j--)
  17.     {
  18.         i = 250;
  19.         while(--i);
  20.         i = 249;
  21.         while(--i);
  22.     }
  23. }

  24. // 按键扫描 + 按下期间保持点亮,松开后熄灭
  25. void key_control(uchar key)
  26. {
  27.     switch (key)
  28.     {
  29.         case 1: // 按键1:逐个点亮(保持已亮的),直到全亮
  30.         {
  31.             uchar n = 0; // 当前点亮的灯数量
  32.             while(KEY1 == 0) // 只要按键1没松开
  33.             {
  34.                 n++;
  35.                 if(n > 8) n = 8; // 最多8个灯
  36.                
  37.                 // 计算LED状态:低n位为0(亮),其余为1(灭)
  38.                 LED_PORT = (0xFF << n);
  39.                
  40.                 delayms(200); // 点亮间隔
  41.             }
  42.             LED_PORT = 0xFF; // 松开后,所有灯熄灭
  43.             break;
  44.         }
  45.             
  46.         case 2: // 按键2:前四个灯亮
  47.             while(KEY2 == 0)
  48.             {
  49.                 LED_PORT = 0xF0; // 0000 1111(前四个亮)
  50.                 delayms(10);
  51.                 if(KEY2 != 0) break;
  52.             }
  53.             LED_PORT = 0xFF;
  54.             break;
  55.             
  56.         case 3: // 按键3:后四个灯亮
  57.             while(KEY3 == 0)
  58.             {
  59.                 LED_PORT = 0x0F; // 1111 0000(后四个亮)
  60.                 delayms(10);
  61.                 if(KEY3 != 0) break;
  62.             }
  63.             LED_PORT = 0xFF;
  64.             break;
  65.             
  66.         case 4: // 按键4:所有灯亮
  67.             while(KEY4 == 0)
  68.             {
  69.                 LED_PORT = 0x00; // 0000 0000(全亮)
  70.                 delayms(10);
  71.                 if(KEY4 != 0) break;
  72.             }
  73.             LED_PORT = 0xFF;
  74.             break;
  75.     }
  76. }

  77. void main(void)
  78. {
  79.     LED_PORT = 0xFF; // 初始化:所有灯熄灭
  80.    
  81.     while (1)
  82.     {
  83.         uchar key_val = 0; // 默认无按键
  84.         
  85.         // 检测按键(带消抖)
  86.         if (KEY1 == 0)  
  87.         {
  88.             delayms(20);
  89.             if (KEY1 == 0) key_val = 1;
  90.         }
  91.         else if (KEY2 == 0)  
  92.         {
  93.             delayms(20);
  94.             if (KEY2 == 0) key_val = 2;
  95.         }
  96.         else if (KEY3 == 0)  
  97.         {
  98.             delayms(20);
  99.             if (KEY3 == 0) key_val = 3;
  100.         }
  101.         else if (KEY4 == 0)  
  102.         {
  103.             delayms(20);
  104.             if (KEY4 == 0) key_val = 4;
  105.         }
  106.         
  107.         // 执行按键控制
  108.         if(key_val != 0)
  109.         {
  110.             key_control(key_val);
  111.         }
  112.     }
  113. }
复制代码




整体图(proteus仿真原理图)

整体图(proteus仿真原理图)

第一个按钮按下灯逐个亮起效果图

第一个按钮按下灯逐个亮起效果图

第二个按钮按下前四个灯亮效果图

第二个按钮按下前四个灯亮效果图

第三个按钮按下后四个灯亮效果图

第三个按钮按下后四个灯亮效果图

第四个按钮按下灯全亮效果图

第四个按钮按下灯全亮效果图
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表