找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机ADC0809+CD4017分频数字电压表程序+PCB工程+Proteus仿真

[复制链接]
跳转到指定楼层
楼主
自己用了大半个月时间所做的数字电压表;
1、采用数码管显示
2、可测电压0V-25V;25V-50V、两档位超出量程可报警。显示精度0.01V,与精确率0.2V.
3、采用ADC0809数码转换芯片
4、采用CD4017进行分频
(附件带keil源程序、AD原理图、装配图、proter仿真图)整整一套完整的材料都在附件中
................................................................................................................................................................................................................................
都是自己设计原创,请大家多多指教!
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. //程序头函数
  2. #include <reg52.h>

  3. //宏定义
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define Data_ADC0809 P1

  7. //ADC0809
  8. sbit ST=P3^2;
  9. sbit EOC=P3^3;
  10. sbit OE=P3^1;
  11. sbit k1=P3^5;
  12. sbit k2=P3^4;
  13. sbit DIAN = P0^7;                        //小数点
  14. sbit beep = P3^0;   //蜂鸣器IO口定义

  15. /*******************************定义全局变量********************************/
  16. unsigned char dis[3];       //显示数值
  17. unsigned int sum=0;
  18. unsigned int temp=0;
  19. unsigned int dat=0;
  20.         unsigned int Vo;
  21.         uint a;
  22. /*******************************共阴LED段码表*******************************/

  23. unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90/*字母U*/};        //gc.debfa

  24. /****************************************************************************
  25. /****************报警函数***************/
  26. //ADC0809读取信息
  27. uchar ADC0809()
  28. {
  29.         uchar temp_=0x00;
  30.         //初始化高阻太
  31.         OE=0;
  32.         //转化初始化
  33.         ST=0;
  34.         //开始转换
  35.         ST=1;
  36.         ST=0;
  37.         //外部中断等待AD转换结束
  38.         while(EOC==0)
  39.         //读取转换的AD值
  40.         OE=1;
  41.         temp_=Data_ADC0809;
  42.         
  43.         OE=0;
  44.         return temp_;
  45. }
  46. /****************************************************************************
  47. 函数功能:延时子程序
  48. 入口参数:
  49. 出口参数:
  50. ****************************************************************************/
  51. void delay(unsigned int x)
  52. {
  53.     unsigned int i,j;
  54.     for(i=0;i<x;i++)
  55.         for(j=0;j<50;j++);
  56. }
  57. //=====================================================================================
  58. //=====================================================================================
  59. //=====================================================================================

  60. /****************************************************************************
  61. 函数功能:将0-255级换算成0.00-5.00的电压数值
  62. 入口参数:i
  63. 出口参数:
  64. ****************************************************************************/

  65. void convdata(unsigned char dat1)
  66. {
  67.     if(k1==0)
  68.     {
  69.      delay(10);
  70.          if(k1==0)
  71.          {
  72.           a=1;
  73.         // while(!k1);
  74.          }
  75.         }
  76.         if(k2==0)
  77.     {
  78.      delay(10);
  79.          if(k2==0)
  80.          {
  81.           a=2;
  82.           //          while(!k2);
  83.          }
  84.         }
  85.         Vo=dat1*5*1.96*a;        
  86.         dis[0]=Vo/1000;
  87.     dis[1] = Vo/100%10;       //十位
  88.     dis[2] = Vo%100/10;      //个位         
  89.     dis[3] = Vo%100%10;     //小数点后第1位
  90.         if(a==1)
  91.         {
  92.          if(dis[0]>=2)
  93.          {
  94.           if(dis[1]>=4)
  95.           {
  96.            beep=1;
  97.           }
  98.          }
  99.         }
  100.         if(a==2)
  101.         {
  102.          if(dis[0]>=4)
  103.          {
  104.           if(dis[1]>=9)
  105.           {
  106.            beep=1;
  107.           }
  108.          }
  109.         }
  110.     if(dis[0]==0)
  111.          {
  112.           if(dis[1]==0)
  113.           {
  114.            beep=0;
  115.           }
  116.          }

  117. }
  118. /****************************************************************************
  119. 函数功能:数码管显示子程序
  120. 入口参数:
  121. 出口参数:
  122. ****************************************************************************/
  123. void display(void)
  124. {  
  125.     P0=tab[dis[0]];      
  126.     P2=0xbf;                  //10111112
  127.     delay(1);   
  128.     P2=0xff;

  129.     P0=tab[dis[1]];      
  130.     P2=0xef;                //11101111
  131.         DIAN=0;
  132.     delay(1);
  133.     P2=0xff;

  134.     P0=tab[dis[2]];      
  135.     P2=0xfb;              //11111011  
  136.     delay(1);
  137.     P2=0xff;

  138.         P0=tab[dis[3]];        //11111110  
  139.     P2=0xfe;              
  140.     delay(1);
  141.     P2=0xff;
  142. }
  143. /****************************************************************************
  144. 函数功能:主程序
  145. 入口参数:
  146. 出口参数:
  147. ****************************************************************************/
  148. void main(void)
  149. {
  150.         unsigned char p=0;
  151.         a=1;
  152.         beep=0;
  153.     while(1)       //主循环                  
  154.     {
  155.                 for(p=0;p<20;p++)
  156.                 {        
  157.                         sum=sum+ADC0809();
  158.                         display();
  159.                 }
  160. //                dat=((sum/20)+dat)/2;
  161.                 dat=sum/20;
  162.                 convdata(dat);      //数据转换
  163.                 sum=0;
  164.                 display();      //显示数值
  165.     }
  166. }
复制代码

所有资料51hei提供下载:
“直流数显电压表”程序、原理图、仿真图.7z (603.08 KB, 下载次数: 115)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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