51单片机(上)

51单片机注意事项

这篇文章用到的单片机是普中51单片机,参考的视频是江科大的51单片机的视频,同时加入了我自己的理解,希望可以更好的把单片机的内容表述出来。

一.使用keil软件创建工程

这里我们需要生成.hex文件,如果没有.hex文件,烧录软件找不到.hex文件,就不会把程序烧录到单片机里。

二.LED灯。
2.1点亮一个LED灯

由图中可知,小灯的一端接的是VCC,那么另一端就要接地,这样才能使小灯发亮,所以我们给P2相应的IO口低电平,就可以使小灯点亮。

#include <REGX52.H>
sbit LED1 = P2^1;

void main()
{
    //P2_0 = 0;
    //LED1 = 0;
    P2 = 0xFE;       //1111  1110
    
    while(1)
    {
    
    }
}

如上所示的代码都是将第一个小灯(D1)点亮,如下图所示。

这里有三种不同的代码风格将小灯点亮。

第一种是P2_0 = 0;根据LED模块原理图,我们可以直接将P2_0口置0就可以将相应的小灯点亮。

第二种,我们可以看成是给P2_0口起了一个别名LED0,我们在操作时不用写LED0了,可以写LED0,这样显得更加直观一点,让人一看就知道是要把LED的第一个小灯点亮,方便我们以及他人阅读程序。

第三种,把P2看作一个整体,直接用十六进制数显示P2 = 0xFE,换算成二进制就是,

P2 = 1111 1110,看到这里你可能会说,如果是这样的话,那点亮的不是最后一个小灯吗,为啥是第一个小灯,其实最开始我也有这样的疑惑,我猜是从高位到低位排的,也就是这里的第一位对应单片机从左网有数最后一个小灯,依次类推,大家记住就行了。别弄错了。

2.2使小灯闪烁

我们可以控制小的亮灭来使小灯闪烁。

那么这里我们就要用到一种函数,就是延时函数。

那么我们如何写延时函数呢,我们可以使用STC-ISP软件,找到软件延时计算器,按照如图配置即可(我们这里用的是51普中的板子)。

这样就生成了延时函数的代码

#include <REGX52.H>
#include <INTRINS.H>

void Delay500ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    _nop_();
    i = 4;
    j = 129;
    k = 119;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}


void main()
{
    
    while(1)
    {
        P2_1 = 0;
        Delay500ms();
        P2_1 = 1;
        Delay500ms();
    }
}

这样,我们就实现了小灯的闪烁。其中有一个_nop_();函数,我们需要加上头文件#include <INTRINS.H>才可以正常运行代码,当然我们也可以不写_nop_()函数。

2.3流水灯的实现

思路:我们想要实现流水灯,就要让第一个灯亮,然后熄灭,于此同时,在第一个灯熄灭的同时第二个小灯别点亮,第二个小灯熄灭的同时,第三个小灯被点亮.........:依次类推,我们就可以得到一个流水灯。

#include <REGX52.H>

void Delay500ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    i = 4;
    j = 129;
    k = 119;
    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();
    }
}

这样写的好处是,如P2 = 0xFE跳到P2 = 0xFD的时候,不用让第一个小灯熄灭了,因为第二个已经让第一个小灯熄灭和第二个小灯点亮。减少了代码的冗余,让代码看起来更加之直观。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值