数字电压表实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简易数字电压表设计报告

姓名:何绍金

班级:自动化1202

学号:201203870408

指导教师:贾立新

2014年11月26日

一.设计题目

采用C8051F360单片机最小系统设计一个简易数字电压表,实现对0~3.3V 直流电压的测量。

二.设计原理

模拟输入电压通过实验板PR3电位器产生,A/D转换器将模拟电压转换成数字量,并用十进制的形式在LCD上显示。用一根杜邦实验线将J8口的0~3.3V输出插针与J7口的P2.0插针相连。注意A/D转换器模拟输入电压的范围取决于其所选择的参考电压,如果A/D 转换器选择内部参考电压源,其模拟电压的范围

0~2.4V,如果选择外部电源作为参考电压,则其模拟输入电压范围为0~3.3V。

原理框图如图1所示。

图1 简易数字电压表实验原理框图

三.设计方案

1.设计流程图如图2所示。

图2 简易数字电压表设计A/D转换和计时流程图

2.实验板连接图如图3所示。

图3 简易数字电压表设计实验板接线图

3.设计步骤

(1)编写C8051F360和LCD 初始化程序。

(2)AD 转换方式选用逐次逼近型,A/D 转换完成后得到10位数据的高低字节分别存放在寄存器ADCOH 和ADC0L 中,此处选择右对齐,转换时针为2MH Z 。 (3)选择内部参考电压2.4V 为基准电压(在实际单片机调试中改为3.311V ),正端接P2.0,负端接地。

四、测试结果

在0V~3.3V 中取10组测试数据,每组间隔约为0.3V 左右,实验数据如表1所示:

显示电压(V ) 2.050 2.383 2.652 2.935 3.246 实际电压(v ) 2.061 2.391 2.660 2.943 3.253 相对误差(%)

0.421

0.334

0.301

0.272

0.215

表1 简易数字电压表设计实验数据

(注:其中显示电压指LCD 显示值,实际电压指高精度电压表测量值)

五.设计结论

1.LCD 显示模块的CPLD 部分由FPGA 充当,芯片本身自带程序,所以这个部分不用再通过quartus 软件进行编程。

2.在参考电压选择过程中发现,单片机实际最大电压并不是2.4V 而是

3.3V ,则在转换中将3.3V 替换2.4V 即可。

3.开始时发现调节电阻之后,实际电压值改变但LCD 显示电压值并没有发生改变,原因是:EC6仿真器没有开启并且每次KEIL 重新开启后,要重新输入相应解码。

显示电压(V ) 0.206 0.504 0.805 1.054 1.406 实际电压(v ) 0.210 0.510 0.812 1.061 1.414 相对误差(%) 1.905 1.176 0.862 0.659 0.565

附录:程序源代码(C语言)

/*简易数字电压表*/

#include

#define uchar unsigned char

#define uint unsigned int

#define WCOMADDR 0xC008 //写命令寄存器的地址

#define WDA TADDR 0xC009 //写数据寄存器的地址

#define RCOMADDR 0xC00A //读命令寄存器的地址

#define RDA TADDR 0xC00B //读数据寄存器的地址

#define KEYCS 0xC00C

uchar code hanzi[] = "简易数字电压表";

uchar code keynum[]="键值";

uchar code keyc[]="次数";

uint time=0;

float volt;

uint v[4];

uint A T,voltage;

uchar keyn,keycode;

void OscInit(); //内部振荡器初始化

void PortIoInit(); //I/O端口初始化

void XramInit(); //外部数据存储器接口初始化

void PcaInit(); //PCA初始化(设置看门狗定时器的工作状态)void InitDevice(); //内部资源初始化

void CheckLcd(); //检查LCD是否空闲子程序

void WriteCom(uchar n); //Lcd写指令子程序

void WriteData(uchar m); //Lcd写数据子程序

void InsitiLcd(); //Lcd初始化子程序

void DispHan( uchar code *a,uchar m,uchar k);//显示汉字子程序

void TimerInit(); //定时器初始化

void InterruptsInit(); //中断系统初始化

void ADC_init(); //ADC0初始化详见书本P144 void Int0Init(); //外部中断初始化

void main()

{

uchar i;

InitDevice(); //F360初始化

InsitiLcd(); //LCD模块初始化

ADC_init();

DispHan(hanzi,0x90,0x0e); //显示“键盘显示测试程序”

AD0BUSY=1;

while(1)

{

if(TF0==1){

TF0=0;

TL0=0xf0;

TH0=0xd8; //重置时间常数10ms

time++;

}

if(time >=49)

{

time = 0;

A T=ADC0H*256+ADC0L;

volt=A T*0.003234;

voltage=volt*1000;

for(i=0;i<4;i++)

{

v[i]=voltage%10;

voltage=voltage/10;

}

WriteCom(0x8d);

WriteData(v[3]+0x30);

WriteData(0x2e);

WriteData(v[2]+0x30);

WriteData(v[1]+0x30);

WriteData(v[0]+0x30);

TR0=1;

AD0BUSY=1;

}

}

}

void ReadKey() interrupt 0

{

uchar xdata *addr;

uchar c1,c2;

addr=KEYCS;

keycode=*addr;

keycode&=0x0F;

keyn++;

DispHan(keynum,0x88,0x04);

WriteCom(0x8b);

if(keycode<10)

{

WriteData(0x30);

WriteData(keycode+0x30);

}

else

相关文档
最新文档