电子技术
当前位置 :首页光电技术电子技术

Proteus仿真数字电压表

来源: 作者: 时间:2010-04-24 点击:

   本来是要设计一个数字示波器的,可是现在看来,还是有很大的困能的。也只有一步一步地来了,于是先学模数转换,从ADC0808最简单的开始。就在能够正确使用ADC0808D的时候,发现作为一个数字电压表的准备知识已经足够了,于是顺手把这个电压表弄了出来,也算是一个收获吧。下面还得想想怎么把直流电压表改为交流的,这样也可以为示波器的进一步研究做准备。希望自己能够成功了。呵呵。

   仿真电路:
 


   

    程序写了一下,然而从网上看到了个比我写的要好的多的一个程序,稍做修改,如下:

#include<AT89X51.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define SEG P1//声明数码管接P1口
uchar TAB[]={ 0x3f,0x06,0x5b,0x4f,0x66,//共阴字形码
  0x6d,0x7d,0x07,0x7f,0x6f};
uchar disp[4];//显示器数组
uint temp,result;
void display(void);//声明显示函数
void delay1ms(uchar);//声明延时函数
void init(void);//初始化函数
sbit CLK=P3^4;//时钟接口
sbit EOC=P3^2;
sbit ST=P3^6;
sbit OE=P3^7;
//=====主函数=================
main()
{ init();
ST=0;
while(1)
{ ST=1;//启动
  ST=0;
  while(EOC==0);//查询等待转换结果
  OE=1;//打开输出允许信号
  temp=P0;//读数据
  result=temp*1.0/255*500;
  disp[0]=result/1000;
  disp[1]=result/100%10;
  disp[2]=result/10%10;
  disp[3]=result%10;
  display();
}
}
//======显示函数=============
void display(void)
{ uchar i,scan;
  scan=1;
  for(i=0;i<4;i++)
  { P2=~scan;
  SEG=TAB[disp[i]];
  if(i==1)
  SEG=SEG|0x80;//显示小数点
  delay1ms(4);
  scan<<=1;
  }
}
//=====延时1MS函数=========
void delay1ms(uchar x)
{ uchar i,j;
  for(i=0;i<x;i++)
  for(j=0;j<120;j++);
}
//=====T0初始化函数============
void init(void)
{ EA=1;
  ET0=1;
  TMOD=0x01;
  TH0=(65536-200)/256;
  TL0=(65536-200)%256;
  TR0=1;
}
//=======T0中断服务,提供时钟信号======
void timer0(void) interrupt 1
{ TH0=(65536-200)/256;
  TL0=(65536-200)%256;
  CLK=~CLK;
}


 

上一篇: 已经是第一篇
下一篇:
最新评论共有 位网友发表了评论
发表评论
用户名: 密码: 游客发言不需要密码