点亮LED灯的STM32程序中为什么要首先设置外设时钟使能函数#define RCC_GPIO_LED RCC_APB2Periph_GPIOD

点亮LED灯的STM32程序中为什么要首先设置外设时钟使能函数#define RCC_GPIO_LED RCC_APB2Periph_GPIOD,第1张

stm32的每一个引脚都有始终控制,这样在不用的时候可以关闭时钟来达到节能的目的,所以,如果要使用外设,必须先打开时钟,否则没有办法进行 *** 作的。。。

具体函数是 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph,FunctionalState NewState)

RCC_APB2Periph是你要打开或者关闭的外设,NewState是enable或者disable为打开或者关闭…………

这个是与编程思想有关,你按键用的消抖方式是延时消抖,不是用状态机的编程方式,所以会如此

参考一下电路及代码

#include<reg51h>

#include<INTRINSH>

#define Key_State_0 0

#define Key_State_1 1

#define Key_State_2 2

#define unlock 0

#define lock   1

#define Init_DATA 999

unsigned char key1_state;

bit key1_debounce_flag;

bit key1_debounce;

sbit Key_1 = P1^0;

sbit seg1  = P1^7;

sbit seg2  = P1^6;

sbit seg3  = P1^5;

sbit seg4  = P1^4;

unsigned char time_1ms_flag,display_flag;

unsigned int  add_data;

unsigned char key1_debounce_C;

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void MCU_init(void)

{

TMOD = 0x01;

TH0  = 0xFC;

TL0  = 0x18;

EA   = 1;

ET0  = 1;

TR0  = 1;

add_data = Init_DATA;

}

void MCU_clock(void)

{

if(time_1ms_flag==1)

{

time_1ms_flag = 0;

display_flag++;

if(display_flag == 4)

{

display_flag = 0;

}

if(key1_debounce_flag==unlock)

{

key1_debounce_C++;

if(key1_debounce_C==20)

{

key1_debounce_C = 0;

key1_debounce_flag = lock;

key1_debounce = 1;

}

}

}

}

void display(void)

{

switch(display_flag)

{

case 0:

seg4 = 0;

P2=table[add_data/1000];

seg1 = 1;

break;

case 1:

seg1 = 0;

P2=table[add_data%1000/100];

seg2 = 1;

break;

case 2:

seg2 = 0;

P2=table[add_data%100/10];

seg3 = 1;

break;

case 3:

seg3 = 0;

P2=table[add_data%10];

seg4 = 1;

break;

}

}

void Key_1_Scan (void)

{

bit key_press;

key_press = Key_1;

switch(key1_state)

{

case Key_State_0:

if(!key_press)

{

key1_state = Key_State_1;

key1_debounce_flag = unlock;

}

break;

case Key_State_1:

if(key1_debounce==1)

{

key1_debounce = 0;

if(!key_press)

{

key1_state = Key_State_2;

}

else

{

key1_state = Key_State_0;

}

}

break;

case Key_State_2:

if(key_press)

{

key1_state = Key_State_0;

add_data++;

if(add_data==10000)

{

add_data = 0;

}

}

break;

}

}

void main (void)

{

MCU_init();

while (1)

{

MCU_clock();

Key_1_Scan();

display();

}

}

void Timer0Interrupt(void) interrupt 1

{

TH0 = 0xFC;

TL0 = 0x18;

time_1ms_flag = 1;

}

#include<reg51h>

unsigned char seven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90};

unsigned char flash,mode=0;

char min=50,hour=12,hour_rom,min_rom,sec=25;

unsigned char j,k;

unsigned int i;

unsigned char key_set_s,key_up_s,key_down_s,key_reset_s;

sbit P0_7=P0^7;

sbit key_set=P3^4;

sbit key_up=P3^5;

sbit key_down=P3^6;

sbit key_reset=P3^7;

sbit buzzer=P1^0;

bit dop,bb;    //声明

void delay(unsigned int x)     //延时

{

while(x--);

}

void timer0_isr(void) interrupt 1    //中断服务函数

{

TH0=0xf8;     //为65535-2000=63535转化为16进制取高八位

TL0=0x2f;    //取低八位

i++;

bb=!bb;

if(i>=250)     //半秒,五百一秒

{

i=0;

k++;

flash=~flash;

dop=!dop;

}

if(k>=2)     //大于二归零

{

k=0;

sec++;

}

if(sec>=60)      //秒

{

sec=0;

min++;

}

if(min>=60)     //分

{

min=0;

hour++;

}

if(hour>=24)   //小时

hour=0;

P0=0xff;  //P0初始化为全1 11111111

if(mode==0)   //正常显示

{

switch(j)   //控制语句

{

case 0:P0=seven_seg[sec%10];P2=0xfe;break;  //秒个位

case 1:P0=seven_seg[sec/10];P2=0xfd;break;  //秒十位

case 2:P0=seven_seg[min%10];P0_7=dop;P2=0xfb;break;

case 3:P0=seven_seg[min/10];P2=0xf7;break;

case 4:P0=seven_seg[hour%10];P0_7=dop;P2=0xef;break; //dop为小数点

case 5:P0=seven_seg[hour/10];P2=0xdf;break;

}

}

////////////////////

if(mode==1)     //模式一 C1状态

{

switch(j)

{

case 0:P0=seven_seg[min%10];P2=0xfe;break;

case 1:P0=seven_seg[min/10];P2=0xfd;break;

case 2:P0=seven_seg[hour%10]| flash;P2=0xfb;break;    //flash为闪烁

case 3:P0=seven_seg[hour/10]| flash;P2=0xf7;break;

case 4:P0=seven_seg[1];P2=0xef;break;    //1为C1状态

case 5:P0=0xc6;P2=0xdf;break;     //0xc6为显示C

}

}

////////////////////

if(mode==2)      //模式二   C1状态

{

switch(j)

{

case 0:P0=seven_seg[min%10]| flash;P2=0xfe;break;

case 1:P0=seven_seg[min/10]| flash;P2=0xfd;break;

case 2:P0=seven_seg[hour%10];P2=0xfb;break;

case 3:P0=seven_seg[hour/10];P2=0xf7;break;

case 4:P0=seven_seg[1];P2=0xef;break;

case 5:P0=0xc6;P2=0xdf;break;

}

}

////////////////////

if(mode==3)    //模式三  C2状态

{

switch(j)

{

case 0:P0=seven_seg[min_rom%10];P2=0xfe;break;

case 1:P0=seven_seg[min_rom/10];P2=0xfd;break;

case 2:P0=seven_seg[hour_rom%10]| flash;P2=0xfb;break;

case 3:P0=seven_seg[hour_rom/10]| flash;P2=0xf7;break;

case 4:P0=seven_seg[2];P2=0xef;break;

case 5:P0=0xc6;P2=0xdf;break;

}

}

////////////////////

if(mode==4)      //模式四  C2状态

{

switch(j)

{

case 0:P0=seven_seg[min_rom%10]| flash;P2=0xfe;break;

case 1:P0=seven_seg[min_rom/10]| flash;P2=0xfd;break;

case 2:P0=seven_seg[hour_rom%10];P2=0xfb;break;

case 3:P0=seven_seg[hour_rom/10];P2=0xf7;break;

case 4:P0=seven_seg[2];P2=0xef;break;

case 5:P0=0xc6;P2=0xdf;break;

}

}

j++;

if(j>=6)

j=0;

}

void key(void)     //调用开关函数

{

////////////////

if(key_set==0)   //设置

{

delay(300);

if(key_set==0)

key_set_s=1;

}

if(key_set==1&&key_set_s==1)

{

mode++;

if(mode>=5)

mode=1;

key_set_s=0;

}

//////  ///

if(key_up==0)    //上调

{

delay(300);

if(key_up==0)

key_up_s=1;

}

if(key_up==1&&key_up_s==1)

{

if(mode==1)hour++;

if(mode==2)min++;

if(mode==3)hour_rom++;if(hour_rom>=24)hour_rom=0;

if(mode==4)min_rom++;if(min_rom>=60)min_rom=0;

key_up_s=0;

}

/////////////////

if(key_down==0)     //下调

{

delay(300);

if(key_down==0)

key_down_s=1;

}

if(key_down==1&&key_down_s==1)

{

if(mode==1)hour--;if(hour<0)hour=23;

if(mode==2)min--; if(min<0)min=59;

if(mode==3)hour_rom--;if(hour_rom<0)hour_rom=23;

if(mode==4)min_rom--;if(min_rom<0)min_rom=59;

key_down_s=0;

}

/////////////////

if(key_reset==0)     //复位

{

delay(300);

if(key_reset==0)

key_reset_s=1;

}

if(key_reset==1&&key_reset_s==1)

{

key_reset_s=0;

mode=0;

}

}

void timer0_init(void)   //timero初始化函数

{

TMOD=0x01;    //方式1

TH0=0xf8;

TL0=0x2f;

EA=1; //中断开关

ET0=1;  //中断小开关

TR0=1;  //开始计数

}

void main(void)      //主函数

{

timer0_init();

while(1)

key();

{

if(hour==hour_rom&&min==min_rom)

buzzer=bb;    //buzzer为蜂鸣器

}

}

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

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

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

在main函数中添加延时函数,以实现上电后30秒后LED灯开始点亮的要求。

下面是一个简单的示例程序,仅供参考:

#include<reg52h>

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秒后灭掉,最后芯片不工作。需要注意的是,示例程序仅供参考,具体实现方式需要根据实际情况进行调整和优化。

手工打造的摇摆led时钟日期:2009-11-13 00:38:16点击:383这个小制作原材料易找,一两分钟就可以搞定,可以让身边的小朋友试试手脚具有过流保护的直流可调稳压电源 本电源的主要器件是通用稳压集成块lm723,内部 <a href=">

以上就是关于点亮LED灯的STM32程序中为什么要首先设置外设时钟使能函数#define RCC_GPIO_LED RCC_APB2Periph_GPIOD全部的内容,包括:点亮LED灯的STM32程序中为什么要首先设置外设时钟使能函数#define RCC_GPIO_LED RCC_APB2Periph_GPIOD、单片机时钟程序时钟设置问题、谁有proteus LED点阵时钟仿真,最好proteus图形,单片机是c51的哦,程序是c语言的哦急急急!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9724091.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存