
用于设置MCU的时钟,两个参数,前一个(OSC)用于选择内部晶振还是外部晶振,这能是HSE或者HSI,这个在H文件中有定义;
第二个参数 Clock,范围0~25,对应不同的主频,具体值看程序里面switch语句部分就明白了;
然后要说一点,HSE_VALUE 和 HSI_VALUE是外部和内部晶振的频率,这个值在 stm32f4xx.h 里面有定义的,如果是你自己做的板子,那么就需要根据你所采用的晶振数值到stm32f4xx.h里面把 HSE_VALUE 修改一下即可;
SysClockGet(void)函数用来获取当前MCU主频,返回值的单位是Hz;
再PS:用此程序,可以动态的调整MCU主频,就是在MCU运行中,根据实际工作量的多少升降主频,我试过,蛮好使的,而且可以超频,216MHz没有问题,240MHz要看芯片体质,有些可以长时间运行,260MHz,更要看体质了,反正我的芯片是真呢过跑个几分钟,然后就死机了。
这个是与编程思想有关,你按键用的消抖方式是延时消抖,不是用状态机的编程方式,所以会如此
参考一下电路及代码
#include<reg51.h>#include<INTRINS.H>
#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
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)