标题: 单片机+ADC0832简易数字电压表proteus仿真与程序源码(带详细注释) [打印本页]

作者: 1379366386    时间: 2018-6-9 23:25
标题: 单片机+ADC0832简易数字电压表proteus仿真与程序源码(带详细注释)
给大家分享一个用ADC0832模数转换芯片设计的电压表设计,内含protues电路图和带有注释的keil工程文件

ADC0832电压表仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机电压表源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char
  5.         
  6. sbit CS =P3^4;              //片选使能端
  7. sbit DI =P1^1;               //数据信号输入端,选择通道控制(SIG/DIF和ODD/EVEN)
  8. sbit DO =P1^1;             //数据输出端
  9. sbit CLK =P1^0;           //时钟脉冲

  10. sbit S_1 = P2^3;
  11. sbit S_2 = P2^4;
  12. sbit S_3 = P2^5;
  13. sbit S_4 = P2^6;

  14. unsigned char wd[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //不带小数点的段选码
  15. unsigned char yd[]={0x40,0x79,0x024,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的段选码

  16. // ===========延时子程序=================
  17. void delay_ms(unsigned int x)
  18. {
  19.         unsigned int i,j;
  20.         for(i=0;i<x;i++)
  21.              for(j=0;j<123;j++);              //延时1ms
  22. }
  23. /*=============读ADC0832函数=============*/
  24. /*=============采集并返回=================*/
  25. unsigned int Adc0832(unsigned char channel)  //AD转换,返回结果
  26. {
  27.     uchar i=0;   
  28.                 uchar j;
  29.                 uint dat=0;            //正向输入数据
  30.                 uchar ndat=0;       //反向输入数据
  31. //****************初始化操作**************
  32.                 if(channel==0)channel=2;     //10B对应SGL/DIF=1,ODD/EVEN=0
  33.                 if(channel==1)channel=3;     //11B对应SGL/DIF=1,ODD/EVEN=1
  34. //****************写操作,将通道数据写入ADC0832**************
  35.            DI=1; _nop_();_nop_();     //发起始位,固定为1(1位)
  36.                  CS=0;_nop_();_nop_();     //拉低CS端,让ADC0832使能
  37.                  CLK=1;_nop_();_nop_();   //拉高CLK端,DI端的数据移入ADC0832内部的多路移位寄存器
  38.                  CLK=0;_nop_();_nop_();    //拉低CLK端,形成下降沿1,第一个周期开始
  39.                  CLK=1;    //拉高CLK端,在第一个时钟周期内,DI为高电平,表示启动位
  40.                                          //紧接着输入两位配置位进行通道选择
  41.                         DI=channel&0x1;_nop_();_nop_(); //假设选取通道0,则10&01=0,即SGL/DIF=0,为差分输入(2位)
  42.                         CLK=0;_nop_();_nop_();    //拉低CLK端,形成下降沿2,第二个周期开始
  43.                         CLK=1;                                //拉高CLK端
  44.                         DI=(channel>>1)&0x1;_nop_();_nop_();  //假设选取通道0,则01&01=1,ODD/EVEN=1,表示通道0
  45.             CLK=0;                                 //拉低CLK端,形成下降沿3
  46.                         DI=1;_nop_();_nop_();        //控制命令结束
  47.                         dat=0;
  48.                 //*************读操作,将AD转换的数从DO口输出****************
  49.                         for(i=0;i<8;i++)   //每一个CLK下降沿输出一位数,先输出高位
  50.                         {
  51.                                  dat|=DO;    //收数据,“|”位或,如果2位中有一位为1,则结果为1,否则为0
  52.                                  CLK=1;_nop_();_nop_();
  53.                                  CLK=0;_nop_();_nop_();      //形成一次时钟脉冲
  54.                                  dat<<=1;
  55.                                  if(i==7)dat|=DO;
  56.                         }
  57.                         
  58.                         for(i=0;i<8;i++)  //每一个CLK下降沿输出一位数,先输出低位
  59.                         {
  60.                                  j=0;
  61.                                  j=j|DO;    //收数据
  62.                                  CLK=1;_nop_();_nop_();
  63.                                  CLK=0;_nop_();_nop_();    //形成一次时钟脉冲
  64.                                  j=j<<7;
  65.                                  ndat=ndat|j;
  66.                                  if(i<7)ndat>>=1;
  67.                         }
  68. //*********************结束AD转换,并返回转换的数***********************
  69.                         CS=1;     //拉低CS端
  70.                         CLK=0;   //拉低CLK端
  71.                         DO=1;     //拉高数据端,回到初始状态
  72.                         dat<<=8;
  73.                         dat|=ndat;
  74.                         return(dat);            //返回数据
  75.                         }
  76. //============数码管显示函数==========================
  77.         void display(uchar p)                  //数码管显示函数
  78.         {
  79.         uchar S1,S2,S3;

  80.         S1=p/51;                       //个位
  81.         S2=(p*10/51)%10;        //十分位
  82.         S3=(p*100/51)%10;      //百分位
  83.                
  84.         //个位
  85.         S_1 = 1;                 //第一个数码管
  86.         S_2 = 0;
  87.         S_3 = 0;
  88.         S_4= 0;
  89.         P0=yd[S1];             //选取带有小数点的段选码
  90.         delay_ms(5);               //延时
  91.         S_1 = 0;                        //消隐
  92.                
  93.   //十分位
  94.         S_1 = 0;
  95.         S_2 = 1;                   //取第二个数码管
  96.         S_3= 0;
  97.         S_4= 0;
  98.         P0=wd[S2];              //选取不带有小数点的段选码
  99.   delay_ms(5);
  100.         S_2 = 0;                    //消隐
  101.         
  102.   //百分位
  103.         S_1 = 0;
  104.         S_2 = 0;
  105.         S_3= 1;                      //取第三个数码管
  106.         S_4= 0;
  107.         P0=wd[S3];                //选取不带有小数点的段选码
  108.         delay_ms(5);  
  109.   S_3= 0;                       //消隐
  110.         }
  111. //===========主函数================
  112.         int main(void)
  113. {
  114.         while(1)                    //无限循环
  115.         display(Adc0832(0));//数码管显示
  116. //Adc0832(0):选择通道0,单端模式
  117. //调用Adc0832(0),SIG/DIF=0,ODD/EVEN=1,表示工作在差分输入方式,且CH0为-,CH1为+
  118. ……………………

  119. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
Keil代码与Proteus8.8仿真下载:
基于ADC0832简易数字电压表.zip (64.85 KB, 下载次数: 1077)


作者: 芋头0305    时间: 2018-8-13 18:07
感谢分享!!
作者: wangwang325    时间: 2018-8-29 08:57
感谢分享
作者: 95517413    时间: 2018-10-26 12:56
感谢分享
作者: 95517413    时间: 2018-10-26 12:56
很棒的帖子
作者: 860921464    时间: 2018-12-16 17:48
仿真文件损坏了,或者是我的版本太低打不开,再发个低版本的好吗楼主
作者: 860921464    时间: 2018-12-16 18:08
P0不需要上拉电阻吗

作者: Z_SIMPLE    时间: 2018-12-19 12:58
只能显示内部电压,不能测量外电压
作者: ACD456456    时间: 2018-12-27 21:17
感谢分享
作者: 攸央    时间: 2019-1-7 10:00
感谢分享
作者: 123789654    时间: 2019-4-23 09:41
感谢分享

作者: yoyoyo...    时间: 2019-5-10 15:49
感谢分享
作者: 11551155    时间: 2019-6-6 20:45
感谢分享
作者: lzhcccc    时间: 2019-6-20 17:18
下载了打不开呢?
作者: 鹏博士PBs    时间: 2019-6-20 22:45
好资源值得点赞
作者: 1176395912    时间: 2019-7-12 15:44
感谢分享
作者: huizi123    时间: 2019-7-13 16:04
请问一下这是0~5的量程么

作者: 98ugly    时间: 2019-7-31 10:07
真棒,proteus打不开,文件大小和贴的图都不对等,咋办呀
作者: 1598207459    时间: 2019-8-8 00:05
感谢分享
作者: 1192083214    时间: 2019-10-29 13:26
感谢分享

作者: ColdMountain    时间: 2019-11-20 14:30
感谢大佬分享
作者: adadad123    时间: 2019-11-26 20:56
最后得到16位二进制数?
作者: ljl100038    时间: 2019-12-5 10:16
感谢分享
作者: 2207302596    时间: 2019-12-21 17:53
感谢分享

作者: Adam千    时间: 2020-1-7 10:19

感谢分享
作者: Administrators0    时间: 2020-4-15 19:13
感谢分享
作者: lu2931178    时间: 2020-4-28 01:31
感谢分享!!
作者: xiaohello    时间: 2020-5-10 18:23
感谢分享
作者: lgh987    时间: 2020-5-12 19:11
垃圾
作者: nmbiss    时间: 2020-5-14 23:06
感谢分享
作者: daocheng    时间: 2020-5-14 23:47
想问一下ADC0832速度怎么样,可以做数字示波器吗
作者: 张然Adolf    时间: 2020-5-18 15:32
你好,如果要进行超值预警,那应该怎么做了?
作者: 2441143614    时间: 2020-6-5 13:58
谢谢分享
作者: demonhunter    时间: 2020-6-6 17:31
感谢分享
作者: 塞纳河右畔    时间: 2020-6-11 18:46
感谢分享

作者: zdxw    时间: 2020-6-15 18:08
为什么我的下载打不开仿真?
作者: Urb    时间: 2020-6-26 00:24
仿真图打不开啊

作者: wangqianlan    时间: 2020-7-2 12:12
都是c没有asm
作者: 安风    时间: 2020-7-10 15:53
大佬们,保留两位整数,一位小数的怎么改
作者: 634658537    时间: 2022-9-19 15:53
仿真图打不开,没用的
作者: heicad    时间: 2022-9-20 03:43
634658537 发表于 2022-9-19 15:53
仿真图打不开,没用的

用Proteus8.8才能打开,亲测  看动图

51hei.gif (94.06 KB, 下载次数: 231)

51hei.gif

作者: lsh04    时间: 2022-9-20 18:04
好资源值得点赞
作者: user2402167    时间: 2023-9-23 02:07
感谢分享。试一试效果。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1