2013年10月22日 星期二

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

沒有留言:

張貼留言