标题: ADC0809多通道测量电压proteus仿真和源程序 原理图 [打印本页]

作者: 51黑ff    时间: 2016-9-26 15:57
标题: ADC0809多通道测量电压proteus仿真和源程序 原理图
给51黑电子论坛的朋友们分享一个51单片机+ADC0809多通道(一共8个通道)测量电压的proteus工程,经单片机ALE的2MHz一分频后得到1MHz的时钟提供给ADC0809
数码管显示说明:最后一位为通道号,程序中已用两点隔开
在此为了方便电路连接
实际电路中请用三极管或专用芯片驱动三极管
下面是仿真原理图:
8通道电压表的所有资料下载:
ADC0809多通道测电压.rar (68.79 KB, 下载次数: 380)


部分单片机源程序如下(完整代码请下载附件):
  1. #include "adc0809.c"
  2. #define LED_Data P2
  3. #define A 10
  4. #define U 11
  5. sbit  LED1 = P3^0;
  6. sbit  LED2 = P3^1;
  7. sbit  LED3 = P3^2;
  8. sbit  LED4 = P3^3;
  9. sbit  dp   = P3^5;
  10. #define LED_slect  P3

  11. static unsigned char dispdata[4];

  12. unsigned char code num[] = {
  13.                                                                                                           0x3f,0x06,0x5b,0x4f,0x66,0x6d,
  14.                                                                                                           0x7d,0x07,0x7f,0x6f,0x77,0x3e
  15.                                                                                                    };

  16. void decodenum(float adv,unsigned char chn)
  17. {
  18.   unsigned int temp;
  19.   temp = (unsigned int)(adv*100);
  20.   dispdata[0] = temp/100;
  21.   dispdata[1] = temp/10%10;
  22.   dispdata[2] = temp%10;
  23.   dispdata[3] = chn;
  24. }

  25. void  dispone(unsigned char LED,bit ifpoint,unsigned char number)   //,number 0--9
  26. {     
  27.         switch(LED)
  28.         {
  29.                 case 0:LED1 = 0;break;
  30.                 case 1:LED2 = 0;break;
  31.                 case 2:LED3 = 0;break;
  32.                 case 3:LED4 = 0;break;
  33.                 default: LED_slect = 0xff;
  34.         }
  35.         if(ifpoint) dp = 1;
  36.         else dp = 0;
  37.         LED_Data = num[number]|0x80;
  38.         delayus(200);
  39.         LED_slect = 0xff;         
  40. }

  41. void disp()
  42. {
  43.         unsigned char i;
  44.         bit point;
  45.         for(i = 0;i<4;i++)
  46.         {
  47.                 if(i == 1) point = 0;
  48.                 else point = 1;
  49.                 dispone(i,point,dispdata[i]);
  50.         }
  51. }
复制代码

作者: 罗爱军    时间: 2017-4-3 21:14
,51黑有你更精彩
作者: chunzz    时间: 2017-4-4 02:15
很好,学习了
作者: 老牛牛牛    时间: 2017-5-1 12:37
谢谢楼主 很有用
作者: xiaosongshumh    时间: 2017-10-11 11:20
厉害了
作者: 21asd3as13d2    时间: 2017-12-1 11:20
真不错
作者: wendu    时间: 2018-2-1 08:35
谢谢楼主,很有用
作者: Mr.curiosity    时间: 2018-5-6 16:31
能请教一下这个可不可以加个按键选择通道的功能吗,非常感谢~
作者: Ford    时间: 2018-5-20 15:48
强,受教了
作者: Ford    时间: 2018-5-20 15:54
帮忙看下这个吧,做出来了运行不了LED_0        EQU         30H
LED_1         EQU         31H
LED_2         EQU         32H                                   ;存放段码
ADC                EQU                35H
CLOCK        BIT                P2.4                        ;定义ADC0808时钟位
ST                 BIT         P2.5
EOC         BIT         P2.6
OE                 BIT         P2.7

                ORG         00H
                SJMP        START
                ORG                0BH
                LJMP        INT_T0

START:        MOV                LED_0,#00H
                MOV                LED_1,#00H
                MOV                LED_2,#00H
                MOV                DPTR,#TABLE                ;段码表首地址
                MOV                TMOD,#02H
                MOV                TH0,#245
                MOV                TL0,#00H
                MOV                IE,#82H
                SETB        TR0

WAIT:         CLR         ST                                 
                SETB         ST
                CLR         ST                                ;启动AD转换
                JNB         EOC,$                        ;等待转换结束
                SETB         OE
                MOV         ADC,P1                        ;读取AD转换结果
                CLR         OE               
                MOV         A,ADC
                MOV         B,#100                        ;AD转换结果转换成BCD码
                DIV         AB
                MOV         LED_2,A
                MOV         A,B
                MOV         B,#10
                DIV         AB
                MOV         LED_1,A
                MOV         LED_0,B
                LCALL        DISP
                SJMP         WAIT

INT_T0:        CPL                CLOCK                         ;提供ADC0808时钟信号
                RETI

DISP:        MOV                A,LED_0                        ;显示子程序
                MOVC        A,@A+DPTR
                CLR                P2.3
                MOV                P0,A
                LCALL        DELAY
                SETB        P2.3

                MOV                A,LED_1
                MOVC        A,@A+DPTR
                CLR                P2.2
                MOV                P0,A
                LCALL        DELAY
                SETB        P2.2

                MOV                A,LED_2
                MOVC        A,@A+DPTR
                CLR                P2.1
                MOV                P0,A
                LCALL        DELAY
                SETB        P2.1
                RET

DELAY:        MOV                R6,#10                        ;延时5毫秒
D1:                MOV                R7,#250
                DJNZ        R7,$
                DJNZ        R6,D1
                RET

TABLE:         DB                 3FH,06H,5BH,4FH,66H
                DB                 6DH,7DH,07H,7FH,6FH
                END

QQ截图20180520155135.png (107.22 KB, 下载次数: 56)

QQ截图20180520155135.png

作者: lcx187    时间: 2019-1-3 17:40
不错哟
作者: ZYD阿东    时间: 2019-3-10 10:57
数码管应该用HC573驱动
作者: lannk    时间: 2019-6-24 13:45
怎么下载?




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