05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx
《05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx》由会员分享,可在线阅读,更多相关《05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
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;iDisplayOneChar(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转换程序的设计与数据采集与显示的应用;对数据处理的方法有了新的认识。