51单片机攻略—LED

51单片机攻略—LED

入门篇中,完成了对51单片机编程的一系列基本操作,按位点亮了LED,此篇将从总线方式点亮发光二极管开始单片机LED编程。

一、程序实战

(一)LED相关

1、总线方式点亮P1所有LED(8个)

总线方式应将四个一组的二进制位化为十六进制数,进行低电平赋值。
点亮所有LED即令IO口全部输出低电平 00000000 -> 0x00。

#include <reg52.h>
void main(){
	P1 = 0x00;
}

在这里插入图片描述
测试成功。

2、让一个LED灯闪烁

方法一:

#include <reg52.h>
sbit p1_1 = P1^0;
unsigned int a;
void main(){
	while(1){
		a = 50000;
		p1_1 = 0;
		while(a--);
		a = 50000;
		p1_1 = 1;
		while(a--);
	}
}

方法二:

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit LED1 = P1^0;
void delay(uint z){
    uint x,y;
    for (x = 200; x > 0; x--) {
        for(y = z; y > 0; y--);
    }
}
int main() {
    while(1){
        LED1 = 0;
        delay(200);
        LED1 = 1;
        delay(200);
    }
    return 0;
}

测试成功。
补充:
关于单片机的基本时序:
机器周期和指令周期
(1)振荡周期:也称时钟周期,是为单片机提供时钟脉冲信号的振荡源的周期,查看单片机上晶振数值可知;
(2)状态周期:状态周期是时钟周期的两倍,是振荡周期二分频后得到;
(3)机器周期:一个机器周期包含6个状态周期S1~S6,也就是12个时钟周期。一个机器周期内CPU可完成一个独立的操作;
(4)指令周期:CPU完成一条操作所需的全部时间,每条指令执行时间都是由一个或几个机器周期组成,MCS-51中,有单周期指令、双周期指令和四周期指令。

3、让一组LED灯闪烁

#include <reg52.h>
unsigned int a;
void main(){
	while(1){
		a = 50000;
		P1 = 0x00;
		while(a--);
		a = 50000;
		P1 = 0xff;
		while(a--);
	}
}

测试成功。

4、实现一组流水灯

方法一:

#include <reg52.h>
sbit p1_1 = P1^0;
sbit p1_2 = P1^1;
sbit p1_3 = P1^2;
sbit p1_4 = P1^3;
sbit p1_5 = P1^4;
sbit p1_6 = P1^5;
sbit p1_7 = P1^6;
sbit p1_8 = P1^7;
unsigned int a;
void main(){
	while(1){
		a = 20000;
		p1_1 = 0;
		while(a--);
		a = 20000;
		p1_2 = 0;
		while(a--);
		a = 20000;
		p1_3 = 0;
		while(a--);
		a = 20000;
		p1_4 = 0;
		while(a--);
		a = 20000;
		p1_5 = 0;
		while(a--);
		a = 20000;
		p1_6 = 0;
		while(a--);
		a = 20000;
		p1_7 = 0;
		while(a--);
		a = 20000;
		p1_8 = 0;
		while(a--);
		a = 10000;
		P1 = 0xff;
		while(a--);
	}
}

方法二:

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit p1_1 = P1^0;
sbit p1_2 = P1^1;
sbit p1_3 = P1^2;
sbit p1_4 = P1^3;
sbit p1_5 = P1^4;
sbit p1_6 = P1^5;
sbit p1_7 = P1^6;
sbit p1_8 = P1^7;
void delay(uint z){
    uint x,y;
    for (x = 100; x > 0; x--) {
        for(y = z; y > 0; y--);
    }
}
int main() {
    while(1){
        p1_1 = 0;
        delay(100);
        p1_2 = 0;
        delay(100);
        p1_3 = 0;
        delay(100);
        p1_4 = 0;
        delay(100);
        p1_5 = 0;
        delay(100);
        p1_6 = 0;
        delay(100);
        p1_7 = 0;
        delay(100);
        p1_8 = 0;
        delay(100);
        P1 = 0xff;
    }
    return 0;
}

方法三:

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#include <intrins.h>
uchar i;
void delay(uint z){
    uint x,y;
    for (x = 100; x > 0; x--) {
        for(y = z; y > 0; y--);
    }
}
int main() {
	i = 0xfe;
    P1 = i ;
    while(1){
		i = _crol_(i,1);
		delay(50);
		P1 = i;
    }
    return 0;
}

测试成功。

发布了11 篇原创文章 · 获赞 3 · 访问量 899

猜你喜欢

转载自blog.csdn.net/m0_46115596/article/details/104112183