STC12C5A60S2单片机AD转换程序,最好可以测电压!

[复制链接]
13563|32
 楼主| sangao0 发表于 2012-9-24 21:21 | 显示全部楼层 |阅读模式
遇到一个利用STC12C5A60S2单片机内置AD转换功能,制作一个电压表!那位可以提供一下资料!我菜鸟也!
logokfu 发表于 2012-9-25 07:37 | 显示全部楼层



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

谢谢  发表于 2013-6-8 17:07

评分

参与人数 1威望 +2 收起 理由
sangao0 + 2 很给力!

查看全部评分

dlyt_test001 发表于 2012-9-25 08:22 | 显示全部楼层
顶沙发,弄得不错!
dino_ho 发表于 2012-9-25 13:35 | 显示全部楼层
下載來學習  謝謝無私奉獻
anazel 发表于 2012-9-28 07:03 | 显示全部楼层
不错,学习学习
37S21 发表于 2012-9-28 15:20 | 显示全部楼层
顶,有空学习一下。
eyue 发表于 2012-10-3 21:02 | 显示全部楼层
哥们,多看数据手册,多试验,很多问题根本就不用到这里来问了

评分

参与人数 1威望 +1 收起 理由
sangao0 + 1 赞一个!

查看全部评分

zyg900326 发表于 2012-11-3 12:59 | 显示全部楼层
gozzz 发表于 2012-11-3 16:08 | 显示全部楼层
你确定用自带的AD做电压表,够用??
anazel 发表于 2012-11-3 19:13 | 显示全部楼层
以前试过,误差太大,放弃了
coody 发表于 2012-11-4 21:31 | 显示全部楼层
LS,误差太大是多大?我用来测电压没啥问题,一般精度<=0.5%,看你的硬件和软件了。
lxy_613 发表于 2013-9-14 21:49 | 显示全部楼层
顶,急需的东西。
autopccopy 发表于 2013-9-14 22:10 来自手机 | 显示全部楼层
Ad转换有官方例程
gonggu8181 发表于 2013-9-14 22:18 | 显示全部楼层
  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ---------------------------------------------*/
  3. /* --- STC12C5Axx Series MCU A/D Conversion Demo -------------------*/
  4. /* --- Mobile: (86)13922805190 -------------------------------------*/
  5. /* --- Fax: 86-755-82905966 ----------------------------------------*/
  6. /* --- Tel: 86-755-82948412 ----------------------------------------*/
  7. /* --- Web: www.**.com -----------------------------------------*/
  8. /* If you want to use the program or the program referenced in the  */
  9. /* article, please specify in which data and procedures from STC    */
  10. /*------------------------------------------------------------------*/

  11. #include "reg51.h"
  12. #include "intrins.h"

  13. #define FOSC    18432000L
  14. #define BAUD    9600

  15. typedef unsigned char BYTE;
  16. typedef unsigned int WORD;

  17. /*Declare SFR associated with the ADC */
  18. sfr ADC_CONTR   =   0xBC;           //ADC control register
  19. sfr ADC_RES     =   0xBD;           //ADC hight 8-bit result register
  20. sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result register
  21. sfr P1ASF       =   0x9D;           //P1 secondary function control register

  22. /*Define ADC operation const for ADC_CONTR*/
  23. #define ADC_POWER   0x80            //ADC power control bit
  24. #define ADC_FLAG    0x10            //ADC complete flag
  25. #define ADC_START   0x08            //ADC start control bit
  26. #define ADC_SPEEDLL 0x00            //420 clocks
  27. #define ADC_SPEEDL  0x20            //280 clocks
  28. #define ADC_SPEEDH  0x40            //140 clocks
  29. #define ADC_SPEEDHH 0x60            //70 clocks

  30. void InitUart();
  31. void SendData(BYTE dat);
  32. void Delay(WORD n);
  33. void InitADC();

  34. BYTE ch = 0;                        //ADC channel NO.

  35. void main()
  36. {
  37.     InitUart();                     //Init UART, use to show ADC result
  38.     InitADC();                      //Init ADC sfr
  39.     IE = 0xa0;                      //Enable ADC interrupt and Open master interrupt switch
  40.                                     //Start A/D conversion
  41.     while (1);
  42. }

  43. /*----------------------------
  44. ADC interrupt service routine
  45. ----------------------------*/
  46. void adc_isr() interrupt 5 using 1
  47. {
  48.     ADC_CONTR &= !ADC_FLAG;         //Clear ADC interrupt flag

  49.     SendData(ch);                   //Show Channel NO.
  50.     SendData(ADC_RES);              //Get ADC high 8-bit result and Send to UART

  51. //if you want show 10-bit result, uncomment next line
  52. //    SendData(ADC_LOW2);             //Show ADC low 2-bit result
  53.    
  54.     if (++ch > 7) ch = 0;           //switch to next channel
  55.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  56. }

  57. /*----------------------------
  58. Initial ADC sfr
  59. ----------------------------*/
  60. void InitADC()
  61. {
  62.     P1ASF = 0xff;                   //Set all P1 as analog input port
  63.     ADC_RES = 0;                    //Clear previous result
  64.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  65.     Delay(2);                       //ADC power-on delay and Start A/D conversion
  66. }

  67. /*----------------------------
  68. Initial UART
  69. ----------------------------*/
  70. void InitUart()
  71. {
  72.     SCON = 0x5a;                    //8 bit data ,no parity bit
  73.     TMOD = 0x20;                    //T1 as 8-bit auto reload
  74.     TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
  75.     TR1 = 1;                        //T1 start running
  76. }

  77. /*----------------------------
  78. Send one byte data to PC
  79. Input: dat (UART data)
  80. Output:-
  81. ----------------------------*/
  82. void SendData(BYTE dat)
  83. {
  84.     while (!TI);                    //Wait for the previous data is sent
  85.     TI = 0;                         //Clear TI flag
  86.     SBUF = dat;                     //Send current data
  87. }

  88. /*----------------------------
  89. Software delay function
  90. ----------------------------*/
  91. void Delay(WORD n)
  92. {
  93.     WORD x;

  94.     while (n--)
  95.     {
  96.         x = 5000;
  97.         while (x--);
  98.     }
  99. }

gonggu8181 发表于 2013-9-14 22:19 | 显示全部楼层
  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ---------------------------------------------*/
  3. /* --- STC12C5Axx Series MCU A/D Conversion Demo -------------------*/
  4. /* --- Mobile: (86)13922805190 -------------------------------------*/
  5. /* --- Fax: 86-755-82905966 ----------------------------------------*/
  6. /* --- Tel: 86-755-82948412 ----------------------------------------*/
  7. /* --- Web: www.**.com -----------------------------------------*/
  8. /* If you want to use the program or the program referenced in the  */
  9. /* article, please specify in which data and procedures from STC    */
  10. /*------------------------------------------------------------------*/

  11. #include "reg51.h"
  12. #include "intrins.h"

  13. #define FOSC    18432000L
  14. #define BAUD    9600

  15. typedef unsigned char BYTE;
  16. typedef unsigned int WORD;

  17. /*Declare SFR associated with the ADC */
  18. sfr ADC_CONTR   =   0xBC;           //ADC control register
  19. sfr ADC_RES     =   0xBD;           //ADC high 8-bit result register
  20. sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result register
  21. sfr P1ASF       =   0x9D;           //P1 secondary function control register

  22. /*Define ADC operation const for ADC_CONTR*/
  23. #define ADC_POWER   0x80            //ADC power control bit
  24. #define ADC_FLAG    0x10            //ADC complete flag
  25. #define ADC_START   0x08            //ADC start control bit
  26. #define ADC_SPEEDLL 0x00            //420 clocks
  27. #define ADC_SPEEDL  0x20            //280 clocks
  28. #define ADC_SPEEDH  0x40            //140 clocks
  29. #define ADC_SPEEDHH 0x60            //70 clocks

  30. void InitUart();
  31. void InitADC();
  32. void SendData(BYTE dat);
  33. BYTE GetADCResult(BYTE ch);
  34. void Delay(WORD n);
  35. void ShowResult(BYTE ch);

  36. void main()
  37. {
  38.     InitUart();                     //Init UART, use to show ADC result
  39.     InitADC();                      //Init ADC sfr
  40.     while (1)
  41.     {
  42.         ShowResult(0);              //Show Channel0
  43.         ShowResult(1);              //Show Channel1
  44.         ShowResult(2);              //Show Channel2
  45.         ShowResult(3);              //Show Channel3
  46.         ShowResult(4);              //Show Channel4
  47.         ShowResult(5);              //Show Channel5
  48.         ShowResult(6);              //Show Channel6
  49.         ShowResult(7);              //Show Channel7
  50.     }
  51. }

  52. /*----------------------------
  53. Send ADC result to UART
  54. ----------------------------*/
  55. void ShowResult(BYTE ch)
  56. {
  57.     SendData(ch);                   //Show Channel NO.
  58.     SendData(GetADCResult(ch));     //Show ADC high 8-bit result

  59. //if you want show 10-bit result, uncomment next line
  60. //    SendData(ADC_LOW2);             //Show ADC low 2-bit result
  61. }

  62. /*----------------------------
  63. Get ADC result
  64. ----------------------------*/
  65. BYTE GetADCResult(BYTE ch)
  66. {
  67.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  68.     _nop_();                        //Must wait before inquiry
  69.     _nop_();
  70.     _nop_();
  71.     _nop_();
  72.     while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
  73.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC

  74.     return ADC_RES;                 //Return ADC result
  75. }

  76. /*----------------------------
  77. Initial UART
  78. ----------------------------*/
  79. void InitUart()
  80. {
  81.     SCON = 0x5a;                    //8 bit data ,no parity bit
  82.     TMOD = 0x20;                    //T1 as 8-bit auto reload
  83.     TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
  84.     TR1 = 1;                        //T1 start running
  85. }

  86. /*----------------------------
  87. Initial ADC sfr
  88. ----------------------------*/
  89. void InitADC()
  90. {
  91.     P1ASF = 0xff;                   //Open 8 channels ADC function
  92.     ADC_RES = 0;                    //Clear previous result
  93.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  94.     Delay(2);                       //ADC power-on and delay
  95. }

  96. /*----------------------------
  97. Send one byte data to PC
  98. Input: dat (UART data)
  99. Output:-
  100. ----------------------------*/
  101. void SendData(BYTE dat)
  102. {
  103.     while (!TI);                    //Wait for the previous data is sent
  104.     TI = 0;                         //Clear TI flag
  105.     SBUF = dat;                     //Send current data
  106. }

  107. /*----------------------------
  108. Software delay function
  109. ----------------------------*/
  110. void Delay(WORD n)
  111. {
  112.     WORD x;

  113.     while (n--)
  114.     {
  115.         x = 5000;
  116.         while (x--);
  117.     }
  118. }


huangenda 发表于 2014-2-28 15:29 | 显示全部楼层
谢谢楼上指导  谢谢
hbc0602 发表于 2014-3-4 23:18 | 显示全部楼层
正好也在用这款单片机。楼主用汇编写吧,设置好几个寄存器就可以得到想要的电压值了,非常简洁
nanggood 发表于 2014-3-11 16:49 | 显示全部楼层
xjf8979 发表于 2014-3-23 16:34 | 显示全部楼层
hao !!!!!!!!!!!!!!!!!!
 楼主| sangao0 发表于 2014-4-10 14:48 | 显示全部楼层
我回来了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

97

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部