當前位置:編程學習大全網 - 編程語言 - Iar編程課程

Iar編程課程

妳用的是「ST單片機三合壹體驗套件」裏的STM8S開發板嗎?

如果有,可以參考以下套路:是韋雪電子購買的官方套件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);/*等待大約壹秒鐘。*/

}

}

/* -文件結尾- */

  • 上一篇:中山大學報考
  • 下一篇:幼兒園中班健康教案
  • copyright 2024編程學習大全網