找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7649|回复: 6
收起左侧

ADC0832模数转换采集电压上位机和下位机单片机程序源码

[复制链接]
ID:3721 发表于 2016-6-17 01:15 | 显示全部楼层 |阅读模式


0.png

ADC0832电压采集上位机程序,51黑附件中可下载vc++源码


下面是单片机做的下位机程序:
  1. #include<reg52.h>
  2. #include "intrins.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit ADCS =P2^3;  //ADC0832 chip seclect
  6. sbit ADDI =P2^2;  //ADC0832 k in
  7. sbit ADDO =P2^1;  //ADC0832 k out
  8. sbit ADCLK =P2^0;  //ADC0832 clock signal

  9. sbit cs=P2^2;
  10. sbit wr=P2^3;
  11. unsigned char dispbitcode[8]={0xf7,0xfb,0xfd};  //位扫描
  12. unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
  13. unsigned char dispbuf[3];
  14. unsigned char table[9]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  15. uint temp,adc=0;
  16. uchar getdata; //获取ADC转换回来的值
  17. uchar flag,a;

  18. void delayms(void)  //12mhz delay 1.01ms
  19. {
  20.    unsigned char x,y;   
  21.    x=10;
  22.    while(x--)
  23.   {
  24.        y=4;
  25.        while(y--);
  26.     }
  27. }

  28. void display(void)  //数码管显示函数
  29. {
  30.   char k;
  31. for(k=0;k<3;k++)
  32.   {

  33.   P1 = dispbitcode[k];
  34.   
  35.   P0 = dispcode[dispbuf[k]];
  36.    
  37.     delayms();
  38.   if(k==0)          //加上数码管的dp小数点
  39.           P0&=0x7f;
  40.   delayms();
  41.            P1=0xff;
  42.   
  43.   }
  44. }
  45. //采集并返回
  46. unsigned int Adc0832(unsigned char channel)     //AD转换,返回结果
  47. {
  48.     uchar i=0;
  49.     uchar j;
  50.     uint dat=0;
  51.     uchar ndat=0;

  52.     if(channel==0)channel=2;
  53.     if(channel==1)channel=3;
  54.     ADDI=1;
  55.     _nop_();
  56.     _nop_();
  57.     ADCS=0;//拉低CS端
  58.     _nop_();
  59.     _nop_();
  60.     ADCLK=1;//拉高CLK端
  61.     _nop_();
  62.     _nop_();
  63.     ADCLK=0;//拉低CLK端,形成下降沿1
  64.     _nop_();
  65.     _nop_();
  66.     ADCLK=1;//拉高CLK端
  67.     ADDI=channel&0x1;
  68.     _nop_();
  69.     _nop_();
  70.     ADCLK=0;//拉低CLK端,形成下降沿2
  71.     _nop_();
  72.     _nop_();
  73.     ADCLK=1;//拉高CLK端
  74.     ADDI=(channel>>1)&0x1;
  75.     _nop_();
  76.     _nop_();
  77.     ADCLK=0;//拉低CLK端,形成下降沿3
  78.     ADDI=1;//控制命令结束
  79.     _nop_();
  80.     _nop_();
  81.     dat=0;
  82.     for(i=0;i<8;i++)
  83.     {
  84.         dat|=ADDO;//收数据
  85.         ADCLK=1;
  86.         _nop_();
  87.         _nop_();
  88.         ADCLK=0;//形成一次时钟脉冲
  89.         _nop_();
  90.         _nop_();
  91.         dat<<=1;
  92.         if(i==7)dat|=ADDO;
  93.     }  
  94.     for(i=0;i<8;i++)
  95.     {
  96.         j=0;
  97.         j=j|ADDO;//收数据
  98.         ADCLK=1;
  99.         _nop_();
  100.         _nop_();
  101.         ADCLK=0;//形成一次时钟脉冲
  102.         _nop_();
  103.         _nop_();
  104.         j=j<<7;
  105.         ndat=ndat|j;
  106.         if(i<7)ndat>>=1;
  107.     }
  108.     ADCS=1;//拉低CS端
  109.     ADCLK=0;//拉低CLK端
  110.     ADDO=1;//拉高数据端,回到初始状态
  111.     dat<<=8;
  112.     dat|=ndat;
  113.     return(dat);            //return ad k
  114. }


  115. void main()
  116. { P0=0XFF;
  117.   TMOD=0x20;
  118. TH1=0xfd;
  119. TL1=0xfd;
  120. TR1=1;
  121. REN=1;
  122. SM0=0;
  123.   SM1=1;
  124.   EA=1;
  125.   ES=1;
  126.   while(1)
  127.   {           if(flag==1)
  128.      {        
  129.             ES=0;
  130.             flag=0;
  131.             SBUF=getdata;
  132.    while(!TI);
  133.            TI=0;
  134.         ES=1;               
  135.                

  136.          
  137.          }
  138.            getdata=Adc0832(1);
  139.   temp=getdata*1.0/255*500;  //电压值转换,5V做为参考电压,分成256份。
  140.   dispbuf[2]=temp%10;         //个位
  141.   dispbuf[1]=temp/10%10; //十位
  142.   dispbuf[0]=temp/100; //百位

  143.          
  144.       display();
  145.   
  146.   }        

  147. }
  148. void ckzd() interrupt 4
  149. {        
  150.          RI=0;
  151.          
  152.          a=SBUF;



  153.    switch(a)
  154.    {
  155.                    case 'a':

  156.                      flag=1; break;

  157.                 case 'b':

  158.                   P0=adc; break;

  159.                 case 'c':
  160.         
  161.                   P0=adc; break;

  162.                 default:
  163.         P1=0xFF;
  164.         break;
  165.     }
  166.         
  167. }
复制代码


0.png

ADC0832模数转换测试程序,带上位机源程序和下位机源程序,将adc0832采集的电压值送给上位机显示,本人亲测

上位机和下位机ADC0832upanddown.rar (5.72 MB, 下载次数: 136)
回复

使用道具 举报

ID:273849 发表于 2018-5-14 19:44 | 显示全部楼层
是用什么软件做的啊
回复

使用道具 举报

ID:65956 发表于 2018-9-27 13:21 | 显示全部楼层
才0-5V,上位机也才那样,功能太简单了,测量范围也太小了,还有ADC才8位,精度太差
回复

使用道具 举报

ID:186637 发表于 2018-10-19 21:55 | 显示全部楼层
谢谢分享!学习学习!
回复

使用道具 举报

ID:478255 发表于 2019-3-22 10:02 | 显示全部楼层
这个_nop_是什么意思?延时的意思吗
回复

使用道具 举报

ID:63090 发表于 2020-5-10 12:28 | 显示全部楼层
挺好O,感谢分享
回复

使用道具 举报

ID:860602 发表于 2021-1-8 22:37 | 显示全部楼层

这个_nop_是什么意思?延时的意思吗  

是的 ,相当于汇编的nop指令
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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