1. 實(shí)驗(yàn)功能:本實(shí)驗(yàn)的功能是利用STM8單片機(jī)控制蜂鳴器發(fā)出和弦聲音。
2. 電路原理:按鍵接PB2口,蜂鳴器接PD4口,當(dāng)按下按鍵時STM8利用TIM2的PWM模式驅(qū)動蜂鳴器就發(fā)出“123”的和弦聲音。
3. 采用IAR FOR STM8開發(fā)環(huán)境,外部晶振16M。
4. 程序代碼如下:
/********************************************************************************
* 文件名稱:STM8_Buzzer.c
* 開發(fā)環(huán)境:IAR FOR STM8 1.20
********************************************************************************/
#include "iostm8s105s4.h"
#define uchar unsigned char
#define uint unsigned int
uchar SysDeal_Flag = 0;
uchar Sys_Count = 0;
uchar SendData_Flag =0;
uchar K_Flag = 0;
#define Sys_Time 99 //100*4us = 400us
#define Sys_Prescaler 6 //2^6 = 64
#define Key_In_Power PB_IDR_IDR2
#define Key_Delay 10
uchar Key_In = 0;
uchar Key_Value = 0;
uchar Key_Flag = 0;
#define BELL_PWM1 640 //320us
#define BELL_PWM2 564 //282us
#define BELL_PWM3 540 //270us
#define BELL_PWM4 460 //230us
#define BELL_PWM5 408 //204us
#define Buzzer_Stop() (TIM2_CR1 = 0x00)
#define BELL_MODE2 0
uchar Buz_Time = 0;
uchar Buz_State = 0;
uchar Buz_Mode = 0;
uchar Buz_Start = 0;
const uint BUZ_PWMTAB[][11]=
{
{BELL_PWM3,BELL_PWM3, BELL_PWM4,BELL_PWM4, BELL_PWM5,BELL_PWM5, 0xff,0xff,0xff,0xff,0xff}
};
const uchar BUZ_TIMETAB[][11]=
{
{8,10,6,10,6,20,0xff,0xff,0xff,0xff,0xff}
};
void Delay_ms( uint ms )
{
uint i,j;
for( j=0; j
for( i=0; i<1000; i++ )
{;}
}
}
void CLK_Init(void)
{
CLK_ECKR=0x03;//外部時鐘寄存器 外部時鐘準(zhǔn)備就緒,外部時鐘開
CLK_SWCR=0x02;//切換控制寄存器 使能切換機(jī)制
CLK_SWR=0xB4;//主時鐘切換寄存器 選擇HSE為主時鐘源*/
while (!(CLK_SWCR & 0x08));
CLK_CSSR=0x01;//時鐘安全系統(tǒng)寄存器
}
void SysClk_Init(void)
{
asm("sim");
TIM4_IER = 0x00; //禁止中斷
TIM4_EGR = 0x01; //允許產(chǎn)生更新事件
TIM4_PSCR = Sys_Prescaler;
TIM4_ARR = Sys_Time;
TIM4_CNTR = Sys_Time;
//定時周期= 400us
TIM4_CR1 = 0x01;
TIM4_IER = 0x01;
asm("rim");
}
#pragma vector = TIM4_OVR_UIF_vector
__interrupt void TIM4_OVR_UIF(void)
{
TIM4_SR = 0x00;
Sys_Count ++;
//---------------------------------------
if( Sys_Count % 5 == 1 ) //2ms
{
SysDeal_Flag = 1;
}
else if(Sys_Count == 5)
{
SendData_Flag =1;
}
else if(Sys_Count >= 15)
{
Sys_Count = 0;
}
else
{
K_Flag = 1;
}
}
void Buzzer_Init(void)
{
PD_DDR |= 0x90; // 配置PD4方向?yàn)檩敵?br/> PD_CR1 |= 0x90; // 設(shè)置PD4推挽輸出
PD_CR2 &= 0x6f;
//------------------------------------
TIM2_PSCR = 3; //8分頻。f=16m/8=2m----0.5us
TIM2_CCMR1 = 0x70; // PWM 模式 2
TIM2_CCER1 = 0x03; // CC1配置為輸出
}
void Buzzer_Pwm(uint timenum)
{
TIM2_ARRH = (uchar)(timenum>>8);
TIM2_ARRL = (uchar)(timenum);
TIM2_CCR1H = (uchar)(timenum>>9);
TIM2_CCR1L = (uchar)(timenum>>1);
TIM2_CR1 = 0x01; // 計(jì)數(shù)器使能,開始計(jì)數(shù)
}
void Bell_DealFun(void)
{
static uchar index = 0;
switch( Buz_State )
{
case 0:
Buz_Time = 0;
Buzzer_Stop();
index = 0;
if( Buz_Start == 1 )
{
Buz_State ++;
Buzzer_Pwm( BUZ_PWMTAB[Buz_Mode][index] );
}
break;
case 1:
Buz_Time++;
if( Buz_Time >= BUZ_TIMETAB[Buz_Mode][index] )
{
Buz_Time = 0;
Buz_State = 2;
index ++;
if( BUZ_TIMETAB[Buz_Mode][index] == 0xff )
{
Buz_State = 0;
Buzzer_Stop();
Buz_Start = 0;
}
else
{
Buzzer_Pwm( BUZ_PWMTAB[Buz_Mode][index] );
}
}
break;
case 2:
Buz_Time++;
if( Buz_Time >= BUZ_TIMETAB[Buz_Mode][index] )
{
Buz_Time = 0;
Buz_State = 1;
index ++;
if( BUZ_TIMETAB[Buz_Mode][index] == 0xff )
{
Buz_State = 0;
Buzzer_Stop();
Buz_Start = 0;
}
else
{
Buzzer_Pwm( BUZ_PWMTAB[Buz_Mode][index] );
}
}
break;
default:
Buz_State = 0;
Buz_Time = 0;
index = 0;
break;
}
}
void Buzzer_Start(uchar mode)
{
if( Buz_Start == 0 )
{
Buz_Mode = mode;
Buz_Start = 1;
}
}
void Get_Key(void)
{
Key_In = 0;
if(!Key_In_Power)
{
Key_In |= 0x01;
}
}
uchar Scan_Key(void)
{
static uchar Key_Task=0,Key_Count=0;
switch( Key_Task )
{
case 0:
if( Key_In != 0 )
{
Key_Task = 1;
Key_Count = 0;
}
break;
case 1:
Key_Count++;
if( Key_Count >= Key_Delay )
{
Key_Task = 2;
Key_Count = 0;
}
break;
case 2:
if( Key_In != 0 )
{
Key_Task = 3;
Key_Count = 0;
Key_Value = Key_In;
return(1);
}
else
{
Key_Task = 0;
}
break;
case 3:
if( Key_In == 0 )
{
Key_Task = 0;
Key_Count = 0;
}
break;
default:
Key_Task = 0;
Key_Count = 0;
break;
}
return(0);
}
上一篇:STM8學(xué)習(xí)筆記---利用UID碼實(shí)現(xiàn)開機(jī)產(chǎn)生隨機(jī)數(shù)
下一篇:STM8學(xué)習(xí)筆記---如何在程序中確定寄存器名稱
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 再續(xù)點(diǎn)評Vishay視頻 搶樓拿獎進(jìn)行到底
- 瑞薩電子邊緣AI 技術(shù)研討會——深圳站, 火熱報(bào)名中,參會有好禮!
- Murata旗艦店1周年淘寶直播
- EEWORLD社區(qū)7月明星人物出爐
- 安世半導(dǎo)體理想二極管與負(fù)載開關(guān),保障物聯(lián)網(wǎng)應(yīng)用的穩(wěn)健高效運(yùn)行
- 國產(chǎn)FPGA安路科技研討會-北京站 火熱報(bào)名中,參會贏京東卡!
- 看帖打卡賺現(xiàn)金:挑戰(zhàn)21天學(xué)習(xí)freertos,打卡成長&賺外快
- 【0元得開發(fā)板,還能贏T12焊臺,報(bào)名倒計(jì)時】Follow me,與得捷一起解鎖開發(fā)板超能力!
- 消費(fèi)級機(jī)器人平臺可以科技獲數(shù)千萬美元融資,小米、順為資本領(lǐng)投
- 分揀機(jī)器人碰撞:致電商倉庫起火
- 企業(yè)選擇立柱碼垛機(jī)的原因
- 機(jī)器人精準(zhǔn)完成高難度直腸癌手術(shù)
- 深圳完成首批工業(yè)機(jī)器人系統(tǒng)操作員職業(yè)技能等級認(rèn)定
- 報(bào)道稱HTC加入5G行列:或7月推出首款5G手機(jī)
- realme 6s即將上市:聯(lián)發(fā)科G90T+4800萬像素主攝
- 蘋果最晚今年11月發(fā)布iPhone 12:四款機(jī)型均支持5G
- OPPO Reno 4系列爆料:65W超級閃充加持
- 金立回歸送大禮:8+128只需899