2013年10月22日 星期二

18f4520 ADC通道切換

#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
   }
}

ADC TO LCD 偵測電壓值輸出至LCD

  1. #include <p18f4520.h> //納入微控制器定義檔
  2. #include <delays.h> //納入時間延遲函式庫定義檔
  3. #include "evm_lcd.h" //納入LCD函式庫定義檔
  4. #include <stdio.h>
  5. #include <adc.h> //納入類比訊號轉換函式庫定義檔
  6. // 設定微處理器相關結構位元
  7. #pragma config OSC=HS, BOREN=OFF, BORV = 2, PWRT=ON, WDT=OFF, LVP=OFF
  8. // 定義時序頻率
  9. #define OSC_CLOCK 10
  10. // 宣告時間延遲函式原型
  11. void delay_ms(long A);
  12. void main() {
  13. unsigned int ADC_result=0;
  14. char buf[17];
  15. int adnum=0;
  16. float adf;
  17. OpenLCD(); // 初始化LCD模組
  18. OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_20_TAD,
  19. ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD &
  20. ADC_VREFMINUS_VSS, 14);
  21. while(1) {
  22. Delay10TCYx(5); //時間延遲以完成採樣
  23. WriteCmdLCD(0X01);
  24. LCD_Set_Cursor(0,0);
  25. delay_ms(1);
  26. ADC_result=get_ad();
  27. sprintf(buf,"%u",ADC_result);
  28. putsLCD(buf);
  29. delay_ms(1);
  30. LCD_Set_Cursor(0,5);
  31. putrsLCD("mV");
  32. delay_ms(500);
  33. }
  34. }
  35. // 時間延遲函式
  36. void delay_ms(long A) {
  37. //This function is only good for OSC_CLOCK higher than 4MHz
  38. long i;
  39. int us2TCY;
  40. us2TCY=(10*OSC_CLOCK)>>2;
  41. for(i=0;i<A;i++) Delay100TCYx(us2TCY);
  42. }
  43. int get_ad()
  44. {
  45. float adf;
  46. int adnum;
  47. ConvertADC() ; //進行訊號轉換
  48. while(BusyADC()); //等待轉換完成
  49. adnum = ReadADC();
  50. adf=adnum/1024.0*5;
  51. adnum=adf*1000;
  52. return adnum;
  53. }

VR1,VR2調整PWM 波寬後 顯示頻率至LCD


  1. #include <p18f4520.h>
  2. #include <delays.h>
  3. #include <adc.h>
  4. #include <timers.h>
  5. #include <pwm.h>
  6. #include    "evm_lcd.h"
  7. #include    <stdio.h>    //use sprintf
  8. void delay_ms(long a);
  9. #define OSC_CLOCK 10
  10. void LCD1(unsigned int); 
  11. void LCD2(unsigned int); 
  12. void ADC0(void);
  13. void ADC1(void);
  14. char buf1[3],buf2[3],buf3[5];
  15. unsigned int b,c;  


  16. #pragma config OSC=HS, BOREN=OFF, BORV = 2, PWRT=ON, WDT=OFF, LVP=OFF 

  17. void main () 
  18. OpenLCD();
  19.     WriteCmdLCD(0x01);
  20.     LCD_Set_Cursor(0,0);     
  21. TRISCbits.TRISC2 = 0;                          // 設定CCP1為輸出,啟動蜂鳴器
  22. //OpenTimer2(TIMER_INT_OFF&T2_PS_1_4&T2_POST_1_1); //開啟TIMER2
  23. T2CON=0x05;                 // 0000 0101
  24. PIE1bits.TMR2IE=0;          //disable TIMER2 interrupt 
  25. while(1) 
  26. {
  27. ADC1();                   //pwm period  
  28. ADC0();                   //pwm duty cycle
  29. PIR1bits.TMR2IF=0;        //clear TIMER2 interrupt flag  
  30.    }
  31. }

  32. void LCD1(unsigned int v)
  33. {   
  34.      LCD_Set_Cursor( 0,0 );                        
  35.      sprintf(buf1,"Duty Cycle=%u",v );      
  36.      putsLCD(buf1);                                          
  37.      delay_ms(1000);                      
  38.      WriteCmdLCD( 0x01 );                

  39. void LCD2(unsigned int k)
  40. {  
  41. float zz,yy;
  42. unsigned int zz1,zz2,zz3;
  43. yy=k;   
  44. zz=1.0/((yy+1)*4.0*(1.0/10000000.0)*4.0); //浮點運算
  45. zz2=zz/1.0;                               //取整數
  46. zz1=zz/1000.0;                           //取整數 
  47. zz3=(zz2-zz1*1000) ;                  //取小數點後三位
  48. LCD_Set_Cursor( 1,0 );                         
  49.      sprintf(buf2,"Period=%u",k);      
  50.      putsLCD(buf2); 
  51.      delay_ms(1000); 
  52.      WriteCmdLCD( 0x01 );              //清除LCD顯示資料      
  53.      LCD_Set_Cursor( 0,0 );   
  54.      sprintf(buf3,"Freq=%u.%03uKHZ",zz1,zz3);
  55.      putsLCD(buf3);                      
  56.      delay_ms(1000);                      
  57.      WriteCmdLCD( 0x01 );                

  58. void delay_ms(long a)
  59. {
  60.   long i;
  61.   int us2TCY;
  62.   us2TCY=(10*OSC_CLOCK)>>2;                     //10*10/4=25
  63.   for(i=0;i<a;i++)
  64.   Delay100TCYx(us2TCY);                         //25*100*(4/10^7)=1ms
  65. }  

  66. void ADC0()
  67. {
  68. ADCON0=0x01; // 選擇AN0通道轉換,開啟ADC模組
  69.     ADCON1=0x0E; // 使用VDD,VSS為參考電壓,設定AN0為類比輸入
  70.     ADCON2=0xBA; // 結果向右靠齊並設定轉換時間為Fosc/32,採樣時間為20TAD
  71.     Delay10TCYx(5);  
  72.     ConvertADC() ;  
  73.     while(BusyADC());   
  74. b=(ReadADC()>>2); 
  75. if (b>c)  
  76.    b=c;        //limit duty cycle<=period
  77.     SetDCPWM1(b);          //set PWM duty cycle
  78.     LCD1(b);
  79.         
  80. }

  81. void ADC1()
  82. {
  83. ADCON0=0x05; // 選擇AN1通道轉換,開啟ADC模組
  84.     ADCON1=0x0D; // 使用VDD,VSS為參考電壓,設定AN1為類比輸入
  85.     ADCON2=0xBA; // 結果向右靠齊並設定轉換時間為Fosc/32,採樣時間為20TAD
  86.     Delay10TCYx(5);  
  87.     ConvertADC() ;     
  88.     while(BusyADC());  
  89.     c=(ReadADC()>>2);
  90. OpenPWM1(c);      // 設定CCP1為PWM週期功能 PWM uses only Timer2=>period
  91.     LCD2(c);
  92. }



PIC LCD顯示 1-100 簡易範例


  1. #include <p18f4520.h> //納入微控制器定義檔
  2. #include <delays.h> //納入時間延遲函式庫定義檔
  3. #include "evm_lcd.h" //納入LCD函式庫定義檔
  4. #include    <stdio.h>

  5. // 設定微處理器相關結構位元
  6. #pragma config OSC=HS, BOREN=OFF, BORV = 2, PWRT=ON, WDT=OFF, LVP=OFF 

  7. // 定義時序頻率
  8. #define OSC_CLOCK 10
  9. // 宣告時間延遲函式原型
  10. void delay_ms(long A);

  11. void main() {

  12. int i;
  13.    OpenLCD(); // 初始化LCD模組
  14.    WriteCmdLCD( 0x01 ); // 清除LCD顯示資料
  15.    LCD_Set_Cursor( 0, 0 ); // 顯示位置回至第0行第0格
  16.    delay_ms(1); // 時間延遲
  17.    putrsLCD("Welcome to PIC"); // 顯示資料
  18.    LCD_Set_Cursor( 1, 0 ); // 顯示位置調至第1行第0格
  19.    delay_ms(1); // 時間延遲
  20.    putrsLCD("Micro-Controller");// 顯示資料
  21. delay_ms(1000);
  22.     WriteCmdLCD( 0x01 ); // 清除LCD顯示資料
  23.    for (i=0;i<100;i++)
  24. {
  25. char buf[10];
  26.     //WriteCmdLCD( 0x01 );
  27.     LCD_Set_Cursor( 0, 0 );
  28.     delay_ms(1000);
  29.     sprintf(buf,"%d",i);
  30.     putsLCD(buf);
  31. }
  32.    Sleep(); // 進入睡眠省電模式
  33.    while(1); // 永久迴圈
  34. }

  35. // 時間延遲函式
  36. void delay_ms(long A) {
  37. //This function is only good for OSC_CLOCK higher than 4MHz
  38. long i;
  39. int us2TCY;
  40. us2TCY=(10*OSC_CLOCK)>>2;
  41. for(i=0;i<A;i++) Delay100TCYx(us2TCY);
  42. }


MALAB IDE 環境建置

開啟MALAB IDE


開啟 Project Project Wizard..




選擇下一步

選擇 PIC18F4520 晶片

選擇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),兩個為resultsuggest
兩個「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」中的內容




    程式架構

§  所有元件所要執行的動作的程式碼會寫於「Main.java」中-----(要作什麼事)

以上學習後,轉載紀錄如有侵權請來信告知!