ADC.c.bak 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "STC8XXXX.H"
  2. #include <intrins.h>
  3. /*
  4. 延时函数,33.1776mhz,1us
  5. 参数:延迟时间
  6. 返回值:无
  7. */
  8. void delayus(unsigned int nn)
  9. {
  10. unsigned int ii;
  11. for(ii=0;ii<n;ii++)
  12. {
  13. _nop_();
  14. _nop_();
  15. _nop_();
  16. }
  17. }
  18. /*
  19. ADC初始化
  20. 参数:
  21. 返回值:
  22. */
  23. void adc_init()
  24. {
  25. ADCCFG = 0x20;
  26. ADC_RES = 0;
  27. ADC_RESL = 0;//清空结果寄存器
  28. delayus(20);
  29. }
  30. /*
  31. 查询ADC值
  32. 参数:ADC通道0~14
  33. 返回值:12位ADC值
  34. */
  35. unsigned int get_adc(unsigned int p)
  36. {
  37. switch(p)
  38. {
  39. case 0 : ADC_CONTR = 0xC0; break;
  40. case 1 : ADC_CONTR = 0xC1; break;
  41. case 2 : ADC_CONTR = 0xC2; break;
  42. case 3 : ADC_CONTR = 0xC3; break;
  43. case 4 : ADC_CONTR = 0xC4; break;
  44. case 5 : ADC_CONTR = 0xC5; break;
  45. case 6 : ADC_CONTR = 0xC6; break;
  46. case 7 : ADC_CONTR = 0xC7; break;
  47. case 8 : ADC_CONTR = 0xC8; break;
  48. case 9 : ADC_CONTR = 0xC9; break;
  49. case 10: ADC_CONTR = 0XCA; break;
  50. case 11: ADC_CONTR = 0xCB; break;
  51. case 12: ADC_CONTR = 0xCC; break;
  52. case 13: ADC_CONTR = 0xCD; break;
  53. case 14: ADC_CONTR = 0xCE; break;
  54. case 15: ADC_CONTR = 0xCF; break;
  55. }
  56. delayus(10);
  57. while(!(ADC_CONTR & 0x20));//等待AD转换完成
  58. ADC_CONTR &= ~0x20;//关闭AD转换器
  59. return (ADC_RES * 256 + ADC_RESL);
  60. }
  61. /*
  62. 根据ADC计算温温度
  63. 参数:ADC值,误差补偿
  64. 返回值:温度
  65. */
  66. unsigned int transform(unsigned int adc,double p1,double p2,double p3,double p4)
  67. {
  68. int temp;
  69. temp = p1*adc*adc*adc+p2*adc*adc+p3*adc+p4;
  70. return temp;
  71. }