//Logo Image
作者:蔡宗成(2001-11-28);推薦:徐業良(2001-11-30)

單晶片實習-數位輸出應用

單晶片的輸出信號常用來驅動LED燈,作為指示燈或是控制外部電路等。本文介紹使用PIC16F877單晶片輸出脈波訊號,控制LED燈進行閃爍動作;接著,將這些脈波訊號轉換成不同的頻率,驅動小型喇叭發出聲音,唱一首「小蜜蜂」兒歌。

1.         LED電路

PIC16F877單晶片常用的LED驅動電路如圖1所示,有兩種方式,分別是單晶片接腳高電位時,電流由PIC流出,點亮LED(Source Current);低電位時,電流由供應電源流入PIC內,點亮LED(Sink Current)

PIC16F877提供高的Source/Sink電流,可達25mA,足可應付LED的驅動電流7mA~20mA8051單晶片則採用Sink方式來驅動LED燈或是利用一些特定IC來額外提供更大的電流。本文使用Source Current方式推動LED燈,將LED接於單晶片的PORTB的第一支接腳(RB0),加上限流電阻(200Ω)避免LED燒毀,再接至地線,形成完整的迴路。

如圖2LED閃爍程式,以C語法撰寫,引用相關包含檔(include)與設定,便可開始設計應用程式,程式語法等相關內容會進一步介紹。

(a)Source Current                                          (b)Sink Current

1. 常用LED輸出電路

2.        LED閃爍程式

#include16F877.H

16F877.H是引用CCS Compiler內建的函數庫,將PIC16F877的接腳相關位址與驅動程式定義成C語法字串與指令,例如可在16F877.H檔案裡找到一行指令「#define PIN_B0  48」,代表PORTB的第一支接腳位址為48,以C語法設計程式時,PIN_B0代表程式設計師要使用PORTB的第一支接腳。

#fuses   HS, NOWDT, NOBROWNOUT, NOPROTECT

此為CCS C Compiler內建的先處理(Pre-Processor)指令-「#fuses options」,用法為開啟單晶片內定功能,例如WDT看門狗程式、BROWNOUT過熱保護等。

#use     delay(clock=20000000)

此為CCS C Compiler內建的先處理(Pre-Processor)指令-「#use delay(clock=speed)」,speed是一個介於1~100000000的數值,用法為定義時脈振盪器的振盪頻率,本實習電路採用頻率為20MHz的振盪器。

#org     0x0800

此為CCS C Compiler內建的先處理(Pre-Processor)指令-「#org segment」,segment是程式起始位置,此用法代表使用者撰寫程式是由位址0x08開始,此位址是由ICP(In Chip Programmer)所定義,使用「元智皮可單板控制器」必須由此位址開始撰寫程式,否則無法燒錄。

output_low(PIN_B0)

此為CCS C Compiler內建函數(Built-In Function)指令-「output_low(pin)」,pins16F877.H檔案所定義,用以設定指定接腳為低電位,輸出為0伏特。

output_high(PIN_B0)

此為CCS C Compiler內建函數(Built-In Function)指令-「output_high(pin)」,pins16F877.H檔案所定義,用以設定指定接腳為高電位,輸出為5伏特。

delay_ms(100)

此為CCS C Compiler內建函數(Built-In Function)指令-「delay_ms(time)」,time是一個介於0~65535之間的數值,用以設定程式延遲一段指定的時間,時間單位為milliseconds

將以上程式撰寫於while迴圈裡,便可控制PORTB的第一支接腳(RB0)連續產生方波訊號,使LED燈閃爍。

2.   喇叭發聲電路

喇叭發聲電路是利用PIC16F877輸出不同“頻率”的方波訊號,經由PORTC的第一支接腳來推動小型喇叭發出DoReMi…等不同聲音,使用CCS內建函數,運用程式技巧,單晶片便可“唱”出ㄧ首簡單的兒歌。

喇叭是由線圈與磁鐵所組成,線圈內的電流產生變化,喇叭便會震動而發出聲音,當控制訊號產生週期性變化時,其訊號頻率便是喇叭發出聲音的頻率。每一個音調都有其特定音頻,表1DoReMi…等不同音調所對應的聲音頻率,設計喇叭發聲程式時,將這些頻率換算成週期,並成為輸出週期方波訊號,發出不同音調。圖3為喇叭與單晶片連接電路圖。單晶片唱歌的程式設計概念是將「小蜜蜂」兒歌的音階事先存入一個矩陣,並使用讀取程式,依序讀取矩陣裡的音階字串,將讀取程式放在迴圈裡,便可連續唱指定歌曲。

1. 音階與頻率對應表

3. 喇叭電路圖

4為喇叭發聲程式架構,可分成兩個部份,第一部份為引用CCS內建函數庫(#include <tones.c>),此函數庫內容為將各個音階所對應的頻率轉換成不同的音階矩陣,如C_NOTE[4]D_NOTE[4]E_NOTE[4]…等,代表 DoReMi…等音符,“[ ]”裡的數字表示每個音符有四個基準音階,例如C_NOTE[1]代表以標準頻率523”控制喇叭每秒振動523次,發出Do標準音。第二個部份為主程式內容,建立一首「小蜜蜂」的音符矩陣-happy_bee[SIZE],例如小蜜蜂的音符為SolMiMiFaReRe…轉換成G_note[0],350, E_note[0],350, E_note[0],350, F_note[0],350, D_note[0],350, D_note[0],350…等;後面的數值350”代表喇叭產生一個音符總共經過350ms,此數值可隨程式設計師所定義,此首小蜜蜂的音符矩陣大小為63個。建立歌曲的音符矩陣後,便要設計讀取程式,使程式能依序讀取音符矩陣裡的音階與時間,generate_tone(long frequency, long duration)CCS C Compiler內建函數,將此內建函數設計於迴圈內,便可連續讀取指定音符,並驅動喇叭,唱出一首小蜜蜂兒歌。

CCS C Compiler軟體內建許多功能與驅動程式,適當引用其函數庫與範例程式,並更改其接腳定義,可以以較短的時間完成所需的專題,是一套不錯的發展工具。

4(a). 喇叭發聲程式

4(b). 喇叭發聲程式