如果有,可以參考以下套路:是韋雪電子購買的官方套件CD中的壹個示例程序。不知道能不能幫到妳!如果有積分,給點積分用用,嘿嘿!
/*============================================================================*/
/*項目:通過STM8定時器2 PWM演示系統驅動蜂鳴器*/
/*模塊:main.c */
/*編譯器:STM8宇宙C編譯器*/
/*日期:2009年2月*/
/* - */
/*描述:STM8迷妳套件的演示固件*/
/*通過蜂鳴器播放壹首曲子。*/
/*============================================================================*/
/******************************************************************************
*
*本固件僅供參考,旨在為客戶提供
*提供有關其產品的編碼信息,以便他們保存
*時間。因此,意法半導體不對任何
*與任何索賠相關的直接、間接或後果性損害
*此類固件的內容和/或客戶對
*此處包含的與其產品相關的編碼信息。
*
*版權所有2008意法半導體
******************************************************************************
*/
/*包括- */
#包含" STM8S105C_S.h" /*寄存器和存儲器映射文件。*/
/******************************************************************************/
/*宏定義
/******************************************************************************/
/*音樂說明和音符編碼。*/
#define _END_ 0xFF /*音樂結束。*/
#define _PAUSE_ 0xFE /*在不同曲調之間暫停。*/
/*音符音調定義......*/
#define _FA0 0x00 /* FA- */
#define _SOL0 0x01 /* SOL- */
#define _LA0 0x02 /* LA- */
#define _SI0 0x03 /* SI- */
#define _DO 0x04 /* DO */
#define _RE 0x05 /* RE */
#define _MI 0x06 /* MI */
#define _FA 0x07 /* FA */
#define _SOL 0x08 /* SOL */
#define _LA 0x09 /* LA */
#define _SI 0x0A /* SI */
#define _DO2 0x0B /* DO+ */
#define _M 0x0C /*靜音*/
#define _RE2 0x0D /* RE+ */
#define _SOL2 0x0E /* SOL+ */
#define _FAd 0x0F /* FA# */
/*音符長度定義......*/
#定義sq 0x10 /*半八分音符。*/
#定義q 0x20 /*八分音符。*/
#定義qp 0x30 /* 1.5八分音符。*/
#定義c 0x40 /*古怪音符。*/
#定義cn 0x60 /* 1.5分音符。*/
#定義m 0x80 /*最小音符。*/
/*音符在這裏由音調和長度兩部分的組合來定義
使用AND二進制運算符很容易檢索:註意=音調+長度,
和音調& amp長度=0*/
/******************************************************************************/
/* RAM段變量*/
/******************************************************************************/
/*用於存儲ADC結果的全局變量。*/
無符號整數AD _ Value
/*全局變量,用於存儲更改八度音階時按下的鍵。*/
無符號字符Flag _ Octave _ Chg
/*全局變量用作音符數組的索引:在曲調中的位置。*/
unsigned int current _ note = 0;
/*用作註釋數組索引的全局變量。*/
無符號字符c1,c 1 _ buf;
/*音樂音符編碼~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */
/* FA0 SOL0 LA0 SI0 DO RE MI FA SOL拉斯DO2 MUTE RE2 SOL2 FA# */
/* TIM2 CCR1高字節。*/
const unsigned char Low _ Note _ h[]/*低八度音*/
={0x2C,0x27,0x23,0x1F,0x1D,0x1A,0x17,0x16,0x13,0x11,0x0F,0x0E,0x00,0x0D,0x09,0x 15 };
const unsigned char Hi_Note_h[] /*高八度*/
={0x16,0x13,0x11,0x0F,0x0E,0x0D,0x0B,0x0B,0x09,0x08,0x07,0x07,0x00,0x06,0x04,0x0A };
/* TIM2 CCR1低位字節。*/
const unsigned char Low _ Note _ l[]/*低八度音*/
={0xA4,0xDC,0x82,0xA1,0xEE,0xA9,0xAC,0x62,0xEE,0xC1,0xD0,0xF0,0x00,0x4F,0xF7,0x2C };
const unsigned char Hi_Note_l[] /*高八度*/
={0x52,0xEE,0xC1,0xD0,0xF7,0x54,0xD6,0x31,0xF7,0xE0,0xE8,0x78,0x00,0xA7,0xFB,0x 96 };
/*實際的曲調序列:壹組音符。*/
const unsigned char tune[] =
{
_M+sq,_M+sq,/*平滑管理所需的兩個“緩沖”靜音*/
/*當前註釋/當前註釋初始化比較。*/
/* -做我想做的事拉斯DO2 - */
/* - DO2 SI LA SOL FA MI RE DO - */
_DO+c,_RE+c,_MI+c,_FA+c,_SOL+c,_LA+c,_SI+c,_DO2+c,_M+m,_PAUSE_,
_DO2+c,_SI+c,_LA+c,_SOL+c,_FA+c,_MI+c,_RE+c,_DO+c,_M+m,_PAUSE_,
/* -新年快樂。
_DO+c,_DO+c,_DO+c,_M+sq,_DO+m,_SOL0+m,_MI+c,_M+sq,_MI+m,_DO+m,_DO+c,
_MI+c,_M+sq,_SOL+m,_SOL+m,_FA+c,_MI+c,_M+sq,_RE+m,_M+sq,_RE+c,_MI+c,
_FA+m,_M+sq,_FA+m,_MI+c,_RE+c,_MI+m,_DO+m,_M+sq,_DO+c,_MI+c,_RE+m,_SOL0+m,
_SI0+c,_RE+c,_DO+m,_DO+m,_PAUSE_,
/* -兩只老虎。
_DO+c,_RE+c,_MI+c,_DO+c,_DO+c,_RE+c,_MI+c,_DO+c,_MI+c,_FA+c,_SOL+m,_MI+c,
_FA+c,_SOL+m,_SOL+qp,_LA+sq,_SOL+qp,_FA+sq,_MI+c,_DO+c,_SOL+qp,_LA+sq,
_SOL+qp,_FA+sq,_MI+c,_DO+c,_M+sq,_DO+c,_SOL0+c,_DO+m,_M+sq,_DO+c,_SOL0+c,
_DO+m,_M+sq,_PAUSE_,
/* -甜蜜的蜂蜜。
_MI+m,_SOL+c,_LA+c,_MI+m,_MI+c,_DO+c,_RE+cn,_DO+q,_RE+c,_MI+q,_SOL+q,_MI+m,
_MI+m,_RE+c,_RE+c,_RE+c,_RE+q,_MI+q,_RE+q,_DO+cn,_LA0+q,_SOL0+cn,_DO+m,
_DO+c、_RE+c、_MI+cn、_RE+q、_MI+q、_RE+q、_SOL+q、_RE+m、_RE+m、_RE+m、_RE+m、
_MI+m,_SOL+c,_LA+c,_MI+m,_MI+c,_DO+c,_RE+cn,_DO+q,_RE+c,_MI+q,_SOL+q,_MI+m,
_MI+m,_RE+c,_RE+c,_RE+c,_RE+q,_MI+q,_RE+q,_DO+cn,_LA0+q,_SOL0+cn,_DO+m,
_DO+c,_MI+c,_RE+q,_DO+q,_DO+c,_LA0+q,_SOL0+cn,_DO+m,_DO+m,_DO+m,_DO+m,_MI+m,
_MI+m、_SOL0+m、_LA0+q、_DO+q、_SOL0+q、_DO+m、_DO+m、_DO+m、_DO+m、_LA0+c、
_SI0+c,_LA0+c,_SI0+c,_LA0+c,_LA0+q,_DO+q,_SOL0+q,_SOL0+c,_MI+m,_MI+m,
_MI+m、_MI+m、_LA0+c、_SI0+c、_SI0+c、_LA0+c、_LA0+q、_DO+q、_LA0+q、_SOL0+q、
_SOL0+c,_MI+m,_MI+m,_MI+m,_M+c,_SOL+q,_SOL+m,_M+c,_SOL+q,_LA+q,_SOL+m,
_M+c,_SOL+q,_SOL+q,_SOL+c,_SOL+q,_SOL+c,_ SOL+q,_LA+q,_SOL+m,_SOL+m,
_MI+m,_SOL+c,_LA+c,_MI+m,_MI+c,_DO+c,_RE+cn,_DO+q,_RE+c,_RE+q,_SOL+q,_MI+m,
_MI+m,_RE+c,_RE+c,_RE+c,_RE+q,_MI+q,_RE+q,_DO+cn,_LA0+q,
_SOL0+cn,_DO+m,_DO+c,_MI+c,_RE+q,_DO+q,_DO+c,_LA0+q,_SOL0+cn,_DO+m,_DO+m,
_DO+m,_DO+m,_MI+m,_MI+m,_SOL0+m,_LA0+q,_SOL0+q,_LA0+q,_DO+m,_DO+m,
_DO+m,_DO+m,_PAUSE_,
/* - _END_ marks到樂曲的結尾- */
_END_
};
/******************************************************************************/
/*函數定義*/
/******************************************************************************/
/* - */
/*例程名:Buzz_Init */
/*輸入/輸出:無。*/
/*描述:將TIM2初始化為用於蜂鳴器控制的PWM模式。*/
/* - */
void Buzz_Init ( void)
{
PD _ DDR | = 0x 10;/*將PD4配置為輸出(用於PWM)。*/
PD _ Cr 1 | = 0x 10;/* PD4推挽輸出。*/
Tim 2 _ ccmr 1 | = 0x 70;/*輸出模式PWM2。*/
Tim 2 _ ccer 1 | = 0x 03;/* CC極性低,使能PWM輸出*/
Tim 2 _ ARR = 0;/*頻率控制寄存器:ARR */
Tim 2 _ CCR 1 = 0;/*占空比控制寄存器:CCR */
Tim 2 _ PSCR | = 0x 00;/* fCK_CNT等於fCK_PSC。*/
Tim 2 _ Cr 1 | = 0x 01;/*啟用TIM2。*/
current _ note = 1;
}
/* - */
/*例程名:Buzz_Wait */
/*輸入/輸出:音符持續時間(4位MSB信息)/無。*/
/*描述:1)采樣AIN電壓並存儲在AD_Value中。*/
/* 2)票據持續時間的輪詢等待程序(基於4毫秒延遲)。*/
/*持續時間:八分音符(2)、四分音符(4)或二分音符(8)選擇。*/
/* - */
void Buzz_Wait(無符號字符持續時間)
{
int I = 0;
無符號字符UC = 0;
無符號長整型;
/* ADC單模式下的采樣AIN電壓。*/
ADC _ Cr 1 | = 0x 01;/*首先將ADON設置為給ADC模塊加電。*/
I = 6;/*等待& gt7us,以確保ADC上電完成。*/
while(I-);
ADC _ Cr 1 | = 0x 01;/*再次設置ADON以啟動AD轉換。*/
而(!(ADC _ CSR & amp0x 80));/*等待AD轉換完成(EOP=1)。*/
/*將ADC值存儲到AD_Value */
AD _ Value =((((unsigned int)ADC _ DRH)& lt;& lt2)+ADC _ DRL)& gt;& gt2;
if(AD _ Value & lt;0x01)
{ AD _ Value = 0x 01;}
if(AD _ Value & gt;0xC0)
{ AD _ Value = 0xC0}
if (Flag_Octave_Chg==1)
{
temp =((((unsigned int)Low _ Note _ h[c 1 _ buf])& lt;& lt8)+Low _ Note _ l[c 1 _ buf]);
}
其他
{
temp =((((unsigned int)Hi _ Note _ h[c 1 _ buf])& lt;& lt8)+Hi _ Note _ l[c 1 _ buf]);
}
Temp =(Temp * AD _ Value)& gt;& gt9;
/*新的占空比值寫入CCR */
TIM2_CCR1H=(無符號字符)(((無符號整數)Temp & amp0xff00)>& gt8);
Tim 2 _ CCR 1L =(unsigned char)((unsigned int)Temp & amp;0x 00 ff);
/*延遲時間=持續時間* Y */
while(UC & lt;持續時間)/*下面的循環運行“持續時間”次。*/
{
while(我& lt1200 ) /*此循環“Y”等待大約4.3毫秒,*/
{
i++;
}
I = 0;
uc++;
}
}
/* - */
/*例程名:Buzz_PlayTune */
/*輸入/輸出:無。*/
/*描述:播放樂譜(壹次播放壹首曲子)。*/
/* - */
void Buzz_PlayTune ( void)
{
未簽名的ui;
無符號長整型temp _ DCR;
無符號字符溫度;
while(1)
{
if(tune[current_note] == _END_)
{
/*音樂結束,重置為開始。1在*/處是靜音
/*音符數組的開頭;不同於0。*/
current _ note = 1;
打破;
}
else if(tune[current _ note]= = _ PAUSE _)
{
/*樂曲結束,保存樂曲中的位置,停止演奏。*/
current _ note++;
打破;
}
其他
{
c 1 = tune[current _ notes];
/*將音符(或靜音)載入相關寄存器*/
/*音符信息僅由4個最低位攜帶。*/
c 1 _ buf = c 1 & amp;0x0f
if (Flag_Octave_Chg==1)
{
temp _ DCR =((((unsigned int)Low _ Note _ h[c 1 _ buf])& lt;& lt8)+Low _ Note _ l[c 1 _ buf]);
Tim 2 _ ARRH = Low _ Note _ h[c 1 _ buf];
Tim 2 _ ARRL = Low _ Note _ l[c 1 _ buf];
}
其他
{
temp _ DCR =((((unsigned int)Hi _ Note _ h[c 1 _ buf])& lt;& lt8)+Hi _ Note _ l[c 1 _ buf]);
Tim 2 _ ARRH = Hi _ Note _ h[c 1 _ buf];
Tim 2 _ ARRL = Hi _ Note _ l[c 1 _ buf];
}
臨時DCR =(臨時DCR *廣告價值)& gt& gt9;
/*新的占空比值寫入DCR0。*/
temp=((無符號整數)temp _ DCR & amp;0xff00)>& gt8;
TIM2_CCR1H=(無符號字符)temp
temp=((無符號整數)temp _ DCR & amp;0x 00 ff);
TIM2_CCR1L=(無符號字符)temp
/*等待音符的持續時間。*/
/*持續時間信息由4個最高位攜帶。*/
等待(c 1 & amp;0xf 0);
/*在音符陣列中前進:曲調。*/
current _ note++;
}
}
}
/* - */
/*例程名:GPIO_Init */
/*輸入/輸出:無。*/
/*描述:初始化TLI LED的GPIO。*/
/* - */
void GPIO_Init(void)
{
/* LED IO配置*/
/* LD3: PD3 */
/* LD2: PD1 */
/* LD1: PD0 */
PD _ DDR | = 0x0D/*輸出。*/
PD _ Cr 1 | = 0x0D;/*推拉。*/
PD _ CR2 = 0x00/*輸出速度高達2MHz。*/
/* PD7外部中斷*/
EXTI _ Cr 1 = 0x 00;/*外部中斷(TLI)靈敏度。*/
EXTI _ CR2 = 0x00
PD _ DDR & amp= ~ 0x80/* PD7: Input */
PD _ CR2 | = 0x80/*啟用TLI中斷。*/
}
/* - */
/*例程名:CLK _初始化*/
/*輸入/輸出:無。*/
/*描述:初始化時鐘源*/
/* - */
void CLK_Init(void)
{
/*配置HSI預分頻器*/
CLK _ CKDIVR & amp;= ~ 0x 10;/* 01: fHSI= fHSI RC輸出/2。*/
/*配置CPU時鐘預分頻器*/
CLK _ CKDIVR | = 0x 01;/* 001: fCPU=fMASTER/2。*/
}
/* - */
/*例程名:ADC_Init */
/*輸入/輸出:無。*/
/*描述:初始化AD轉換器。*/
/* - */
void ADC_Init(void)
{
ADC _ CR2 = 0x00
ADC _ Cr 1 = 0x 00;
ADC _ CSR = 0x03
ADC _ TDRL = 0x 20;
}
/* - */
/*例程名:TIM_Init */
/*輸入/輸出:無。*/
/*描述:將TIM4初始化為LED時基。*/
/* - */
void time _ Init(void)
{
/* TIM4外設配置*/
/*時基配置*/
Tim 4 _ PSCR = 0x 04;/*配置TIM4預分頻器。*/
TIM4 _ ARR = 0xFF/*配置TIM4周期。*/
/*TIM4計數器使能*/
Tim 4 _ Cr 1 | = 0x 01;/*使能TIM4。*/
Tim 4 _ IER | = 0x 01;/*使能TIM4 OVR中斷。*/
}
/* - */
/*例程:main */
/*主條目*/
/* - */
無效總管(無效)
{
無符號int j;
_ ASM(" sim ");/*禁用中斷。*/
flag _ Octave _ Chg = 0;
CLK _初始化();
GPIO _ Init();
TIM _ Init();
ADC _ Init();
_ ASM(“rim”);/*啟用中斷。*/
Buzz_Init()。/*初始化定時器外設。*/
while ( 1)
{
/*播放當前樂譜。*/
buzz _ play tune();
buzz _ Wait(0x 80);/*等待大約壹秒鐘。*/
}
}
/* -文件結尾- */