嵌入式C编程实践 LED控制 51单片机和stm32

一、51单片机LED控制代码

#include <reg51.h> // 包含51单片机的寄存器定义

#define LED P1 // 将P1口定义为LED控制口
bit LED1 P0^0// 将P0^0口定义为LED1控制口

void delay(unsigned int time) // 延时函数
{
    unsigned int i, j;
    for (i = 0; i < time; i++)
        for (j = 0; j < 1

 1. 275; j++); }
    
    void main() {
        while (1) // 循环执行
        {
            LED = 0x00; // 亮灭交替
            LED1 = 0delay(1000); // 延时一段时间,控制亮灭时间
            LED = 0xFF; // 亮灭交替
            delay(1000); // 延时一段时间,控制亮灭时间
            LED1 = 1}

}

上述代码中,主要功能是控制LED灯的亮灭状态。,通过循环执行交替亮灭,并使用延时函数控制亮灭时间。
以下是对这段代码的详细解释:

  1. #include <reg51.h>: 这一行包含了51单片机的寄存器定义。这使得我们可以在程序中使用51单片机的特殊功能寄存器(SFR)。
  2. #define LED P1: 这一行定义了一个预处理器宏,将LED这个词与P1口关联起来。这样,在后面的代码中,每当使用LED时,编译器就会将其替换为P1
  3. bit LED1 P0^0: 这一行定义了一个位变量LED1,并将其与P0端口的第0位关联起来。这样,我们可以通过操作LED1来控制P0端口的第0位,从而控制一个LED灯的亮灭。
  4. void delay(unsigned int time): 这是一个自定义的延时函数,接受一个无符号整数作为参数,表示需要延时的时间。然而,请注意,这个函数的延时实现是不精确的,因为它的时间取决于单片机的时钟频率。
  5. main函数中,有一个无限循环,其中代码会交替地将LED(即P1口)设置为0x00(所有LED灯都关闭)和0xFF(所有LED灯都打开),并在每次操作后调用delay(1000)函数以产生一定的延时。同时,LED1也会被设置为0或1,使得连接到P0端口的LED灯在每次状态切换时闪烁。

总的来说,这个程序会让连接到P1口的LED灯以一定的频率进行亮灭交替,而连接到P0口的LED灯则会在每次状态切换时闪烁。

二、STM32LED控制代码

#include "stm32f10x.h" // 包含STM32寄存器定义

#define LED GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); // 控制LED亮灭

void delay(int ms) // 延时函数
{
    int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 1275; j++);
}

int main()
{
    GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 初始化GPIOC Pin 13
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 50MHz输出速度
    GPIO_Init(GPIOC, &GPIO_InitStructure); // 根据GPIO初始化结构体初始化GPIOC Pin 13
    while (1) // 循环执行
    {
        LED = Bit_SET; // 点亮LED
        delay(1000); // 延时一段时间,控制亮灭时间
        LED = Bit_RESET; // 熄灭LED
        delay(1000); // 延时一段时间,控制亮灭时间
    }
}

上述代码中,使用GPIOC Pin 13控制LED的亮灭,通过循环执行交替亮灭,并使用延时函数控制亮灭时间。
以下是对这段代码的详细解释:

  1. #include "stm32f10x.h": 这一行包含了STM32F10x的寄存器定义,提供了对硬件抽象层的访问。
  2. #define LED GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);: 这一行定义了一个宏LED,它将GPIOC的第13引脚(通常是板载LED)设置为低电平(熄灭状态)。
  3. void delay(int ms): 这是一个自定义的延时函数,接受一个整数作为参数,表示需要延时的毫秒数。然而,请注意,这个函数的延时实现是不精确的,因为它的时间取决于单片机的时钟频率和编译器如何优化代码。
  4. int main(): 主函数的开始。
  5. main函数中,首先定义了一个GPIO_InitTypeDef结构体,用于初始化GPIOC的第13引脚。然后使能了GPIOC的时钟,设置了GPIOC的第13引脚为推挽输出模式,并设置了50MHz的输出速度。最后,使用GPIO_Init函数根据定义的结构体来初始化GPIOC的第13引脚。
  6. while (1): 一个无限循环,用于持续控制LED灯的状态。
  7. 在循环内部,首先通过LED = Bit_SET;点亮LED,然后调用delay(1000);函数进行1秒的延时,接着通过LED = Bit_RESET;熄灭LED,再调用delay(1000);函数进行1秒的延时。这个过程会一直重复,使得LED以1秒的间隔进行亮灭交替。

总的来说,这个程序会控制连接到GPIOC的第13引脚的LED灯以1秒的间隔进行亮灭交替。

LED发光原理及电路连接

LED(Light Emitting Diode)是一种高效、环保的发光器件,被广泛应用于各种领域。本文将向读者介绍LED的发光原理以及如何在电路中进行连接,以实现高效的发光效果。

一、LED发光原理

LED的发光原理基于半导体PN结的特性。当LED的正极连接到高电平,负极连接到低电平时,PN结处于正向偏置状态,此时电流从高电平流向低电平,通过PN结产生光子,LED发光。反之,当LED的正极连接到低电平,负极连接到高电平时,PN结处于反向偏置状态,此时电流从低电平流向高电平,通过PN结产生光子,LED发光。但是,反向偏置时的发光效率较低。

二、电路连接方式

正向偏置连接方式:
在这种连接方式中,LED的正极连接到高电平,负极连接到低电平。当输入为高电平时,LED正向偏置,可以发光。这种连接方式的优点是发光效率高。

电路连接示例:

+5V --- LED --- 连接的端口
|                |
高电平          GPIO/端口输出--低电平

反向偏置连接方式:
在这种连接方式中,LED的正负极交换连接,正极连接到低电平,负极连接到高电平。当输入为低电平时,LED反向偏置,也可以发光。但是,这种连接方式的发光效率较低。

电路连接示例:

GND --- LED --- 连接的端口
|                 |
低电平           GPIO/端口输出- 高电平

四、总结

LED的发光原理取决于其正反极的连接方式。正向偏置时,高电平发光,效率高;反向偏置时,低电平发光,效率低。在实际应用中,应根据具体需求选择合适的连接方式,以提高LED的发光效率。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值