51单片机学习之流水灯蜂鸣器


流水灯

在代码中的延时均使用软件延时,即函数嵌套循环体进行延时;

位输出实现

#include<reg52.h>
#define uint unsigned int

#define on 1
#define off 0

sbit led_0 = P1 ^ 0;
sbit led_1 = P1 ^ 1;
sbit led_2 = P1 ^ 2;
sbit led_3 = P1 ^ 3;
sbit led_4 = P1 ^ 4;
sbit led_5 = P1 ^ 5;
sbit led_6 = P1 ^ 6;
sbit led_7 = P1 ^ 7;

//延时函数
void Delay(uint ms){
    uint i ,j;
    for(i = ms; i > 0; i--){
        for(j = 112; j>0; j--);
    }
}

void main(){
    while(1){    
        led_0 = on;
        Delay(200);
        led_0 = off;

        led_1 = on;
        Delay(200);
        led_1 = off;

        led_2 = on;
        Delay(200);
        led_2 = off;

        led_3 = on;
        Delay(200);
        led_3 = off;

        led_4 = on;
        Delay(200);
        led_4 = off;

        led_5 = on;
        Delay(200);
        led_5 = off;

        led_6 = on;
        Delay(200);
        led_6 = off;

        led_7 = on;
        Delay(200);
        led_7 = off;
    }
}

循环位移实现

P1 = 0xfe    //1111 1110
while(1){
    Delay(1000);
    P1 = _crol_(P1,1);    //将P1左移一位
}

_crol_()函数的使用,必须要加上#include "intrins.h",引入头文件,该函数的原型为:

unsigned char _crol_(unsigned char val,unsigned char n);

函数功能:以位形式将 val 左移 n 位,该函数与8051“RLA”指令相关。如果二进制数为 01010101 那么 _crol_(1) 左移1位后将高位补低位,结果10101010。

移位操作实现

int i = 0;
while(1){
    P1 = 0xfe;
    for (i = 0; i < 8; i++){
        Delay(1000);
        P1 <<= 1;
        P1 = P1 | 0X01;
    }
}

通过每次位移一位,再与0x01进行或操作,这样每次都有一位是低电位,从而实现流水灯。

蜂鸣器


文章作者: Mahoo Huang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Mahoo Huang !
评论
  目录