LED 相关的实践操作和基础软件认识

本文介绍了如何使用KeiluVision5进行AT89C51系列微控制器的编程,包括新建工程、编译过程以及LED的点亮、闪烁和流水灯效果的实现。同时,还展示了如何通过独立按键控制LED的状态,包括二进制显示和移位操作,涉及到了基本的硬件驱动和消抖技术。
摘要由CSDN通过智能技术生成

Keil uVision5的认识和操作

软件操作硬件的驱动原理

新的 Keil 里 AT89C51 系列都在 Microchip目录下

新建代码库

编译

建立工程

所有文件全部建立、编译一遍

更改字体

生成编译文件:

1

2

实践操作

点亮一个LED

STC89C52 的P2端口连接着LDE模块,1标识不亮,0标识亮。

一共8个灯对应:1111 1111

亮最后一个:1111 1110

 #include <REGX52.H>
 ​
 void main()
 {
     P2=0xFE;    //1111 1110
     while(1)
     {
         
     }
 }

LED闪烁:

void Delay500ms() 是自定义函数用于延时(我从stc-isp软件里复制的代码)

P2=0xFF; //1111 1111和P2=0xFE; //1111 1110

分别表示最后一个灯的关和灭。

 #include <REGX52.H>
 #include <INTRINS.H>
 ​
 void Delay500ms()       //@12.000MHz
 {
     unsigned char i, j, k;
 ​
     _nop_();
     i = 4;
     j = 205;
     k = 187;
     do
     {
         do
         {
             while (--k);
         } while (--j);
     } while (--i);
 }
 ​
 ​
 void main()
 {
     while(1)
     {
         P2=0xFE;    //1111 1110
         Delay500ms();
         P2=0xFF;    //1111 1111
         Delay500ms();
     }
 }
 ​

LED流水灯:

用P2端口控制的LED的关系(1标识不亮,0标识亮)

叠加闪烁的延时达到流水灯的效果

 #include <REGX52.H>
 #include <INTRINS.H>
 ​
 void Delay500ms()       //@12.000MHz
 {
     unsigned char i, j, k;
 ​
     _nop_();
     i = 4;
     j = 205;
     k = 187;
     do
     {
         do
         {
             while (--k);
         } while (--j);
     } while (--i);
 }
 ​
 ​
 void main()
 {
     while(1)
     {
         P2=0xFE;//1111 1110
         Delay500ms();
         P2=0xFD;//1111 1101
         Delay500ms();
         P2=0xFB;//1111 1011
         Delay500ms();
         P2=0xF7;//1111 0111
         Delay500ms();
         P2=0xEF;//1110 1111
         Delay500ms();
         P2=0xDF;//1101 1111
         Delay500ms();
         P2=0xBF;//1011 1111
         Delay500ms();
         P2=0x7F;//0111 1111
         Delay500ms();
     }
 }
 ​

LED流水灯Plus:

用延时来把前两个LED灯将其减慢闪烁后面加快。

 #include <REGX52.H>
 ​
 void Delay1ms(unsigned int xms);        //@12.000MHz
 ​
 void main()
 {
     while(1)
     {
         P2=0xFE;//1111 1110
         Delay1ms(1000);
         P2=0xFD;//1111 1101
         Delay1ms(1000);
         P2=0xFB;//1111 1011
         Delay1ms(100);
         P2=0xF7;//1111 0111
         Delay1ms(100);
         P2=0xEF;//1110 1111
         Delay1ms(100);
         P2=0xDF;//1101 1111
         Delay1ms(100);
         P2=0xBF;//1011 1111
         Delay1ms(100);
         P2=0x7F;//0111 1111
         Delay1ms(100);
     }
 }
 ​
 void Delay1ms(unsigned int xms)     //@12.000MHz
 {
     unsigned char i, j;
     while(xms)
     {
         i = 2;
         j = 239;
         do
         {
             while (--j);
         } while (--i);
         xms--;
     }
 }
 ​

独立按键控制LED亮灭

STC89C52 的P3端口连接着按钮模块

用按钮控制

 #include <REGX52.H>
 ​
 void main()
 {
     while(1)
     {
         if(P3_1==0 || P3_0==0)  //如果K1按键或K2按键按下
         {
             P2_0=0;     //LED1输出0,点亮
         }
         else
         {
             P2_0=1;     //LED1输出1,熄灭
         }
     }
 }
 ​

独立按键控制LED状态

 #include <REGX52.H>
 ​
 void Delay(unsigned int xms)
 {
     unsigned char i, j;
     while(xms)
     {
         i = 2;
         j = 239;
         do
         {
             while (--j);
         } while (--i);
         xms--;
     }
 }
 ​
 void main()
 {
     while(1)
     {
         if(P3_1==0)         //如果K1按键按下
         {
             Delay(20);      //延时消抖
             while(P3_1==0); //松手检测
             Delay(20);      //延时消抖
             
             P2_0=~P2_0;     //LED1取反
         }
     }
 }
 ​

独立按键控制LED显示二进制

 #include <REGX52.H>
 ​
 void Delay(unsigned int xms)
 {
     unsigned char i, j;
     while(xms--)
     {
         i = 2;
         j = 239;
         do
         {
             while (--j);
         } while (--i);
     }
 }
 ​
 void main()
 {
     unsigned char LEDNum=0;
     while(1)
     {
         if(P3_1==0)         //如果K1按键按下
         {
             Delay(20);      //延时消抖
             while(P3_1==0); //松手检测
             Delay(20);      //延时消抖
             
             LEDNum++;       //变量自增
             P2=~LEDNum;     //变量取反输出给LED
         }
     }
 }
 ​

独立按键控制LED移位

 #include <REGX52.H>
 void Delay(unsigned int xms);
 ​
 unsigned char LEDNum;
 ​
 void main()
 {
     P2=~0x01;               //上电默认LED1点亮
     while(1)
     {
         if(P3_1==0)         //如果K1按键按下
         {
             Delay(20);
             while(P3_1==0);
             Delay(20);
             
             LEDNum++;       //LEDNum自增
             if(LEDNum>=8)   //限制LEDNum自增范围
                 LEDNum=0;
             P2=~(0x01<<LEDNum); //LED的第LEDNum位点亮
         }
         if(P3_0==0)         //如果K2按键按下
         {
             Delay(20);
             while(P3_0==0);
             Delay(20);
             
             if(LEDNum==0)   //LEDNum减到0后变为7
                 LEDNum=7;
             else            //LEDNum未减到0,自减
                 LEDNum--;
             P2=~(0x01<<LEDNum); //LED的第LEDNum位点亮
         }
     }
 }
 ​
 void Delay(unsigned int xms)
 {
     unsigned char i, j;
     while(xms--)
     {
         i = 2;
         j = 239;
         do
         {
             while (--j);
         } while (--i);
     }
 }
 ​
 ​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值