ADC转换简单电压表

本文介绍了一种使用ADC(模数转换器)实现简单电压表的原理和方法,通过仿真图展示了ADC如何将模拟电压信号转化为数字值进行读取和处理,为理解和应用ADC提供基础。
摘要由CSDN通过智能技术生成




#include <iom16v.h>  

#define uchar unsigned char  

#define uint  unsigned int 

uchar const
SEG7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 

uchar const ACT[4]={0b00001000,0b00000100,0b00000010,0b00000001};     

uint adc_val,dis_val;   

uchar i,cnt;         

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

void port_init(void)   

{             

 PORTA = 0x00;       

 DDRA 
= 0x00;        

 PORTB = 0xFF;  

 



 DDRB 
= 0xFF;     

 PORTC = 0x00;  

 DDRC 
= 0xff;     

 //PORTD = 0xff;     

 //DDRD  = 0xFF;     

}         

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

void adc_init(void)    
{           

ADCSRA = 0xE3;     

ADMUX=0b11100101 ;  //ADMUX = 0x46; 

  }      


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

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<<2)+(temp1>>6);//temp2=(temp2<<8)+temp1;   

 return(temp2);         

} 

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

uint conv(uint i)        

{ 

long x;           

uint y;        

x=(2560*(long)i)/1023; //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(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=SEG7[dis_val/1000];

    PORTB&=0B01111111  ;    

            delay(1);    

        }           

   }

}






仿真图在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值