找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3533|回复: 0
打印 上一主题 下一主题
收起左侧

单片机ADC0809中断模式循环采集电压源程序+Proteus仿真

[复制链接]
跳转到指定楼层
楼主
51单片机和ADC0809循环采集电压,实时刷新,proteus仿真


单片机源程序如下:
  1. /********************   
  2. * 程序说明:设计一个中断模式的ADC0809 通道循环采样
  3. * 摘要: ADC0809数据手册
  4. **********************************/       
  5. #include <reg51.h>   //头文件
  6. #include <intrins.h>
  7. #define uchar unsigned char
  8. #define uint  unsigned int
  9. uchar code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  10. uchar code Tab1[]={0xbf,0x086,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
  11. uchar code Seg_WEI[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  12. uchar dat[]={0,0,0,0};               
  13. uchar  adc;       
  14. uint  V=0;
  15. char IN=0;
  16. uchar num;
  17. long int time;

  18. /*****************P2特殊寄存器*******************/
  19. sbit ADDA=P2^1;
  20. sbit ADDB=P2^2;
  21. sbit ADDC=P2^3;
  22. sbit ST=P2^4;                 //定义ADC0809位
  23. sbit EOC=P2^5;
  24. sbit OE=P2^6;
  25. sbit CLK =P2^7;
  26. /************        数码管位码****************/
  27. /***********P3特殊寄存器*****************/        
  28. sbit WEI=P3^6;
  29. sbit DUAN=P3^7;

  30. void nop(uchar xus);
  31. void display();
  32. void add(uchar c,uchar b,uchar a);
  33. void init();
  34. void gather();
  35. /******************************
  36. * 函数名称: 主函数
  37. * 函数功能: 程序主体
  38. ***************************************/
  39. void main()
  40. {
  41.         init();
  42.         gather();
  43. }


  44. /******************************
  45. * 函数名称: 数码管显示电压
  46. * 函数功能: 显示电压
  47. ***************************************/
  48. void display()
  49. {
  50.         dat[0]=V/1000;
  51.         dat[1]=V%1000/100;
  52.         dat[2]=V%1000%100/10;
  53.         dat[3]=V%10;


  54.         P0=Seg_WEI[0];                         //P0特殊寄存器
  55.         WEI=1;
  56.         WEI=0;
  57.         P0=0Xff;
  58.         P0=Tab[IN];
  59.         DUAN=1;
  60.         DUAN=0;
  61.         nop(30);

  62.         P0=Seg_WEI[1];
  63.         WEI=1;
  64.         WEI=0;
  65.         P0=0XFF;
  66.         P0=0x40;
  67.         DUAN=1;
  68.         DUAN=0;
  69.         nop(30);

  70.         P0=Seg_WEI[2];
  71.         WEI=1;
  72.         WEI=0;
  73.         P0=0XFF;
  74.         P0=Tab1[dat[0]];
  75.         DUAN=1;
  76.         DUAN=0;
  77.         nop(30);

  78.         P0=Seg_WEI[3];
  79.         WEI=1;
  80.         WEI=0;
  81.         P0=0XFF;
  82.         P0=Tab[dat[1]];
  83.         DUAN=1;
  84.         DUAN=0;
  85.         nop(30);


  86.         P0=Seg_WEI[4];
  87.         WEI=1;
  88.         WEI=0;
  89.         P0=0XFF;
  90.         P0=Tab[dat[2]];
  91.         DUAN=1;
  92.         DUAN=0;
  93.         nop(30);

  94.         P0=Seg_WEI[5];
  95.         WEI=1;
  96.         WEI=0;
  97.         P0=0XFF;
  98.         P0=Tab[dat[3]];
  99.         DUAN=1;
  100.         DUAN=0;
  101.         nop(30);


  102. }

  103. /******************************
  104. * 函数名称: 延时函数
  105. * 函数功能:  延时
  106. ***************************************/  
  107. void nop(uchar xus)
  108. {
  109.         uint i;
  110.         for(i=0;i<xus;i++)
  111.         {
  112.                 _nop_();
  113.         }
  114. }
  115. /******************************
  116. * 函数名称: 通道选择函数
  117. * 函数功能: 确定ADC的通道
  118. ***************************************/               
  119. void add(uchar c,uchar b,uchar a)
  120. {
  121.         ADDA=a;
  122.         ADDB=b;
  123.         ADDC=c;
  124. }
  125. /******************************
  126. * 函数名称: 初始化
  127. * 函数功能: 中断初始化
  128. ***************************************/
  129. void init()
  130. {
  131.         TMOD=0x01;                                //设置定时器0为工作方式1
  132.         TH0=(65536-2)/256;          //200us定时,装入初值
  133.         TL0=(65536-2)%256;                               
  134.         EA=1;                                        //开总中断
  135.         ET0=1;                                   //开定时器0中断
  136.         TR0=1;                                         //启动定时器0
  137. }
  138. /******************************
  139. * 函数名称: 定时器
  140. * 函数功能: 定时器0工作
  141. ***************************************/
  142. void T0_time() interrupt 1
  143. {
  144.         TH0=(65536-2)/256;          //重装初值
  145.         TL0=(65536-2)%256;
  146.         CLK=~CLK;
  147. }
  148. /******************************
  149. * 函数名称: 采集电压
  150. * 函数功能: 采集电压
  151. ***************************************/
  152. void gather()
  153. {
  154.         uchar i;
  155.           while(1)
  156.           {
  157.                   for(i=0;i<8;i++)
  158.                 {
  159.                         if(i==0)
  160.                         {
  161.                                         IN=0;
  162.                                         add(0,0,0);
  163.                                         ST=0;
  164.                                 OE=0;
  165.                                 ST=1;
  166.                                 ST=0;
  167.                                        while(EOC==0);
  168.                                 OE=1;
  169.                                         adc=P1;
  170.                                         V=adc*20;
  171.                                         for(time=20;time>0;time--)
  172.                                         {       
  173.                                                 display();
  174.                                         }       
  175.                         }
  176.                          else if(i==1)
  177.                         {
  178.                                         IN=1;
  179.                                         add(0,0,1);
  180.                                         ST=0;
  181.                                 OE=0;
  182.                                 ST=1;
  183.                                 ST=0;
  184.                                        while(EOC==0);
  185.                                 OE=1;
  186.                                         adc=P1;
  187.                                         V=adc*20;
  188.                                         for(time=20;time>0;time--)
  189.                                         {       
  190.                                                 display();
  191.                                         }       
  192.                         }
  193.                         else if(i==2)
  194.                         {
  195.                                         IN=2;
  196.                                         add(0,1,0);
  197.                                         ST=0;
  198.                                 OE=0;
  199.                                 ST=1;
  200.                                 ST=0;
  201.                                        while(EOC==0);
  202.                                 OE=1;
  203.                                         adc=P1;
  204.                                         V=adc*20;
  205.                                         for(time=20;time>0;time--)
  206.                                         {       
  207.                                                 display();
  208.                                         }       
  209.                         }
  210.                         else if(i==3)
  211.                         {
  212.                                         IN=3;
  213.                                         add(0,1,1);
  214.                                         ST=0;
  215.                                 OE=0;
  216.                                 ST=1;
  217.                                 ST=0;
  218.                                        while(EOC==0);
  219.                                 OE=1;
  220.                                         adc=P1;
  221.                                         V=adc*20;
  222.                                         for(time=20;time>0;time--)
  223.                                         {       
  224.                                                 display();
  225.                                         }
  226.                         }
  227.                         else if(i==4)
  228.                         {
  229.                                         IN=4;
  230.                                         add(1,0,0);
  231.                                         ST=0;
  232.                                 OE=0;
  233.                                 ST=1;
  234.                                 ST=0;
  235.                                        while(EOC==0);
  236.                                 OE=1;
  237.                                         adc=P1;
  238.                                         V=adc*20;
  239.                                         for(time=20;time>0;time--)
  240.                                         {       
  241.                                                 display();
  242.                                         }
  243.                         }
  244.                         else if(i==5)
  245.                         {
  246.                                         IN=5;
  247.                                         add(1,0,1);
  248.                                         ST=0;
  249.                                 OE=0;
  250.                                 ST=1;
  251.                                 ST=0;
  252.                                        while(EOC==0);
  253.                                 OE=1;
  254.                                         adc=P1;
  255.                                         V=adc*20;
  256.                                         for(time=20;time>0;time--)
  257.                                         {       
  258.                                                 display();
  259.                                         }       
  260.                         }
  261.                         else if(i==6)
  262.                         {
  263.                                         IN=6;
  264.                                         add(1,1,0);
  265.                                         ST=0;
  266.                                 OE=0;
  267.                                 ST=1;
  268.                                 ST=0;
  269.                                        while(EOC==0);
  270.                                 OE=1;
  271.                                         adc=P1;
  272.                                         V=adc*20;
  273.                                         for(time=20;time>0;time--)
  274.                                         {       
  275.                                                 display();
  276.                                         }
  277.                         }
  278.                         else if(i==7)
  279.                         {
  280.                                         IN=7;
  281.                                         add(1,1,1);
  282.                                         ST=0;
  283.                                         OE=0;
  284.                                         ST=1;
  285.                                         ST=0;
  286.                                         while(EOC==0);
  287.                                         OE=1;
  288.                                         adc=P1;
  289.                                         V=adc*20;
  290.                                         for(time=20;time>0;time--)
  291.                                         {       
  292.                                                 display();
  293.                                         }
  294.                         }
  295.                
  296.                 }
  297.   }
  298. }
复制代码

所有资料51hei提供下载:
ADC0809.zip (111.51 KB, 下载次数: 77)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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