標題: 單片機+ADC0832簡易數(shù)字電壓表proteus仿真與程序源碼(帶詳細注釋) [打印本頁]

作者: 1379366386    時間: 2018-6-9 23:25
標題: 單片機+ADC0832簡易數(shù)字電壓表proteus仿真與程序源碼(帶詳細注釋)
給大家分享一個用ADC0832模數(shù)轉換芯片設計的電壓表設計,內含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;               //數(shù)據(jù)信號輸入端,選擇通道控制(SIG/DIF和ODD/EVEN)
  8. sbit DO =P1^1;             //數(shù)據(jù)輸出端
  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}; //不帶小數(shù)點的段選碼
  15. unsigned char yd[]={0x40,0x79,0x024,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//帶小數(shù)點的段選碼

  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函數(shù)=============*/
  24. /*=============采集并返回=================*/
  25. unsigned int Adc0832(unsigned char channel)  //AD轉換,返回結果
  26. {
  27.     uchar i=0;   
  28.                 uchar j;
  29.                 uint dat=0;            //正向輸入數(shù)據(jù)
  30.                 uchar ndat=0;       //反向輸入數(shù)據(jù)
  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. //****************寫操作,將通道數(shù)據(jù)寫入ADC0832**************
  35.            DI=1; _nop_();_nop_();     //發(fā)起始位,固定為1(1位)
  36.                  CS=0;_nop_();_nop_();     //拉低CS端,讓ADC0832使能
  37.                  CLK=1;_nop_();_nop_();   //拉高CLK端,DI端的數(shù)據(jù)移入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轉換的數(shù)從DO口輸出****************
  49.                         for(i=0;i<8;i++)   //每一個CLK下降沿輸出一位數(shù),先輸出高位
  50.                         {
  51.                                  dat|=DO;    //收數(shù)據(jù),“|”位或,如果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下降沿輸出一位數(shù),先輸出低位
  59.                         {
  60.                                  j=0;
  61.                                  j=j|DO;    //收數(shù)據(jù)
  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轉換,并返回轉換的數(shù)***********************
  69.                         CS=1;     //拉低CS端
  70.                         CLK=0;   //拉低CLK端
  71.                         DO=1;     //拉高數(shù)據(jù)端,回到初始狀態(tài)
  72.                         dat<<=8;
  73.                         dat|=ndat;
  74.                         return(dat);            //返回數(shù)據(jù)
  75.                         }
  76. //============數(shù)碼管顯示函數(shù)==========================
  77.         void display(uchar p)                  //數(shù)碼管顯示函數(shù)
  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;                 //第一個數(shù)碼管
  86.         S_2 = 0;
  87.         S_3 = 0;
  88.         S_4= 0;
  89.         P0=yd[S1];             //選取帶有小數(shù)點的段選碼
  90.         delay_ms(5);               //延時
  91.         S_1 = 0;                        //消隱
  92.                
  93.   //十分位
  94.         S_1 = 0;
  95.         S_2 = 1;                   //取第二個數(shù)碼管
  96.         S_3= 0;
  97.         S_4= 0;
  98.         P0=wd[S2];              //選取不帶有小數(shù)點的段選碼
  99.   delay_ms(5);
  100.         S_2 = 0;                    //消隱
  101.         
  102.   //百分位
  103.         S_1 = 0;
  104.         S_2 = 0;
  105.         S_3= 1;                      //取第三個數(shù)碼管
  106.         S_4= 0;
  107.         P0=wd[S3];                //選取不帶有小數(shù)點的段選碼
  108.         delay_ms(5);  
  109.   S_3= 0;                       //消隱
  110.         }
  111. //===========主函數(shù)================
  112.         int main(void)
  113. {
  114.         while(1)                    //無限循環(huán)
  115.         display(Adc0832(0));//數(shù)碼管顯示
  116. //Adc0832(0):選擇通道0,單端模式
  117. //調用Adc0832(0),SIG/DIF=0,ODD/EVEN=1,表示工作在差分輸入方式,且CH0為-,CH1為+
  118. ……………………

  119. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
Keil代碼與Proteus8.8仿真下載:
基于ADC0832簡易數(shù)字電壓表.zip (64.85 KB, 下載次數(shù): 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
仿真文件損壞了,或者是我的版本太低打不開,再發(fā)個低版本的好嗎樓主
作者: 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位二進制數(shù)?
作者: 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速度怎么樣,可以做數(shù)字示波器嗎
作者: 張然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
大佬們,保留兩位整數(shù),一位小數(shù)的怎么改
作者: 634658537    時間: 2022-9-19 15:53
仿真圖打不開,沒用的
作者: heicad    時間: 2022-9-20 03:43
634658537 發(fā)表于 2022-9-19 15:53
仿真圖打不開,沒用的

用Proteus8.8才能打開,親測  看動圖

51hei.gif (94.06 KB, 下載次數(shù): 231)

51hei.gif

作者: lsh04    時間: 2022-9-20 18:04
好資源值得點贊
作者: user2402167    時間: 2023-9-23 02:07
感謝分享。試一試效果。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1