找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2890|回复: 0
收起左侧

ad0832采集5V电压

[复制链接]
ID:139309 发表于 2016-9-13 16:02 | 显示全部楼层 |阅读模式

采集电路.png

采集电路.png

  1. #include <reg52.h>
  2. #include<intrins.h>
  3. #include<math.h>
  4. #include <stdio.h>

  5. char data str[]="                ";
  6. /**********************************/
  7.   /**********LCD1602接口程序**********/

  8. #define DD P2
  9. sbit Rs=P3^0;
  10. sbit Rw=P3^1;
  11. sbit E=P3^2;

  12. /********************************/
  13. void delay_1ms(unsigned char i)   //最小延时1ms
  14. {
  15.         unsigned char j;
  16.         while(i--)
  17.         for(j=0;j<125; j++);
  18. }
  19. void delay_10us(unsigned char i) //最小延时10us
  20. {
  21.         unsigned char j;
  22.         while(i--)
  23.         for(j=0;j<10; j++);
  24. }

  25. void write_com(unsigned char com)   //写指令
  26. {
  27.         delay_10us(5);
  28.         E=0;
  29.         Rs=0;
  30.         Rw=0;
  31.         DD=com;
  32.         delay_10us(50); //>40us
  33.         E=1;
  34.         delay_1ms(2); //>150us
  35.         E=0;
  36.         delay_10us(4); //>25+10us
  37. }

  38. void write_data(unsigned char DATA)   //写数据
  39. {
  40.         delay_10us(50);
  41.         E=0;
  42.         Rs=1;
  43.         Rw=0;
  44.         DD=DATA;
  45.         delay_10us(50);
  46.         E=1;
  47.         delay_10us(50);
  48.         E=0;
  49.         delay_10us(4);
  50. }


  51. void addr_x_y(unsigned char x,bit y)   //写坐标,定位置
  52. {
  53.         unsigned char temp=0x80;                        //默认最高位:D7为1 即以0x80开始。         
  54.         if(y)                                                                //y :0为第一行  1为第二行
  55.                    {
  56.                            temp|=0x40;
  57.                    }
  58.                            temp|=x;
  59.         write_com(temp);
  60. }


  61. void Show_Char(unsigned char x,bit y,unsigned char p)

  62. //在指定位置显示一个字符。
  63. {
  64.         addr_x_y(x,y);
  65.         write_data(p);
  66. }

  67. void Show_String(unsigned char x,bit y,char *ptr)
  68. {
  69.          unsigned char i;
  70.         for (i=0;i<16;i++)
  71.          Show_Char(x++,y,*(ptr+i));//循环显示16个字符
  72. }


  73. void init(void)                 //1602初始化代码
  74. {
  75.         delay_1ms(1500);
  76.         write_com(0x38);
  77.         delay_1ms(5);
  78.         write_com(0x38);
  79.         delay_1ms(5);
  80.         write_com(0x38);
  81.         delay_1ms(5);
  82.         write_com(0x38);
  83.         write_com(0x08);
  84.         write_com(0x06);
  85.         write_com(0x0c);
  86.         write_com(0x01);
  87. }
  88. void xs_int(unsigned int shuju,bit t)   //数据显示
  89. {
  90.         unsigned char huancun[6]={0};
  91.         unsigned char biaozhi=0,i;
  92.         if   (shuju < 10) biaozhi = 1;
  93.         else if(shuju < 100) biaozhi = 2;
  94.         else if(shuju < 1000) biaozhi = 3;
  95.         else if(shuju < 10000) biaozhi = 4;
  96.         else if(shuju < 65535) biaozhi = 5;
  97.         switch(biaozhi)                        //这里没有break,因此从标识匹配的入口直接执行到最后,完成整数各位的提取到数组。
  98.            {
  99.            case 5:huancun[5] = shuju/10000;
  100.             case 4:huancun[3] = shuju%10000/1000;
  101.             case 3:huancun[2] = shuju%1000/100;
  102.             case 2:huancun[1] = shuju%100/10;
  103.             case 1:huancun[0] = shuju%10;        break;
  104.             default:break;
  105.                 }
  106.         for(i=0;i<6;i++)
  107.                    {
  108.                            if(i==1)Show_Char(i,1,'.');                 //加入小数点,缩小了10000倍,因此AD采样后的值需要乘上10000*5V/256=196(V)
  109.                 else Show_Char(i,t,0x30+huancun[6-i-1]);
  110.                 }
  111.         Show_Char(6,t,'V');
  112. }


  113. /************************************************************/
  114. /**********ADC0832接口程序************************************/
  115. sbit ADC_CS =P3^4;
  116. sbit ADC_CLK=P3^5;
  117. sbit ADC_DO =P3^6;
  118. sbit ADC_DI =P3^7;
  119. /*******************************************************************/
  120. void Delay(unsigned char j)
  121. {
  122.          unsigned char i;
  123.          for(i=0;i<j;i++); //延时,脉冲一位持续的时间
  124. }

  125. unsigned char ADC0832(void) //把模拟电压值转换成8位二进制数并返回
  126. {
  127.          unsigned char i,data_c;
  128.          data_c=0;
  129.          ADC_CS=0;
  130.          ADC_CLK=1;
  131.          ADC_DO=0;//片选,DO为高阻态
  132.          //ADC_DI=0;        //先拉低
  133.         
  134.          for(i=0;i<10;i++)
  135.                     {;}
  136.         
  137.         ADC_CLK=0;
  138.         Delay(2);
  139.         ADC_CLK=1;
  140.         ADC_DI=1; //启始位         
  141.         Delay(2);
  142.         
  143.         ADC_CLK=0;          //第一个脉冲下降沿,DI=1为起始位
  144.         Delay(2);
  145.         ADC_CLK=1;
  146.         ADC_DI=1;          //1
  147.         Delay(2);
  148.         
  149.         ADC_CLK=0;           //第二个脉冲下降沿,DI=1
  150.         Delay(2);
  151.         ADC_DI=1;  //1        若为0则选择CH0
  152.         ADC_CLK=1;
  153.         Delay(2);
  154.         
  155.         ADC_CLK=0;          //第三个脉冲下降沿,DI=1,选择 ADC0832 的CH1(1 1)
  156.         Delay(2);
  157.         ADC_DI=1;          //已不关心
  158.         ADC_DO=1;        //高阻
  159.         ADC_CLK=1;
  160.         Delay(2);
  161.         
  162.         for (i=0; i<8; i++)
  163.             {
  164.                         ADC_CLK=0;         //第四个开始读数据
  165.                         Delay(2);
  166.                     data_c=(data_c<<1)|ADC_DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数
  167.                         ADC_CLK=1;
  168.                         Delay(2);
  169.                    }
  170.         ADC_CS=1;//取消片选,一个转换周期结束
  171.         return(data_c);//把转换结果返回
  172. }

  173. void main(void)
  174. {
  175.         unsigned int data_temp=0;
  176.         while(1)
  177.         {
  178.                 data_temp=ADC0832();
  179.                 sprintf(str,"The voltage is:"); //the first line
  180.                    init();
  181.                 Show_String(0,0,str);
  182.                 xs_int(196*data_temp,1);           //10000*5V/256=196(V),把采样值放大10000倍后再处理,移动小数点4位。 4位有效数字,其实用不到,因为8位采样精度为:0.019V
  183.                 delay_1ms(1500);
  184.    }
  185. }
复制代码


评分

参与人数 1黑币 +70 收起 理由
admin + 70 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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