05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx

上传人:b****3 文档编号:3663516 上传时间:2022-11-24 格式:DOCX 页数:16 大小:131.89KB
下载 相关 举报
05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx_第1页
第1页 / 共16页
05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx_第2页
第2页 / 共16页
05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx_第3页
第3页 / 共16页
05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx_第4页
第4页 / 共16页
05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx

《05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx》由会员分享,可在线阅读,更多相关《05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx(16页珍藏版)》请在冰豆网上搜索。

05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx

05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告

《电子与控制系统设计》实验报告

 

实验项目名称:

0~5V数字式直流电压表设计

指导老师:

元泽怀

完成时间:

2015年11月3日

 

实验

项目

0~10V数字式直流电压表设计

实验项目类型

验证

演示

综合

设计

其他

*

一、实验目的

1.掌握A/D转换程序的设计;

2.掌握数据采集与显示的应用;

3.掌握数据处理的方法;

二、实验内容

1.编一程序,实现0~5V数字式直流电压表功能,用电位器RV1作模拟量的输入,右边4

位数码管显示输入电压值,使用PA7进行模拟量输入。

其仿真电路见下图5-1所示。

图5-10~5V数字式直流电压表仿真电路图

2.实现输入信号的幅值为0~10V,重新设计实现电路和算法程序,电路图如5-2所示。

图5-20~10V数字式直流电压表仿真电路图

三、使用仪器设备及材料

1、安装windowsxp操作系统的微型计算机1台

2、AVR单片机C语言集成开发环境ICCAVR6.31A

3、单片机仿真平台proteus7.5

4、AVR单片机下载软件progisp

5、AVR单片机实验板1套(含下载器)

 

四、实验过程原始记录

1、主程序流程图

2.显示函数流程图:

2、软件主要程序及注解

驱动程序:

/*******LCD1602液晶驱动程序***************/

#include

#include

#definextal8

#definePB00

#definePB11

#definePB22

//----------------------------

#defineucharunsignedchar

#defineuintunsignedint

#defineSET_BIT(x,y)(x|=(1<

#defineCLR_BIT(x,y)(x&=~(1<

#defineGET_BIT(x,y)(x&=(1<

//-------端口电平的宏定义------------

#defineLCM_RS_1SET_BIT(PORTB,PB0)

#defineLCM_RS_0CLR_BIT(PORTB,PB0)

#defineLCM_RW_1SET_BIT(PORTB,PB1)

#defineLCM_RW_0CLR_BIT(PORTB,PB1)

#defineLCM_EN_1SET_BIT(PORTB,PB2)

#defineLCM_EN_0CLR_BIT(PORTB,PB2)

//------------------------------

#defineDataPortPORTA

#defineBusy0x80

//**********函数声明********************

voidDelay_1ms(void);

voidDelay_nms(uintn);

voidLcdWriteData(ucharW);

voidLcdWriteCommand(ucharCMD);

voidInitLcd(void);

voidDisplayLine2(uchardd);

voidDisplayOneChar(ucharx,uchary,ucharWdata);

voidePutstr(ucharx,uchary,ucharconst*ptr);

/***********显示指定坐标的一串字符子函数************/

voidePutstr(ucharx,uchary,ucharconst*ptr)

{

uchari,l=0;

while(ptr[l]>31){l++;}

for(i=0;i

DisplayOneChar(x++,y,ptr[i]);

if(x==16){

x=0;y^=1;

}

}

}

//**********演示第二行移动字符串子函数************

voidDisplayLine2(uchardd)

{

uchari;

for(i=0;i<16;i++){

DisplayOneChar(i,1,dd++);

dd&=0x7f;

if(dd<32)dd=32;

}

}

//***********显示光标定位子函数******************

voidLocateXY(charposx,charposy)

{

uchartemp=0;

temp&=0x7f;

temp=posx&0x0f;

posy&=0x01;

if(posy)temp|=0x40;

temp|=0x80;

LcdWriteCommand(temp);

}

//**********显示光标定位的一个字符子函数***********

voidDisplayOneChar(ucharx,uchary,ucharWdata)

{

LocateXY(x,y);

LcdWriteData(Wdata);

}

//***********LCD初始化子函数******************

voidInitLcd(void)

{

LcdWriteCommand(0x38);//显示模式设置(固定),8位数据接口

Delay_nms(5);

LcdWriteCommand(0x01);//清屏

Delay_nms(5);

LcdWriteCommand(0x0c);//开显示,不显示光标

Delay_nms(5);

}

//************写命令到LCM子函数************

voidLcdWriteCommand(ucharCMD)

{

LCM_RS_0;LCM_RW_0;

DataPort=CMD;

LCM_EN_1;Delay_nms

(1);LCM_EN_0;

}

//************写数据到LCM子函数*************

voidLcdWriteData(uchardataW)

{

LCM_RS_1;LCM_RW_0;

DataPort=dataW;

LCM_EN_1;Delay_nms

(1);LCM_EN_0;

}

//***********1ms延时子函数*******************

voidDelay_1ms(void)

{uinti;

for(i=1;i<(uint)(xtal*143-2);i++);

}

//=============n*1ms延时子函数================

voidDelay_nms(uintn)

{

uinti=0;

while(i

{Delay_1ms();

i++;

}

}

0~5V数字式直流电压表程序:

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharconstSEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//单个数码管1~9显示

ucharconstACT[4]={0xfe,0xfd,0xfb,0xf7};//选通数码管

uintadc_val,dis_val;

uchari,cnt;

/************************************************/

voidport_init(void)

{

PORTA=0x7F;

DDRA=0x7F;

PORTB=0xFF;

DDRB=0xFF;

PORTC=0xFF;

DDRC=0xFF;

PORTD=0xFF;

DDRD=0xFF;

}

/************************************************/

voidadc_init(void){

ADCSRA=0xE3;

ADMUX=0x47;}

//***************************

voidtimer0_init(void){

TCNT0=0x83;

TCCR0=0x03;

TIMSK=0x01;

}

/*********************************************/

voidinit_devices(void)

{

port_init();

timer0_init();

adc_init();

SREG=0x80;

}

//***************************

#pragmainterrupt_handlertimer0_ovf_isr:

10

voidtimer0_ovf_isr(void)

{

TCNT0=0x83;

cnt++;

}

//=========================

uintADC_Convert(void)

{uinttemp1,temp2;

adc_init();

temp1=(uint)ADCL;

temp2=(uint)ADCH;

temp2=(temp2<<8)+temp1;

return(temp2);

}

/**************************/

uintconv(uinti)

{

longx;

uinty;

x=(5000*(long)i)/1023;

y=(uint)x;

returny;

}

voiddelay(uintk)

{

uinti,j;

for(i=0;i

{

for(j=0;j<1141;j++);

}

}

/***********************/

voidmain(void)

{

init_devices();

delay(400);

DDRA=0X7F;PORTA=0X7F;

DDRC=0XFF;PORTC=0X00;

DDRB=0XFF;PORTB=0X00;

while

(1)

{

if(cnt>100)

{

adc_val=ADC_Convert();

dis_val=conv(adc_val);

cnt=0;

}

delay(10);

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

{

PORTC=ACT[0];

PORTB=SEG7[dis_val%10];

delay

(1);

PORTC=ACT[1];

PORTB=SEG7[dis_val/10%10];

delay

(1);

PORTC=ACT[2];

PORTB=SEG7[dis_val/100%10];

delay

(1);

PORTC=ACT[3];

PORTB=0x80|SEG7[dis_val/1000];

delay

(1);

}

}

}

输入信号的幅值为0~10V程序:

#include

#include"lcd1602_8bit.c"

ucharconsttitle[]={"0-10vD_voltager"};

#defineucharunsignedchar

#defineuintunsignedint

uintadc_val,dis_val;

uchari,cnt;

/************************************************/

voidport_init(void)

{

PORTA=0x7F;

DDRA=0x7F;

PORTB=0xFF;

DDRB=0xFF;

PORTC=0xFF;

DDRC=0xFF;

PORTD=0xFF;

DDRD=0xFF;

}

/************************************************/

voidadc_init(void){

ADCSRA=0xE3;

ADMUX=0x47;}

//***************************

voidtimer0_init(void){

TCNT0=0x83;

TCCR0=0x03;

TIMSK=0x01;

}

/*********************************************/

voidinit_devices(void)

{

port_init();

timer0_init();

adc_init();

SREG=0x80;

}

//***************************

#pragmainterrupt_handlertimer0_ovf_isr:

10

voidtimer0_ovf_isr(void)

{

TCNT0=0x83;

cnt++;

}

//=========================

uintADC_Convert(void)

{uinttemp1,temp2;

adc_init();

temp1=(uint)ADCL;

temp2=(uint)ADCH;

temp2=(temp2<<8)+temp1;

return(temp2);

}

/**************************/

uintconv(uinti)

{

longx;

uinty;

x=(10000*(long)i)/1023;

y=(uint)x;

returny;

}

voiddelay(uintk)

{

uinti,j;

for(i=0;i

{

for(j=0;j<1141;j++);

}

}

/***********************/

voidmain(void)

{

init_devices();

Delay_nms(400);

DDRA=0X7F;PORTA=0X7F;

DDRC=0XFF;PORTC=0X00;

DDRB=0XFF;PORTB=0X00;

InitLcd();

ePutstr(1,0,title);

DisplayOneChar(0,1,'A');

DisplayOneChar(1,1,'D');

DisplayOneChar(2,1,'C');

DisplayOneChar(3,1,'7');

DisplayOneChar(4,1,':

');

DisplayOneChar(12,1,'.');

DisplayOneChar(15,1,'V');

while

(1)

{

if(cnt>100)

{

adc_val=ADC_Convert();

dis_val=conv(adc_val);

cnt=0;

}

delay(10);

DisplayOneChar(5,1,(adc_val/1000)+0x30);

DisplayOneChar(6,1,(adc_val/100)%10+0x30);

DisplayOneChar(7,1,(adc_val/10)%10+0x30);

DisplayOneChar(8,1,(adc_val%10)+0x30);

DisplayOneChar(10,1,(dis_val/10000)+0x30);

DisplayOneChar(11,1,(dis_val/1000)%10+0x30);

DisplayOneChar(13,1,(dis_val/100)%10+0x30);

DisplayOneChar(14,1,(dis_val/10)%10+0x30);

//DisplayOneChar(14,1,(dis_val%10)+0x30);

}

}

五:

实验感悟与结果:

1.此次实验遇到多次问题,经过与同学交流,不断修改程序,即使模拟显示与液晶显示有一点点误差,但是最后实验还是能顺利实现0~5V与0~10V数字式直流电压表功能。

2.本次实验让我初步掌握A/D转换程序的设计与数据采集与显示的应用;对数据处理的方法有了新的认识。

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

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1