实验三 简易数字电压表设计.docx

上传人:b****2 文档编号:11773931 上传时间:2023-06-02 格式:DOCX 页数:15 大小:84.87KB
下载 相关 举报
实验三 简易数字电压表设计.docx_第1页
第1页 / 共15页
实验三 简易数字电压表设计.docx_第2页
第2页 / 共15页
实验三 简易数字电压表设计.docx_第3页
第3页 / 共15页
实验三 简易数字电压表设计.docx_第4页
第4页 / 共15页
实验三 简易数字电压表设计.docx_第5页
第5页 / 共15页
实验三 简易数字电压表设计.docx_第6页
第6页 / 共15页
实验三 简易数字电压表设计.docx_第7页
第7页 / 共15页
实验三 简易数字电压表设计.docx_第8页
第8页 / 共15页
实验三 简易数字电压表设计.docx_第9页
第9页 / 共15页
实验三 简易数字电压表设计.docx_第10页
第10页 / 共15页
实验三 简易数字电压表设计.docx_第11页
第11页 / 共15页
实验三 简易数字电压表设计.docx_第12页
第12页 / 共15页
实验三 简易数字电压表设计.docx_第13页
第13页 / 共15页
实验三 简易数字电压表设计.docx_第14页
第14页 / 共15页
实验三 简易数字电压表设计.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验三 简易数字电压表设计.docx

《实验三 简易数字电压表设计.docx》由会员分享,可在线阅读,更多相关《实验三 简易数字电压表设计.docx(15页珍藏版)》请在冰点文库上搜索。

实验三 简易数字电压表设计.docx

实验三简易数字电压表设计

电子系统实验报告

 

实验三简易数字电压表设计

 

姓名张巧玲

指导教师贾立新

课程电子系统设计与实践

专业班级自动化1004班

学院信息工程学院

一、设计题目

采用C8051F360单片机最小系统设计一简易数字电压表,实现对0~2.4V直流电压的测量,原理框图如图1所示。

模拟输入电压通过一只1kΩ电位器产生,采用C8051F360单片机内部的A/D转换器将模拟电压转换成数字量后换算成电压值,用十进制的形式在LCD上显示。

A/D转换的输入模拟信号由实验板PR3电位器产生的0~3.3V的直流电压

信号,用一根杜邦实验线将J8的0~3.3V输出插针与J7口的P2.0插针相连。

注意A/D转换器模拟输入电压的范围取决于其所选择的参考电压,如果A/D转换器选择内部参考电压源,其模拟电压的范围为0~2.4V,如果选择外部电源作为参考电压,则其模拟输入电压范围为0~3.3V。

测试时,A/D转换器的模拟输入信号可通过一个电位器产生。

图1简易数字电压表实验示意框图

二.设计方案

(1)简易数字电压表设计程序流程图如图2所示。

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

(2)简易数字电压表实验板连接图如图3所示。

此外,还需用一根杜邦实验线将J8的0~3.3V输出插针与J7口的P2.0插针相连。

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

3、详细设计

1.简易数字电压表设计相应C8051F360和LCD初始化程序

内部振荡器初始化:

OscInit()

I/O端口初始化:

PortIoInit()

外部数据存储器接口初始化:

XramInit()

定时器初始化:

TimerInit()

中断系统初始化:

Int0Init()

ADC0初始化:

voidADC_Init()

PCA初始化:

Int0Init()

2.电压转换方式

将电压转换成十进制:

AT=ADC0H*256+ADC0L;

volt=AT*3.31/1024;

voltage=volt*1000;

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

{

v[i]=voltage%10;

voltage=voltage/10;

}

 

3.LCD显示接口的设计

当时间到达设定值,即0.5s后,执行以下程序将所测的电压值在LCD屏幕上第三排显示出来。

WriteCom(0x8C);

WriteData(v[3]+0x30);

WriteData(0x2e);

WriteData(v[2]+0x30);

WriteData(v[1]+0x30);

WriteData(v[0]+0x30);

4.实验中AD转换方式选用逐次逼近型,A/D转换完成后得到10位数据分为高低字节存放在寄存器ADCOH和ADC0L中,此处选择右对齐,转换时针为2MHZ。

5.选择内部参考电压2.4伏为基准(在实际单片机调试中改为3.311伏),正端接P2.0,负端接地。

四、测试结果

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

V实际(V)

V显示(V)

相对误差(%)

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

由表1可知,10组数据中最大误差的一组是:

其余的误差都不超过,并且大部分数据误差都只有左右,满足小于0.01V的设计误差要求,即本实验的设计可以满足实验要求。

五、心得体会

通过这次对简易电压表的设计,我对单片机的最小系统设计有了新的理解,对于硬件和软件的配合也更熟练了。

在这个实验中LCD显示模块的CPLD部分由FPGA充当,芯片本身自带程序,因而这个部分不需要再通过QUARTUS软件进行编程。

在参考电压选择过程中发现,单片机实际最大电压并不是2.4v而是3.3v,则在转换中将3.3V替换2.4V即可。

六.代码附录

/*简易数字电压表*/

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineWCOMADDR0xC008//写命令寄存器的地址

#defineWDATADDR0xC009//写数据寄存器的地址

#defineRCOMADDR0xC00A//读命令寄存器的地址

#defineRDATADDR0xC00B//读数据寄存器的地址

#defineKEYCS0xC00C

ucharcodehanzi[]="简易数字电压表";

ucharcodekeynum[]="键值";

ucharcodekeyc[]="次数";

uinttime=0;

floatvolt;

uintv[4];

uintAT,voltage;

ucharkeyn,keycode;

 

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

voidPortIoInit();//I/O端口初始化

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

voidPcaInit();//PCA初始化(设置看门狗定时器的工作状态)

voidInitDevice();//内部资源初始化

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

voidWriteCom(ucharn);//Lcd写指令子程序

voidWriteData(ucharm);//Lcd写数据子程序

voidInsitiLcd();//Lcd初始化子程序

voidDispHan(ucharcode*a,ucharm,uchark);//显示汉字子程序

voidTimerInit();//定时器初始化

voidInterruptsInit();//中断系统初始化

voidADC_init();//ADC0初始化详见书本P144

voidInt0Init();//外部中断初始化

voidmain()

{

uchari;

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;

AT=ADC0H*256+ADC0L;

volt=AT*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;

}

}

}

voidReadKey()interrupt0

{

ucharxdata*addr;

ucharc1,c2;

addr=KEYCS;

keycode=*addr;

keycode&=0x0F;

keyn++;

DispHan(keynum,0x88,0x04);

WriteCom(0x8b);

if(keycode<10)

{

WriteData(0x30);

WriteData(keycode+0x30);

}

else

{

c1=keycode%10;

c2=keycode/=10;

WriteData(c2+0x30);

WriteData(c1+0x30);

}

DispHan(keyc,0x98,0x04);

WriteCom(0x9b);

if(keyn==10)

keyn=0;

WriteData(keyn+0x30);

}

voidInt0Init()

{

EA=1;

IT01CF=0x05;

EX0=1;

IT0=1;

}

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

{

SFRPAGE=0x0f;//选择特殊功能寄存器页地址

OSCICL=OSCICL+4;

OSCICN=0xc2;//允许内部振荡器,频率除2作为SYSCLK=12MHz

CLKSEL=0x00;//选择内部振荡器

SFRPAGE=0x00;

}

voidADC_init()

{

ADC0CF=0x28;//选择内部参考电压2.4V为基准

ADC0CN=0x80;//正端接P2.0

AMX0P=0x08;//负端接地

AMX0N=0x1F;//右对齐,转换时针为2MHZ

REF0CN=0x08;//写AD0BUSY启动A/D转换器

}

voidTimerInit()

{

TMOD=0x01;

TH0=0xd8;

TL0=0xf0;

TR0=1;

}

voidInterruptsInit(void)

{

EA=1;

ET0=1;

EX0=1;

PX0=1;

IE0=0;

}

 

voidPortIoInit(void)//I/O口初始化

{

SFRPAGE=0x0f;

P0MDIN=0xe7;//P0.3、P0.4模拟量输入

P0MDOUT=0x83;//P0.0、P0.1、P0.7推拉式输出

P0SKIP=0xf9;//P0.1、P0.2被交叉开关跳过

P1MDIN=0xff;//P1设置为数字量输入

P1MDOUT=0xff;//P1设置为推拉式输出

P1SKIP=0xff;//P1被交叉开关跳过

//P2MDIN=0xff;//P2设置为数字量输入

//P2MDOUT=0xff;//P2设置为推拉式输出

//P2SKIP=0xff;

P3MDIN=0xff;//P3设置为数字量输入

P3MDOUT=0xff;//P3设置为推拉式输出

P3SKIP=0xff;

P4MDOUT=0xff;//P4.5设为OC输出,其余推拉式输出

XBR0=0x01;//使能UART

XBR1=0xC0;//禁止弱上拉,交叉开关允许

SFRPAGE=0x00;

return;

}

voidXramInit(void)//外部数据储存器初始化

{

SFRPAGE=0x0f;

EMI0CF=0x07;//引脚复用方式

SFRPAGE=0x00;

return;

}

voidPcaInit(void)//PCA初始化

{

PCA0CN=0x40;//允许PCA计数器/定时器

PCA0MD=0x00;//禁止看门狗定时器

return;

}

voidInitDevice(void)

{

OscInit();

PortIoInit();

XramInit();

//SmbInit();

//UartInit();

ADC_init();

TimerInit();

InterruptsInit();

Int0Init();

PcaInit();

return;

}

 

voidCheckLcd()

{

uchartemp=0x00;

ucharxdata*addr;

while

(1)

{

addr=RCOMADDR;

temp=*addr;

temp&=0x80;

if(temp==0x00)

break;

}

}

voidWriteCom(ucharn)

{

ucharxdata*addr;

CheckLcd();

addr=WCOMADDR;

*addr=n;

}

voidWriteData(ucharm)

{

ucharxdata*addr;

CheckLcd();

addr=WDATADDR;

*addr=m;

}

voidInsitiLcd()

{

WriteCom(0x30);//设为基本指令集

WriteCom(0x01);//清屏

WriteCom(0x0c);//开整体显示

}

voidDispHan(ucharcode*a,ucharm,uchark)//书本177页有详细解释

{

uchardat,i,j,length;

length=k/2;

WriteCom(m);

for(i=0;i

{

j=2*i;

dat=a[j];

WriteData(dat);

dat=a[j+1];

WriteData(dat);

}

WriteData(0x3a);

}

voidDispShu(unsignedinta,ucharm)

{

WriteCom(m);

WriteData(a+0x30);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2