找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的ADC0809数字电压表Proteus仿真程序

[复制链接]
跳转到指定楼层
楼主
说明 按键按下去 进入单路电压采集模式(及电压表模式) 按键弹起来 就是8路电压轮流采集模式
基于51单片机的ADC0809 4路数字电压表下面是仿真图



以下代码已经测试过

单片机代码:
#include <reg52.h>             //头文件
#define uchar unsigned char           //宏定义无符号字符型
#define uint  unsigned  int           //宏定义无符号整型
code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟
sbit ST=P3^0;   //A/D启动转换信号
sbit OE=P3^1;   //数据输出允许信号
sbit EOC=P3^2;  //A/D转换结束信号
sbit CLK=P3^3;  //时钟脉冲  
sbit KEY=P2^7;
uint z,x,AD0809, date;        //定义数据类型
/******************************************************************
延时函数
******************************************************************/
void delay(uchar t)
{
  uchar i,j;
   for(i=0;i<t;i++)
   {
            for(j=13;j>0;j--);
         { ;
         }
   }
}
/**********************************************************************
                数码管动态扫描
*********************************************************************/
void xianshi() //显示函数
{
    uint z,x;
    z=date%100/10;                         //求千位
    x=date%10;                 //求百位
    P3&=0x0f;
          P0=seg7code[z]&0x7f;
          P3|=0X10;
          delay(80);

          P3&=0X0f;  
    P0=seg7code[x];
          P3|=0X20;
          //delay(80);
  }
unsigned char  GetVoltage(unsigned char  ch)
{
  float temp;
  unsigned char value=0;
  P2=0xf0;
  P2|=ch;
  delay(1);
  ST=0;                                //使采集信号为低
  delay(1);
  ST=1;                                //开始数据转换
  delay(1);
  ST=0;                                //停止数据转换
  delay(1);
  while(!EOC);                //等待数据转换完毕
  OE=1;                                //允许数据输出信号
  delay(1);
  AD0809=P1;                    //读取数据
  OE=0;                                //关闭数据输出允许信号
  temp=AD0809;
  temp=temp*19.531f;  //计算出电压值(19.531=5000mv除以AD的位数值256=5000/256)
  value=temp/100;//为了方便显示 进行缩小 转换成整形 比如实际电压1.5V 1500mv/100=15 15在的十位显示的时候作为电压的整数位 个位作为小数位
  return value;
}
void Timer0Init(void)                //20毫秒@12.000MHz
{
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xE0;                //设置定时初值
        TH0 = 0xB1;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
  ET0=1;
  EA=1;
}
/*************************************************************************
                                主函数        
**************************************************************************/
  unsigned char count=0;
void main()
{
  KEY=1;
  Timer0Init();
  while(1)                           //无限循环
  {
    if(KEY==0)
    {
      date=GetVoltage(0);                //数码管显示的数据值,其中20为采集数据的毫安值
    }
    else
    {
      date=GetVoltage(count);//采集第count路AD值

    }
    xianshi();                        //数码管显示函数
  }
}        
unsigned char delay1=0;
void timer0( ) interrupt 1 //定时器0 10ms定时
{

        TL0 = 0xE0;                //设置定时初值
        TH0 = 0xB1;                //设置定时初值
  delay1++;
  if(delay1>20)
  {//AD切换显示的定时时间到
    delay1=0;//中断计数清零
    count++;//路数变量自加
      if(count>7)//路数变量大于7
        count=0;//清零
  }
}

Keil代码与Proteus仿真下载: 仿真代码.7z (899.14 KB, 下载次数: 72)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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