单片机 直流数字电压表设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七直流数字电压表设计
【实验目的】
掌握LED动态显示和A/D转换接口设计方法。
【实验原理】
实验电路原理图如下图所示。图中显示器采用4位共阴极数码管,并按动态显示方式接线。A/D转换结束标志采用查询法检查,启动信号由软件模拟产生,时钟信号由Proteus的DClock信号发生器产生,频率为5KHz。电位器的输出电压送到A/D转换器中转换,转换结果以十进制数形式显示在数码管上。调节电位器可使数码管的显示值发生相应变化。
【实验内容】
(1)学习使用Proteus软件,掌握原理图绘图方法;
(2)学习使用Keil C软件,掌握C51程序编写与调试方法;
(3)理解动态显示与A/D转换工作原理,完成单片机电压采集与显示程序的编写与调试。
【实验步骤】
(1)在Proteus中绘制电路原理图,按照下表将元件添加到编辑环境中。
(2)在Keil中编写C51程序,并使之编译通过。
(3)在Proteus中加载程序,观察仿真结果。
【实验要求】
提交的实验报告中应包括电路原理图,含注释内容的源程序及实验结
果分析。
【实验原理图】
【运行结果】
【实验程序及注释】
#include
sbit _st = P2^5; //定义AD启动位,_st
sbit _eoc = P2^6; //定义AD结束位,_eoc
sbit _oe = P2^7; //定义AD使能位,_oe
sbit led0 = P2^3; //定义数码管最低位,led0
sbit led1 = P2^2; //定义数码管第二位,led1
sbit led2 = P2^1; //定义数码管第三位,led2
unsigned char ad_result=0; //定义AD转换结果变量,ad_result unsigned char table[] = {0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义十进制显示字模数组,table[]
void delay(unsigned int time) //延时函数
{
unsigned int j = 0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
void disp(void) //显示函数
{ led3=0; //第四位位码清0 P0=table[ad_result/1000]; //输出第三位的字模delay(10); //延时10ms
led3=1; //第三位位码置1
//动态显示函数
led2=0; //第三位位码清0
P0=table[ad_result/100]; //输出第三位的字模
delay(10); //延时10ms
led2=1; //第三位位码置1
led1=0; //第二位位码清0
P0=table[(ad_result/10)%10]; //输出第二位的字模delay(10); //延时10ms
led1=1; //第二位位码置1
led0=0; //最低位位码清0
P0=table[ad_result%10]; //输出最低位的字模delay(10); //延时10ms
led0=1; //最低位位码置1
}
void main(void)
{ while(1)
{
_st=0;_st=1;_st=0; //模拟启动时序,发出启动AD转换脉冲
while(!_eoc); //查询EOC标志,若EOC=0,原地等待
_oe=1; //若EOC=1,使能OE置1
ad_result=P1; //读取AD转换结果
_oe=0; //使能OE置0
disp(); //动态显示函数调用
}
}
【注】
本人辛苦编译加注过,请用修改后再纳为己有。
程序中少了一条很简单的语句,为本人故意所留。稍懂单片机者均可改正。
祝你实验成功