找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4828|回复: 1
收起左侧

单片机ADC0808循环采样设计,含原理图,源代码,流程图,proteus仿真

[复制链接]
ID:727357 发表于 2020-4-12 10:28 | 显示全部楼层 |阅读模式
            1.jpg   

程序流程图


       最下面四个是采样电阻,调节电阻值改变采样电压大小,然后8个通道依次采四个电阻值输出的电压的大小,在数码管上动态显示通道号和所对应采回的电压值大小。ADC0808转换完成是使用外部中断下降沿的方式通知单片机进行数据读取,最大程度上保证了电压数据的精确,程序中可以更改ADC循环 采样的时间。示波器是为了观察转换是否完成的波形来确保ADC0808能否正常工作。
2.jpg 3.jpg

Proteus仿真图



单片机源程序如下:
  1. /* Main.c file generated by New Project wizard
  2. *
  3. * Created:   周四 2月 27 2020
  4. * Processor: AT89C51
  5. * Compiler:  Keil for 8051
  6. */

  7. #include <reg51.h>
  8. #include <stdio.h>
  9. #define u8 unsigned char
  10. sfr AUXR =0x8E;
  11. u8 code t_display[]={                       //标准字库
  12. //   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  13.     0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  14. //  black  -   H    J    K    L    N    o   P    U     t    G    Q    r   M    y
  15.     0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  16.     0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};   
  17. //    0.   1.   2.   3.  4.   5.   6.    7.   8.   9.  -1
  18. unsigned xianshi[6];
  19. u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码
  20. /*******************************************************/
  21. sbit start=P3^1;
  22. sbit CLK=P3^0;
  23. sbit addA=P3^4;
  24. sbit addB=P3^5;
  25. sbit addC=P3^3;
  26. sbit OE=P3^7;                                    
  27. bit disflag;
  28. bit adcflag;
  29. bit okflag;
  30. u8  adcnum,adc_value;
  31. unsigned int a;
  32. void Timer0Init(void)                        //定时器初始化0.1毫秒@11.0592MHz
  33. {
  34.   TMOD &=0xf0;
  35.   TMOD |=0X01;
  36.   //TH0=(65536-92)/256;
  37.   //TL0=(65536-92)%256;
  38.    
  39.   TL0 = 0xA4;                               //设置定时初值
  40.   TH0 = 0xFF;

  41.   ET0=1;                                        //开启定时器0中断
  42.   TR0=1;                                        //定时器T0启动

  43. }

  44. void timer0() interrupt 1 using 1              //定时器中断函数配置
  45. {
  46.     static int  dis_count=0,adc_count=0;
  47.       TL0 = 0xA4;                       //设置定时初值
  48.       TH0 = 0xFF;
  49.       //CLK=~CLK;                        
  50.       dis_count++;
  51.       adc_count++;
  52.       if(dis_count==10)
  53.     {
  54.         dis_count=0;
  55.         disflag=1;
  56.     };
  57.        if(adc_count==10000)
  58.     {
  59.         adc_count=0;
  60.         adcflag=1;
  61.     };
  62.         
  63. }

  64. void Exit0Init(void)                            //外部中断初始化
  65. {
  66.     IE=0;                                       //开启外部中断请求
  67.     IT0=1;                                      //外部中断设置为下降沿触发
  68.     EX0=1;                                      //外部中断请求开启
  69. }
  70. void exit0() interrupt 0                        //外部中断0中断函数配置
  71. {
  72.    okflag=1;                                    //转换完成
  73. }

  74. void display()                                  //数码管扫描显示函数
  75. {   
  76.       static int i=0;
  77.           disflag=0;
  78.           P2=0XFF;            //消影     
  79.           P1=xianshi[i];      //送位选
  80.           P2=~T_COM[i];       //送段选
  81.           i++;
  82.           if(i==6) i=0;
  83. }
  84. void start_adc()                                //adc启动函数
  85. {   
  86.      start=0;
  87.      adcflag=0;
  88.    
  89.      addC=adcnum/4;
  90.      addB=adcnum%4/2;
  91.      addA=adcnum%2;  
  92.    
  93.      
  94.      start=1;
  95.      
  96.      if(adcnum==8)  adcnum=0;
  97.      adcnum++;
  98.      start=0;
  99. }
  100. void read_adc()                                 //adc读取函数
  101. {   
  102.      okflag=0;
  103.    
  104.      OE=1;
  105.      adc_value=P0;
  106.      
  107.      
  108.      a=adc_value*20;//255表示5000mv ,1表示20mv,共5100mv
  109.      OE=0;
  110.      xianshi[0]=t_display[a%10];
  111.      xianshi[1]=t_display[a%100/10];
  112.      xianshi[2]=t_display[a%1000/100];
  113.      xianshi[3]=t_display[a/1000+32];
  114.      xianshi[4]=0x40;
  115.      xianshi[5]=t_display[adcnum-1];
  116.    
  117. }
  118. void main(void)
  119. {
  120.   
  121.    // Write your code here        
  122.     Exit0Init();
  123.     Timer0Init();
  124.     EA=1;                                         //开启全局中断
  125.    while (1)
  126.    {  
  127.       
  128.       if(disflag==1)  display();
  129.       if(adcflag==1) start_adc();
  130.       if(okflag==1)   read_adc();
  131.     }
  132.       ;
  133. }
复制代码
全部资料51hei下载地址:
ADC0808循环采样.zip (1.28 MB, 下载次数: 77)

评分

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

查看全部评分

回复

使用道具 举报

ID:648262 发表于 2020-6-5 22:10 | 显示全部楼层
很好!学习学习!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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