//**********************************************************
//* Ex11_2_PWM.c
//* 讀取可變電阻的類比電壓值,將結果轉換成8位元的訊號
//* 並將結果呈現在PORTD發光二極體。
//* 同時以此8位元結果作為CCP1的PWM模組之工作周期設定值,
//* 產生一個頻率為4000Hz的可調音量之蜂鳴器周期波。
//**********************************************************
#include <p18f4520.h> //納入微控制器定義檔
#include <delays.h> //納入時間延遲函式庫定義檔
#include <adc.h> //納入類比訊號轉換函式庫定義檔
#include <timers.h> //納入計時器函式庫定義檔
#include <pwm.h> //納入PWM函式庫定義檔
// 設定微處理器相關結構位元
#pragma config OSC=HS, BOREN=OFF, BORV = 2, PWRT=ON, WDT=OFF, LVP=OFF
void main () {
PORTD = 0x00; // 將PORTD清除
TRISD = 0; // 將TRISD設為0,PORTD設定為輸出
// 開啟類比訊號轉換模組
// OpenADC(ADC_FOSC_32 & ADC_LEFT_JUST & ADC_20_TAD,
// ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD &
// ADC_VREFMINUS_VSS, 14);
ADCON0=0x01; // 選擇AN0通道轉換,開啟ADC模組
ADCON1=0x0E; // 使用VDD,VSS為參考電壓,設定AN0為類比輸入
ADCON2=0x3A; // 結果向左靠齊並設定轉換時間為Fosc/32,採樣時間為20TAD
TRISCbits.TRISC2 = 0; // 設定CCP1為輸出
OpenPWM1(0x9B); // 設定CCP1為PWM功能與時脈周期
OpenTimer2(TIMER_INT_OFF&T2_PS_1_4&T2_POST_1_1); //開啟TIMER2
while(1) { // 永久迴圈
Delay10TCYx(5); // 時間延遲以完成採樣
ConvertADC() ; // 進行訊號轉換
while(BusyADC()); // 等待轉換完成
PORTD = ADRESH ; // 將轉換結果顯示於LED
SetDCPWM1((unsigned int)ADRESH<<2); // 調整PWM工作週期
}
}
}