数字电压表实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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