05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告Word格式文档下载.docx
《05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《05V数字式直流电压表设计实验报告《电子与控制系统设计》实验报告Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
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<
iom16v.h>
macros.h>
#definextal8
#definePB00
#definePB11
#definePB22
//----------------------------
#defineucharunsignedchar
#defineuintunsignedint
#defineSET_BIT(x,y)(x|=(1<
<
y))
#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<
l;
i++){
DisplayOneChar(x++,y,ptr[i]);
if(x==16){
x=0;
y^=1;
}
//**********演示第二行移动字符串子函数************
voidDisplayLine2(uchardd)
uchari;
16;
DisplayOneChar(i,1,dd++);
dd&
=0x7f;
if(dd<
32)dd=32;
//***********显示光标定位子函数******************
voidLocateXY(charposx,charposy)
uchartemp=0;
temp&
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);
//清屏
LcdWriteCommand(0x0c);
//开显示,不显示光标
//************写命令到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;
DataPort=dataW;
//***********1ms延时子函数*******************
voidDelay_1ms(void)
{uinti;
for(i=1;
(uint)(xtal*143-2);
i++);
//=============n*1ms延时子函数================
voidDelay_nms(uintn)
uinti=0;
while(i<
n)
{Delay_1ms();
i++;
}
0~5V数字式直流电压表程序:
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;
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;
k;
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);
100;
PORTC=ACT[0];
PORTB=SEG7[dis_val%10];
delay
(1);
PORTC=ACT[1];
PORTB=SEG7[dis_val/10%10];
PORTC=ACT[2];
PORTB=SEG7[dis_val/100%10];
PORTC=ACT[3];
PORTB=0x80|SEG7[dis_val/1000];
}
输入信号的幅值为0~10V程序:
#include"
lcd1602_8bit.c"
ucharconsttitle[]={"
0-10vD_voltager"
};
x=(10000*(long)i)/1023;
Delay_nms(400);
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'
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转换程序的设计与数据采集与显示的应用;
对数据处理的方法有了新的认识。