专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

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

作者:佚名   来源:本站原创   点击数:  更新时间:2011年03月25日   【字体:

一、实验目的

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

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

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

二、实验内容

1. 参照课本P383页“0~5V数字式直流电压表实验”程序,并编译、仿真,见下图所示。

 

注意:由于用proteus ISIS仿真时,数码管模型显示的闪烁现象和缓存现象,需要对其进行短延时和清屏,否则,显示将出现乱码现象。可在main()主函数里加入两条语句:

Delay(1);

PORTA=0;

(1)修改错误。

    比较程序第25行“ADMUX=0XC7”以及程序第71行“x=(5000*(long)i)/1023”所指参考电压不一致,导致输入模拟电压值与数码管显示电压值不一致,有哪几种修改方案。

    如把ADMUX=0XC7改为0X07。

(2)调节电位器(POT-LOG),观察数码管显示的电压值与虚拟直流电压表显示的电压是否一致。

2.将编译通过后的程序烧写到单片机里,调节AD电位器,观看开发板上数码管的显示情况。

  注意数码管的位选端排列顺序,实验板与课本电路图中数码管排序不同,故需要调整位选端。

3.如果想观察ADC转换后的数字结果,则需将数码管显示改为:

  PORTA=SEG7[adc_val%10];

  ………

  依次类推。

三、拓展实验

把数码管显示改为LCD1602液晶显示。(可参考P240“0~5V数字电压调整器”lcd部分程序内容)

注意:因使用PA7为输入端口,而PA口为原电路中LCD1602的数据端口,故把数据端口改为PC口,注意要把lcd1602液晶的驱动程序“lcd1602_8bit.c”中的语句“#define DataPort PORTA”改为“#define DataPort PORTC”。Proteus ISIS仿真图如下图。

 

 

四、附使用LCD1602显示ADC参考程序


 

 

#include <iom16v.h> 
#include "lcd1602_8bit.c"
uchar const title[]={"0-5v D_voltager"}; 
#define uchar unsigned char 
#define uint  unsigned int 
uint adc_val,dis_val; 
uchar i,cnt; 
/************************************************/
void port_init(void) 
{ 
 PORTA = 0x7F; 
 DDRA  = 0x7F;    
 PORTB = 0xFF;
 DDRB  = 0xFF; 
 PORTC = 0xFF; 
 DDRC  = 0xFF; 
 PORTD = 0xFF; 
 DDRD  = 0xFF; 
} 
/************************************************/
void adc_init(void)     { 
ADCSRA = 0xE3;    
ADMUX = 0x47;  } 
//***************************
void timer0_init(void)   { 
TCNT0 = 0x83; 

TCCR0 = 0x03;  
TIMSK = 0x01;   
} 
/*********************************************/
void init_devices(void)    
{ 
 port_init();    
 timer0_init();    
 adc_init();     
 SREG =0x80;        

} 
//***************************
#pragma interrupt_handler timer0_ovf_isr:10   
void timer0_ovf_isr(void) 
{ 
 TCNT0 = 0x83;    
 cnt++;         
 }
//=========================
uint ADC_Convert(void) 
{uint temp1,temp2;  
 adc_init();
 temp1=(uint)ADCL; 
 temp2=(uint)ADCH;
 temp2=(temp2<<8)+temp1; 
 return(temp2);    
}
/**************************/
uint conv(uint i)    
{
long x;     
uint y; 
x=(5000*(long)i)/1023; 
y=(uint)x;    
return y;  
} 
void delay(uint k)   
{
uint i,j;
 for(i=0;i<k;i++)
 {  
 for(j=0;j<1141;j++); 
 }
}

/***********************/
void main(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(11,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/1000)+0x30);
 DisplayOneChar(12,1,(dis_val/100)%10+0x30);
 DisplayOneChar(13,1,(dis_val/10)%10+0x30);
 DisplayOneChar(14,1,(dis_val%10)+0x30); 
   }
}

 
关闭窗口

相关文章