找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机Proteus仿真ADC0809数字电压表程序设计

[复制链接]
跳转到指定楼层
楼主
源码加电路图


单片机源程序如下:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0-9的电平码
  5. uint volt,vtime; //电压值测定值
  6. uchar addr;//测量地址位
  7. sbit LW1=P2^3; //对应第4个数码管
  8. sbit LW2=P2^2; //对应第3个数码管
  9. sbit LW3=P2^1; //对应第2个数码管
  10. sbit LW4=P2^0; //对应第1个数码管
  11. sbit LW5=P1^4;//指示当前显示的是第几个转换值
  12. sbit CLK=P2^4; //时钟信号
  13. sbit START=P2^5; //转换启动开关
  14. sbit EOC=P2^6;        //转换结束标志
  15. sbit OE=P2^7;//定义ADC0809各脚
  16. /**********************************************************/
  17. //函数名:delay(uint x)
  18. //功能:延时程序 改变测量地址         
  19. //调用函数:
  20. //输入参数:x
  21. //输出参数:
  22. //说明:程序的延时时间为x乘以0.5ms 每5s改变测量地址位
  23. /**********************************************************/
  24. void delay(uint x)
  25. {
  26.         uchar y,z;
  27.         for(y=x;y>0;y--)
  28.                 for(z=250;z>0;z--);//该步运行时间约为0.5ms
  29.                 vtime++;
  30.                 if(vtime==1000)
  31.                 {
  32.                         vtime=0;
  33.                         addr++;
  34.                         if(addr==3)         //本例子一共有3个测量输入值,轮流读取这3个值并转换显示
  35.                                 addr=0;//以上语句实现测量地址位的改变               
  36.                 }        
  37. }
  38. /**********************************************************/
  39. //函数名:ADC()
  40. //功能:数模转换程序
  41. //调用函数:
  42. //输入参数:
  43. //输出参数:
  44. //说明:将转换好的测定值保存在变量volt中
  45. /**********************************************************/
  46. void ADC()
  47. {
  48.         EA=1;//开中断

  49.         //确保进入正常AD转换状态?
  50.         START=0;
  51.         START=1;

  52.         START=0;//ad开始转换               
  53.         while(EOC==0); //等待转换结束
  54.         OE=1; //输出数据标志为真
  55.         
  56.         EA=0;//关中断
  57.         volt=P3;//获取转换值保存到volt中,(P3为转换后数据)
  58.         volt=volt*196;//转换值处理 (例子的满量程为5V,转换分辩率为8位即最大值是255,5/255=196mV,即1代表196mV)
  59.         
  60.         OE=0;//输出转换结束 (要在获取转换值之后)
  61. }
  62. /**********************************************************/
  63. //函数名:display()
  64. //功能:4位数码管显示
  65. //调用函数:delay(uint x)
  66. //输入参数:
  67. //输出参数:
  68. //说明:将处理后的电压值显示在4位数码管上
  69. /**********************************************************/
  70. void display()
  71. {
  72.         P0=0xff;//消隐 (相当于全部灭灯,清除上次显示效果)
  73.         LW1=0;
  74.         P0=~led[volt/10000]&0x7f;//带小数点1伏显示位
  75.         delay(2);
  76.         P0=0xff;
  77.         LW1=1;
  78.         LW2=0;
  79.         P0=~led[(volt/1000)%10];//100毫伏显示位
  80.         delay(2);
  81.         P0=0xff;
  82.         LW2=1;
  83.         LW3=0;
  84.         P0=~led[(volt/100)%10];//10毫伏显示位
  85.         delay(2);
  86.         P0=0xff;
  87.         LW3=1;
  88.         LW4=0;
  89.         P0=~led[(volt/10)%10];//1毫伏显示位
  90.         delay(2);
  91.         P0=0xff;
  92.         LW4=1;
  93.         LW5=0;
  94.         P0=~led[addr+1];//显示电压测量位
  95.         delay(2);
  96.         LW5=1;//指示当前显示的是第几个转换值                                                               
  97. }
  98. /**********************************************************/
  99. //主程序
  100. /**********************************************************/
  101. void main()
  102. {
  103.         EA=1;//开总中断                  
  104.     TMOD=0x01;//设定定时计数工作方式
  105.         //为定时器初赋值
  106.         TH0=0XFF;
  107.     TL0=0XB4;

  108.         ET0=1;//开定时器0中断
  109.         TR0=1;//开启定时器0
  110.         while(1)
  111.         {
  112.                 P1=addr;//装入测量地址
  113.                 LW5=1;
  114.                 ADC();//调用模数转换程序
  115.                 display();//调用显示程序
  116.         }
  117. }
  118. /**********************************************************/
  119. //函数名:timer() interrupt 1
  120. //功能:定时中断0响应程序
  121. //调用函数:
  122. //输入参数:
  123. //输出参数:
  124. //说明:为ADC提供时钟信号
  125. /**********************************************************/
  126. void timer() interrupt 1
  127. {
  128.         //初值重置
  129.         TH0=0XFF;
  130.     TL0=0XF0;
  131.         CLK=~CLK;//取反 产生时钟信号
  132. }
复制代码

仿真代码51hei提供下载:
数字电压表(ADC0809)-2.rar (47.83 KB, 下载次数: 70)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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