STM8S蜂鸣器模块的使用:
蜂鸣器的功能:
外部晶体时钟的HSE高速的时钟源不管输入到预分频器前是多少MHz,最终的经过的预分频器的得到的时钟的频率都是128KHz。然后在同过选项字节CKAWUSEL选择是LSI RC 128KHz还是HSE分频后得到的128KHz。在这里可以将得到的128KHz的时钟信号通过AWU_CSR寄存器的MSR链接到TIM3定时器的输入捕捉中断,来测量得到的LSI 128KHz时钟是否准确。
并将得到的128KHz的频率写入BEEP_CSR寄存器BEEPDIV 5位的蜂鸣器程序计数器BEEPDIV在分频得到大约8KHz的频率。寄存器BEEP_CSR中的BEEPEN位用于使能BEEP输出。
如何操作蜂鸣器模块:
蜂鸣器的控制寄存器:
特别的需要注意使用蜂鸣器的时候需要更改选项字节,因为PD4引脚和beep引脚是一个复用功能的引脚,默认情况下使用的是正常的GPIO输入和输出。
自动唤醒:活跃停机直白的说就是在你睡觉的时候有一个闹钟定时的将你叫醒。
自动唤醒模块的功能:
自动唤醒模块的编程向导:
自动唤醒的时间间隔:
#include <STM8S208R.h>
const unsigned char table0[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; // 共阴码表无点
const unsigned char table1[]= {0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef}; // 共阴码表有点
unsigned char TIME; //定义输出时间变量
void Delay_Ms(unsigned int ms);
void Delay_Us(unsigned char t);
void Seg_Init(void);
void Display(unsigned int num);
void Beep_Init(void);
/************主函数************/
main()
{
CLK_SWCR = 0x02; //使能时钟切换
CLK_SWR = 0xB4; //时钟源为HSE 0xB4 HSI 0xE1 LSI 0xD2
Seg_Init(); //数码管驱动初始化
Beep_Init(); //BEEP初始化
while(1)
{
TIME++;
if(TIME>50)
{
BEEP_CSR = 0x0e; //暂停蜂鸣器
Display(0); //数码管显示 0000
}
else
{
BEEP_CSR = 0x2e; //启动蜂鸣器 BEEP_CSR=0010 1110e
Display(1111); //数码管显示 1111
}
}
}
/************数码管初始化函数************/
void Seg_Init(void)
{
PB_DDR = 0xFF; // 将PB口设置成推挽输出
PB_CR1 = 0xFF;
PB_CR2 = 0x00;
PF_DDR |= 0xF0; // 将PF口高四位设置成推挽输出
PF_CR1 |= 0xF0;
PF_CR2 &= 0x00;
PE_DDR |= 0x01; // 将PE0设置成推挽输出 SEGEN
PE_CR1 |= 0x01;
PE_CR2 &= 0x00;
PE_ODR &= 0xFE; // PE0=0,使能数码管
}
/************延时MS函数************/
void Delay_Ms(unsigned int ms)
{
unsigned int x,y;
for(x=ms;x>0;x--)
{
for(y=300;y>0;y--)
{
}
}
}
/************延时uS函数************/
void Delay_Us(unsigned char t)
{
unsigned char m=t;
while(m--);
}
/************显示函数************/
void Display(unsigned int num)
{
unsigned char GeWei,ShiWei,BaiWei,QianWei;
GeWei = num%10;
ShiWei = num%100/10;
BaiWei = num%1000/100;
QianWei = num/1000;
PB_ODR = table0[GeWei];
PF_ODR = 0xE0;
Delay_Ms(3);
PB_ODR = 0;
PF_ODR = 0xF0;
Delay_Ms(1);
PB_ODR = table0[ShiWei];
PF_ODR = 0xD0;
Delay_Ms(3);
PB_ODR = 0;
PF_ODR = 0xF0;
Delay_Ms(1);
PB_ODR = table0[BaiWei];
PF_ODR = 0xB0;
Delay_Ms(3);
PB_ODR = 0;
PF_ODR = 0xF0;
Delay_Ms(1);
PB_ODR = table0[QianWei];
PF_ODR = 0x70;
Delay_Ms(3);
PB_ODR = 0;
PF_ODR = 0xF0;
Delay_Ms(1);
}
/************BEEP初始化函数************/
void Beep_Init(void)
{
PD_DDR = 0x10; // 将PD4口设置成推挽输出
PD_CR1 = 0x10;
PD_CR2 = 0x00;
BEEP_CSR = 0x32; //BEEP_CSR=0000 1110 输出频率=Fls/(8*BEEPDIV)
}