关于stc单片机做LED点亮和灭的时间控制程序问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于stc单片机做LED点亮和灭的时间控制程序问题?相关的知识,希望对你有一定的参考价值。

想用STC8G1K08芯片控制LED灯。要求上电30秒后LED灯开始点亮。三秒后就灭。然后芯片不工作。谢谢

你可以按照以下步骤编写STC8G1K08芯片的LED点亮和灭的时间控制程序:

    设置芯片的时钟和计数器,以便实现时间控制。例如,可以使用定时器或延时函数来控制时间。

    在主函数中编写程序,实现LED点亮和灭的时间控制。可以使用if语句或while语句来判断时间是否达到要求,然后控制LED灯的点亮和灭。

    在main函数中添加延时函数,以实现上电后30秒后LED灯开始点亮的要求。
    下面是一个简单的示例程序,仅供参考:

#include<reg52.h>

sbit LED=P1^0;

void delay(unsigned int i)

while(i--);

void main()

unsigned int count=0;  //计数器,用于实现30秒的延时

while(count<30000)  //上电后30秒开始执行程序

delay(1000);  //每次延时1秒

count+=1000;

LED=1;  //点亮LED

delay(3000);  //LED持续3秒

LED=0;  //灭掉LED

while(1);  //芯片不工作

在上述程序中,使用了一个计数器来实现上电后30秒的延时,然后LED点亮并持续3秒后灭掉,最后芯片不工作。需要注意的是,示例程序仅供参考,具体实现方式需要根据实际情况进行调整和优化。

参考技术A

您可以按照以下步骤来实现这个功能:

    连接LED灯和STC8G1K08芯片。将LED的正极连接到STC8G1K08的一个IO引脚上,将LED的负极连接到STC8G1K08芯片的地。

    在代码中设置IO引脚为输出模式,将其输出低电平,从而关闭LED。

    在主函数中,让芯片休眠30秒钟,可以使用延时函数或定时器中断等方法实现。

    30秒后,将IO引脚输出高电平,点亮LED灯。

    再延时3秒钟,关闭LED,将IO引脚输出低电平。

    最后让芯片进入休眠状态,停止工作。

    下面是一个简单的示例代码:

    cCopy code#include "reg51.h" #define LED_PIN P1_0 //将LED连接到P1.0引脚上void main()
       LED_PIN = 0; //设置LED引脚为输出模式,并将其输出低电平,关闭LED

       delay(30000); //延时30秒

       LED_PIN = 1; //输出高电平,点亮LED

       delay(3000); //延时3秒

       LED_PIN = 0; //输出低电平,关闭LED

       while(1)  //让芯片进入休眠状态,停止工作
       
           PCON |= 0x01; //进入掉电模式,停止工作
       
    void delay(unsigned int t)    unsigned int i, j;    for (i = 0; i < t; i++)        for (j = 0; j < 120; j++); //延时函数

    请注意,此代码仅供参考,具体实现方法可能因芯片型号和硬件连接不同而有所差异,具体实现方法请参考芯片的相关文档和手册。

参考技术B 以下是一种可能的STC8G1K08控制LED灯的时间控制程序:

#include <STC8.H>
#define LED P10 // 将LED连接到P10口
void Delay1ms() // 延时1ms
unsigned char i, j;
i = 12;
j = 169;
do
while (--j);
while (--i);

void main()
unsigned char i;
LED = 0; // LED灯初始状态为熄灭
for (i = 0; i < 30; i++) // 上电后延时30秒
Delay1ms();
Delay1ms();
Delay1ms();

LED = 1; // LED灯点亮
Delay1ms(); // 延时1秒
Delay1ms();
Delay1ms();
LED = 0; // LED灯熄灭
while (1); // 芯片不工作

这段程序将LED连接到P10口,并在程序开始时将LED灯初始状态设置为熄灭。然后,在上电后延时30秒后,LED灯点亮。三秒后,LED灯熄灭。最后,程序将进入一个死循环,芯片不再工作。
需要注意的是,这个程序中的延时函数是使用软件实现的,实际上STC8G1K08芯片也可以使用定时器实现更准确的时间控制。另外,实际使用中需要根据硬件和需求进行适当的调整和修改。
参考技术C 您可以使用STC8G1K08芯片的定时器来实现LED点亮和灭的时间控制。
以下是一个简单的程序示例:
cCopy Code#include <STC8.H>#define LED P4_7 // 定义LED控制引脚void main()
TMOD = 0x01; // 设置定时器T0为模式1,每隔50us计数一次
TH0 = 0xDB; // 设置定时器初值为3036,使其在65536个计数周期后溢出
TL0 = 0x00;
TR0 = 1; // 启动定时器T0

while (1)
if (TF0) // 当定时器T0溢出时
static unsigned int count = 0;
count++; // 计数器加1

if (count == 60000) // 30秒后

LED = 1; // 点亮LED
else if (count == 60300) // 3秒后

LED = 0; // 灭掉LED
TR0 = 0; // 停止定时器T0
while (1); // 停止芯片工作


TF0 = 0; // 清除定时器T0溢出标志位




该程序使用定时器T0来进行时间计数,当计数器达到特定值时,控制LED点亮和灭。在程序中,TMOD寄存器设置定时器T0为模式1;TH0和TL0寄存器设置计时初值为3036,即每隔50us计数一次,并在65536个计数周期后溢出;TR0寄存器启动定时器T0。在while循环中,程序通过检测TF0寄存器的状态来判断定时器是否溢出,并根据计数器的值控制LED的状态。最后,在灭掉LED之后,停止定时器T0并让芯片停止工作,以满足您的需求。
需要注意的是,这只是一个简单的示例程序,具体的实现方式还依赖于您的硬件设计和软件架构。
参考技术D

谢谢采纳!!!


以下是一种可能的STC单片机控制LED点亮和灭的时间控制程序:

#include <STC8.H>

#define LED P4_4 // 定义LED灯接口void delay_ms(unsigned int ms) // 延时函数(毫秒)
unsigned int i, j;    for (i = 0; i < ms; i++)        for (j = 0; j < 125; j++);
void main()

unsigned int count = 0;    LED = 0; // 初始状态为灭

delay_ms(30000); // 上电30秒后开始执行程序

while (count < 3) // 执行三次循环,每次延时1秒
       LED = 1; // 点亮LED
delay_ms(1000);        LED = 0; // 灭掉LED
delay_ms(1000);
count++; // 计数器加1
   LED = 0; // 程序执行完毕,灭掉LED
while (1); // 循环等待


上电后延时30秒,然后执行一个循环,每次点亮LED灯1秒,然后灭掉LED灯1秒,循环3次后灭掉LED灯,程序停止。其中,延时函数可以自行调整。

使用寄存器点亮LED——编程实战

stm32的编程和stc89c51还是存在着很多思想上的不同的,在51单片机中,我们点亮LED灯,只用给对应IO高低电平就可以了,而stm32中,就一个简单的GPIO,我们也需要配置好几个寄存器,而且,就算配置好GPIO寄存器,我们还必须有一步不能缺少的操作,那就是开启对应GPIO的时钟。在stm32的编程中,开启对应时钟是必不可少的一个操作,而且,开启时钟的操作必须在配置相应寄存器之前,以GPIO为例,如果我们先配置GPIO的寄存器,不开启时钟或者先配置GPIO寄存器,最后再开启时钟,都不能正常驱动芯片工作。时钟就像人的脉搏一样,人必须有脉搏才能工作,同样,stm32也必须先给时钟,再配置寄存器达到相应的功能。

那么我是怎么知道要这样配置的呢?

第一,现在的教程比较成熟,能够知道这些内容;第二,在开发板的学习教程中,他也是通过ST的官方demo知道的,具体在

F4固件库\\STM32F4xx_DSP_StdPeriph_Lib_V1.5.1\\STM32F4xx_DSP_StdPeriph_Lib_V1.5.1\\Project\\STM32F4xx_StdPeriph_Examples\\

这个目录下,有基于ST的参考代码,别人告诉我们要先开启时钟;第三,为什么要先开启对应外设时钟才能工作,51单片机就不需要啊。这个也是可以理解的,为了低功耗嘛,时钟相当于一把钥匙控制这个电路的开关,没用时钟这把钥匙,你什么操作也是白搭,对应时钟控制对应外设,这也无可厚非。

 

那么我们怎么查看具体外设到底要开启什么时钟呢?

查看《STM32F4xx中文参考手册1》2.3节,STM32F4xx 寄存器边界地址 ,可以看到对应外设的时钟。

可以看到我们的GPIOH是挂载在AHB1总线上,所以要先开启AHB1总线上的GPIOH时钟。

那么又在哪里查看这个呢?还是中文参考资料中,6.3.12 RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR)

通过这里我们我们可以看到:

参考手册上说明,这个寄存器的第七位控制我们的GPIOH,置1,使能。

同样,配置GPIO寄存器时,也应该参考对应手册:

在知道这些流程之后,开始编写程序:

/*
    使用寄存器的方法点亮LED灯
  */
#include "./stm32f4xx.h"  


/**
  *   主函数
  */
int main(void)
{    
    /*开启 GPIOH 时钟,使用外设时都要先开启它的时钟*/
    RCC_AHB1ENR |= (1<<7);    //很明朗了,第七位要置1,使能时钟
    
    /* LED 端口初始化 */
    //根据上面的寄存器描述依次配置,这个技能是只要你去看,就会的东西
    /*GPIOH MODER10清空*/
    GPIOH_MODER  &= ~( 0x03<< (2*12));    
    /*PH10 MODER10 = 01b 输出模式*/
    GPIOH_MODER |= (1<<2*12);
    
    /*GPIOH OTYPER10清空*/
    GPIOH_OTYPER &= ~(1<<1*12);
    /*PH10 OTYPER10 = 0b 推挽模式*/
    GPIOH_OTYPER |= (0<<1*12);
    
    /*GPIOH OSPEEDR10清空*/
    GPIOH_OSPEEDR &= ~(0x03<<2*12);
    /*PH10 OSPEEDR10 = 0b 速率2MHz*/
    GPIOH_OSPEEDR |= (0<<2*12);
    
    /*GPIOH PUPDR10清空*/
    GPIOH_PUPDR &= ~(0x03<<2*12);
    /*PH10 PUPDR10 = 01b 上拉模式*/
    GPIOH_PUPDR |= (1<<2*12);
    
    /*PH10 BSRR寄存器的 BR10置1,使引脚输出低电平*/
    GPIOH_BSRR |= (1<<16<<12);
    
    /*PH10 BSRR寄存器的 BS10置1,使引脚输出高电平*/
    //GPIOH_BSRR |= (1<<10);

    while(1);

}

// 函数为空,目的是为了骗过编译器不报错
void SystemInit(void)//这个函数必须自己写一个加上,因为启动文件的关系,到后面会详细说这个问题
{    
}






/*********************************************END OF FILE**********************/

这个是我们自己用寄存器实现的例子,我的开发板有三个灯,分别接GPIOH10,11,12,所以更改了几次代码,这样也发现寄存器编程的一个问题,修改代码有点麻烦,而且还是有点冗余,虽然我们可以通过宏或者函数封装,但是,那样封装之后,他就是库函数版本了, 到后面,我们都会采用库函数的方式来学习,项目开发中肯定也是库函数首选。但是,我们经过自己配置寄存器这个步骤,知道了库函数底层其实也就是封装了配置好的寄存器而已,知道原理之后,我们还是应该才赢开发效率更高的库函数来进行应用。

以上是关于关于stc单片机做LED点亮和灭的时间控制程序问题?的主要内容,如果未能解决你的问题,请参考以下文章

4.STC15W408AS单片机点亮第一个LED

4.STC15W408AS单片机点亮第一个LED

8051单片机实战分析(以STC89C52RC为例) | 01 - 点亮一个LED

单片机控制8个灯依次亮,全亮了,再依次灭的c语言流程图,顺便加上解释,不然看不懂

用C语言编写,单片机控制LED灯并用定时器延时,每隔一秒使LED依次点亮,8 个灯

单片机一个接口怎么控制两个LED灯?!