#include <p18f4520.h> //納入微控制器定義檔 #include <delays.h> //納入時間延遲函式庫定義檔 #include <adc.h> //納入類比訊號轉換函式庫定義檔 // 結構位元定義 #pragma config OSC=HS, BOREN=OFF, BORV = 2, PWRT=ON, WDT=OFF, LVP=OFF void main () { PORTD = 0x00; // 將PORTD清除關閉LED TRISD = 0; // 將TRISD設為0,PORTD設定為輸出 ADCON0=0x01; // 選擇AN0通道轉換,開啟ADC模組 ADCON1=0x0E; // 使用VDD,VSS為參考電壓,設定AN0為類比輸入 ADCON2=0x3A; // 結果向左靠齊並設定轉換時間為Fosc/32,採樣時間為20TAD ADCON0=0x05; // 選擇AN1通道轉換,開啟ADC模組 ADCON1=0x0D; // 使用VDD,VSS為參考電壓,設定AN0、AN1為類比輸入 ADCON2=0x3A; // 結果向左靠齊並設定轉換時間為Fosc/32,採樣時間為20TAD ADCON0=0x09; // 選擇AN2通道轉換,開啟ADC模組 ADCON1=0x0C; // 使用VDD,VSS為參考電壓,設定AN0、AN1、AN2為類比輸入 ADCON2=0x3A; // 結果向左靠齊並設定轉換時間為Fosc/32,採樣時間為20TAD while(1) { Delay10TCYx(5); //時間延遲以完成採樣 ConvertADC() ; //進行訊號轉換 while(BusyADC()); //等待轉換完成 PORTD = ADRESH ; //將高位元組結果傳至LED } }
2013年10月22日 星期二
18f4520 ADC通道切換
ADC TO LCD 偵測電壓值輸出至LCD
- #include <p18f4520.h> //納入微控制器定義檔
- #include <delays.h> //納入時間延遲函式庫定義檔
- #include "evm_lcd.h" //納入LCD函式庫定義檔
- #include <stdio.h>
- #include <adc.h> //納入類比訊號轉換函式庫定義檔
- // 設定微處理器相關結構位元
- #pragma config OSC=HS, BOREN=OFF, BORV = 2, PWRT=ON, WDT=OFF, LVP=OFF
- // 定義時序頻率
- #define OSC_CLOCK 10
- // 宣告時間延遲函式原型
- void delay_ms(long A);
- void main() {
- unsigned int ADC_result=0;
- char buf[17];
- int adnum=0;
- float adf;
- OpenLCD(); // 初始化LCD模組
- OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_20_TAD,
- ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD &
- ADC_VREFMINUS_VSS, 14);
- while(1) {
- Delay10TCYx(5); //時間延遲以完成採樣
- WriteCmdLCD(0X01);
- LCD_Set_Cursor(0,0);
- delay_ms(1);
- ADC_result=get_ad();
- sprintf(buf,"%u",ADC_result);
- putsLCD(buf);
- delay_ms(1);
- LCD_Set_Cursor(0,5);
- putrsLCD("mV");
- delay_ms(500);
- }
- }
- // 時間延遲函式
- void delay_ms(long A) {
- //This function is only good for OSC_CLOCK higher than 4MHz
- long i;
- int us2TCY;
- us2TCY=(10*OSC_CLOCK)>>2;
- for(i=0;i<A;i++) Delay100TCYx(us2TCY);
- }
- int get_ad()
- {
- float adf;
- int adnum;
- ConvertADC() ; //進行訊號轉換
- while(BusyADC()); //等待轉換完成
- adnum = ReadADC();
- adf=adnum/1024.0*5;
- adnum=adf*1000;
- return adnum;
- }
VR1,VR2調整PWM 波寬後 顯示頻率至LCD
- #include <p18f4520.h>
- #include <delays.h>
- #include <adc.h>
- #include <timers.h>
- #include <pwm.h>
- #include "evm_lcd.h"
- #include <stdio.h> //use sprintf
- void delay_ms(long a);
- #define OSC_CLOCK 10
- void LCD1(unsigned int);
- void LCD2(unsigned int);
- void ADC0(void);
- void ADC1(void);
- char buf1[3],buf2[3],buf3[5];
- unsigned int b,c;
- #pragma config OSC=HS, BOREN=OFF, BORV = 2, PWRT=ON, WDT=OFF, LVP=OFF
- void main ()
- {
- OpenLCD();
- WriteCmdLCD(0x01);
- LCD_Set_Cursor(0,0);
- TRISCbits.TRISC2 = 0; // 設定CCP1為輸出,啟動蜂鳴器
- //OpenTimer2(TIMER_INT_OFF&T2_PS_1_4&T2_POST_1_1); //開啟TIMER2
- T2CON=0x05; // 0000 0101
- PIE1bits.TMR2IE=0; //disable TIMER2 interrupt
- while(1)
- {
- ADC1(); //pwm period
- ADC0(); //pwm duty cycle
- PIR1bits.TMR2IF=0; //clear TIMER2 interrupt flag
- }
- }
- void LCD1(unsigned int v)
- {
- LCD_Set_Cursor( 0,0 );
- sprintf(buf1,"Duty Cycle=%u",v );
- putsLCD(buf1);
- delay_ms(1000);
- WriteCmdLCD( 0x01 );
- }
- void LCD2(unsigned int k)
- {
- float zz,yy;
- unsigned int zz1,zz2,zz3;
- yy=k;
- zz=1.0/((yy+1)*4.0*(1.0/10000000.0)*4.0); //浮點運算
- zz2=zz/1.0; //取整數
- zz1=zz/1000.0; //取整數
- zz3=(zz2-zz1*1000) ; //取小數點後三位
- LCD_Set_Cursor( 1,0 );
- sprintf(buf2,"Period=%u",k);
- putsLCD(buf2);
- delay_ms(1000);
- WriteCmdLCD( 0x01 ); //清除LCD顯示資料
- LCD_Set_Cursor( 0,0 );
- sprintf(buf3,"Freq=%u.%03uKHZ",zz1,zz3);
- putsLCD(buf3);
- delay_ms(1000);
- WriteCmdLCD( 0x01 );
- }
- void delay_ms(long a)
- {
- long i;
- int us2TCY;
- us2TCY=(10*OSC_CLOCK)>>2; //10*10/4=25
- for(i=0;i<a;i++)
- Delay100TCYx(us2TCY); //25*100*(4/10^7)=1ms
- }
- void ADC0()
- {
- ADCON0=0x01; // 選擇AN0通道轉換,開啟ADC模組
- ADCON1=0x0E; // 使用VDD,VSS為參考電壓,設定AN0為類比輸入
- ADCON2=0xBA; // 結果向右靠齊並設定轉換時間為Fosc/32,採樣時間為20TAD
- Delay10TCYx(5);
- ConvertADC() ;
- while(BusyADC());
- b=(ReadADC()>>2);
- if (b>c)
- b=c; //limit duty cycle<=period
- SetDCPWM1(b); //set PWM duty cycle
- LCD1(b);
- }
- void ADC1()
- {
- ADCON0=0x05; // 選擇AN1通道轉換,開啟ADC模組
- ADCON1=0x0D; // 使用VDD,VSS為參考電壓,設定AN1為類比輸入
- ADCON2=0xBA; // 結果向右靠齊並設定轉換時間為Fosc/32,採樣時間為20TAD
- Delay10TCYx(5);
- ConvertADC() ;
- while(BusyADC());
- c=(ReadADC()>>2);
- OpenPWM1(c); // 設定CCP1為PWM週期功能 PWM uses only Timer2=>period
- LCD2(c);
- }
PIC LCD顯示 1-100 簡易範例
- #include <p18f4520.h> //納入微控制器定義檔
- #include <delays.h> //納入時間延遲函式庫定義檔
- #include "evm_lcd.h" //納入LCD函式庫定義檔
- #include <stdio.h>
- // 設定微處理器相關結構位元
- #pragma config OSC=HS, BOREN=OFF, BORV = 2, PWRT=ON, WDT=OFF, LVP=OFF
- // 定義時序頻率
- #define OSC_CLOCK 10
- // 宣告時間延遲函式原型
- void delay_ms(long A);
- void main() {
- int i;
- OpenLCD(); // 初始化LCD模組
- WriteCmdLCD( 0x01 ); // 清除LCD顯示資料
- LCD_Set_Cursor( 0, 0 ); // 顯示位置回至第0行第0格
- delay_ms(1); // 時間延遲
- putrsLCD("Welcome to PIC"); // 顯示資料
- LCD_Set_Cursor( 1, 0 ); // 顯示位置調至第1行第0格
- delay_ms(1); // 時間延遲
- putrsLCD("Micro-Controller");// 顯示資料
- delay_ms(1000);
- WriteCmdLCD( 0x01 ); // 清除LCD顯示資料
- for (i=0;i<100;i++)
- {
- char buf[10];
- //WriteCmdLCD( 0x01 );
- LCD_Set_Cursor( 0, 0 );
- delay_ms(1000);
- sprintf(buf,"%d",i);
- putsLCD(buf);
- }
- Sleep(); // 進入睡眠省電模式
- while(1); // 永久迴圈
- }
- // 時間延遲函式
- void delay_ms(long A) {
- //This function is only good for OSC_CLOCK higher than 4MHz
- long i;
- int us2TCY;
- us2TCY=(10*OSC_CLOCK)>>2;
- for(i=0;i<A;i++) Delay100TCYx(us2TCY);
- }
MALAB IDE 環境建置
開啟MALAB IDE
開啟 Project →Project Wizard..
選擇下一步
選擇 PIC18F 4520 晶片
選擇Microchip C18 Toolsuite
確認編譯器、連結位址是否正確→下一步
選擇儲存路徑
儲存→下一步
選擇舊有的程式加入專案
選擇完畢→下一步
點選完成。
儲存專案 點擊 Save
Wizard
關閉專案
建立連結
選擇晶片型號
新增完成
設定專案
設定 output 儲存位置→點擊NEW 選擇位址在專案資料夾內
暫存資料夾步驟同上
標頭檔資料夾,選擇安裝C18編譯器裡面的h資料夾,也可選擇自己要加入的標頭檔的路徑
選擇C18編譯器資料夾裡lkr資料夾
選擇資料夾lib,點選套用選擇確定。
檢查震盪器設定 設定為HS Oscillator
點選編譯
編輯器字型大小調整
Android BMI APP製作 (轉載)
計算BMI範例(圖文 學習)
§ BMI計算:體重(kg)/(身高(m)*身高(m))
視圖
§ 在螢幕上需要哪些東西才能讓使用者輸入數值並顯示結果?
由上圖顯示判別使用元件:
四個「TextView」,兩個為輸入height(cm)、weight(kg),兩個為result、suggest
兩個「EditText」,給使用者輸入身高、體重
一個「Button」,再輸入完數值後按下按鈕計算出BMI值
§ 在螢幕上需要哪些東西才能讓使用者輸入數值並顯示結果?
由上圖顯示判別使用元件:
四個「TextView」,兩個為輸入height(cm)、weight(kg),兩個為result、suggest
兩個「EditText」,給使用者輸入身高、體重
一個「Button」,再輸入完數值後按下按鈕計算出BMI值
設計介面-----佈局(Layout)
§ 可在“Graphical_Layout”中直接使用左方工具拖拉出介面(粗調),也可在「main.xml」中直接編輯(微調)。
1.透過「android:id」才能在程式碼中識別操作在「main.xml」中所定義的介面元件。若此元件沒有需要動作可以不設定其id。
2.在專案中的「R.java」檔案是所「res」目錄資源檔案之索引。在程式碼中使用「R」類別來存取專案中包含的資源檔案。
3.所有在「res」目錄中所做的修改,都會被整理到「R.java」中,所以也可在再「res.values」中建置各自獨立的檔案,本例以「device.xml」用來提醒BMI各種狀況(suggest)
4.「TextView」>右鍵>「Edit_Text...」>「New_String...」,可編輯在「R」檔案中的識別符號、所選「TextView」的字串,也會同步改變「R.java」、「String.xml」中的內容
程式架構
§ 可在“Graphical_Layout”中直接使用左方工具拖拉出介面(粗調),也可在「main.xml」中直接編輯(微調)。
§ 所有元件所要執行的動作的程式碼會寫於「Main.java」中-----(要作什麼事)
以上學習後,轉載紀錄如有侵權請來信告知!
§ 所有元件所要執行的動作的程式碼會寫於「Main.java」中-----(要作什麼事)
以上學習後,轉載紀錄如有侵權請來信告知!
訂閱:
文章 (Atom)