找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3762|回复: 1
收起左侧

STC12C5A16AD模数转换

[复制链接]
ID:71259 发表于 2014-12-30 01:06 | 显示全部楼层 |阅读模式
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include "STC_NEW_8051.H"

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. //以下选择 ADC 转换速率,只能选择其中一种
  7.                         //            SPEED1 SPEED0  A/D转换所需时间
  8. //#define AD_SPEED   0x60 //  0110,0000   1      1   70 个时钟周期转换一次,
  9.                         //  CPU工作频率21MHz时 A/D转换速度约 300KHz
  10. //#define AD_SPEED   0x40 //0100,0000   1      0     140 个时钟周期转换一次
  11. //#define AD_SPEED   0x20 //0010,0000   0      1     280 个时钟周期转换一次
  12. #define AD_SPEED   0x00 //0000,0000   0      0     420 个时钟周期转换一次

  13. code unsigned char digit[]={'0','1','2','3','4','5','6','7','8','9' };



  14. /******************************************************************/
  15. /*                    定义端口                                    */
  16. /******************************************************************/

  17.                      
  18. sbit rs=P1^0;  //显示数据端口P2
  19. sbit rw=P1^1;
  20. sbit en=P1^2;
  21.      
  22. /******************************************************************/
  23. /*                   函数声明                                     */
  24. /******************************************************************/

  25. void write_order(uchar order);
  26.                                                                  
  27. void write_date(uchar date);

  28. void write_address(uchar x);

  29. unsigned int get_AD_result_10F(unsigned char channel);



  30. //延时
  31. void delay(uchar m)
  32. {
  33. uchar i=100;
  34. while(m--)
  35. {
  36.   while(i--);
  37. }
  38. }




  39. /******************************************************************/
  40. /*                  写命令                                 */
  41. /******************************************************************/
  42. void write_order(uchar order)
  43. {
  44. rs=0;
  45. P2=order;
  46. delay(4);
  47. en=1;
  48. delay(4);
  49. en=0;
  50. }
  51. /******************************************************************/
  52. /*                   写数据                               */
  53. /******************************************************************/
  54. void write_data(uchar date)
  55. {
  56. rs=1;
  57. P2=date;
  58. delay(4);
  59. en=1;
  60. delay(4);
  61. en=0;
  62. }
  63. /******************************************************************/
  64. /*                   写地址                         */
  65. /******************************************************************/
  66. void write_address(uchar x)
  67. {
  68. write_order(0x80+x);
  69. }


  70. /******************************************************************/
  71. /*                  1602 初始化                               */
  72. /******************************************************************/
  73.   void init_lcd()
  74. {
  75. rw=0;
  76. en=0;
  77. write_order(0x38);
  78. write_order(0x0c);
  79. write_order(0x06);
  80. write_order(0x01);
  81. }




  82. /******************************************************************/
  83. /*                        主函数                                */
  84. /******************************************************************/
  85. void main()
  86. {
  87. unsigned char ADC_result ;
  88.     unsigned long int gg ;
  89.      uchar g,s,b  ;

  90.    P1ASF = 0x80;   //1000 0000选择P1^7作为模拟输入口
  91.   

  92. //ADRJ = AUXR1^2:
  93. //    0: 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
  94. //    1: 10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在
  95. AUXR1 &= ~0x04;         //0000,0100, 令 ADRJ=0
  96.    ADC_CONTR |= 0x80;    //1000,0000 打开 A/D 转换电源
  97.     delay(10);
  98.     init_lcd();    //lcd初始化
  99.   delay(15);   
  100.   
  101. while(1)
  102. {  /*
  103.     ADC_result = get_AD_result_10F(7); //P1.7为 A/D 当前通道, 接电压源进行测量
  104.    gg=(unsigned long int)((unsigned long int)ADC_result*465)/256;  //“470”根据实际情况而定
  105.    b=(gg%1000)/100;
  106.    s=(gg%100)/10;
  107.    g=gg%10;
  108.    write_address(0x40);
  109.    write_data(digit[b]);
  110.    write_data('.');
  111.    write_data(digit[s]);
  112.    write_data(digit[g]);  */
  113.    ADC_result = get_AD_result_10F(7); //P1.7为 A/D 当前通道, 接电压源进行测量
  114.    gg=(unsigned long int)((unsigned long int)ADC_result*485)/256;  //“470”根据实际情况而定
  115.    b=(gg%1000)/100;
  116.    s=(gg%100)/10;
  117.    g=gg%10;
  118.    if(g>=5){
  119.     s++;
  120.   if(s==10)
  121.   {
  122.    s=0;
  123.    b++;
  124.   }
  125.    
  126.   }
  127.   
  128.    write_address(0x40);
  129.    write_data(digit[b]);
  130.    write_data('.');
  131.    write_data(digit[s]);
  132.      
  133.    
  134.   

  135. }


  136. }


  137. /****************************************************************************/
  138. /*                     10位AD带均值滤波转换           */
  139. /*****************************************************************************/
  140. unsigned int get_AD_result_10F(unsigned char channel)   
  141. {
  142.     unsigned char AD_finished=0;            //存储 A/D 转换标志
  143. unsigned int out=0;

  144. unsigned int N=40;
  145. unsigned int sum=0;
  146. unsigned char m;

  147.     ADC_RES = 0;
  148.     ADC_RESL = 0;

  149.     channel &= 0x07;                //0000,0111 清0高5位
  150.     ADC_CONTR = AD_SPEED;
  151.     _nop_();
  152.     ADC_CONTR |= channel;           //选择 A/D 当前通道
  153.     _nop_();
  154.     ADC_CONTR |= 0x80;              //启动 A/D 电源
  155.     delay(1);                       //使输入电压达到稳定

  156.    for(m=0;m<N;m++)
  157.    {                   //均值滤波
  158.     ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 启动A/D转换,
  159.     AD_finished = 0;
  160.     while (AD_finished ==0 )        //等待A/D转换结束
  161.     {
  162.         AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
  163.     }
  164.     ADC_CONTR &= 0xE7;              //1110,0111 清 ADC_FLAG 位, 关闭A/D转换,
  165. out= ADC_RES;
  166. // out=(out<<2)+(ADC_RESL&0xfc);
  167. sum=sum+out;
  168. }          //带均值滤波

  169.     return (sum/N);               //返回 A/D 高 8 位转换结果
  170. }

复制代码




头文件:
  1. /**************************************************************************

  2.     STC_NEW_8051.H

  3. ************************************************************************/                                                               
  4. sfr P1ASF = 0x9D; //P1 analog special function
  5. sfr AUXR  = 0x8E; //Auxiliary Register  T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS  0000,0000
  6. //-----------------------------------
  7. sfr AUXR1 = 0xA2; //Auxiliary Register 1  -  PCA_P4  SPI_P4  S2_P4  GF2    ADRJ   -    DPS  0000,0000
  8. sfr ADC_CONTR = 0xBC; //A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
  9. sfr ADC_RES  = 0xBD;  //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2  0000,0000
  10. sfr ADC_RESL = 0xBE;  //A/D 转换结果低2位                                           ADCV.1 ADCV.0  0000,0000
  11. sfr BRT = 0x9C; //S2 Baud-Rate Timer                                                    0000,0000

复制代码



回复

使用道具 举报

ID:390650 发表于 2018-9-17 14:56 | 显示全部楼层
好好学习学习 可以使用一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表