一、 实验目的:
1、了解IO口的结构;
2、熟悉A/D的特性;
3、掌握A/D的使用。
二、实验仪器:MEGA16实验板 一块
PC机 一台
三、实验原理:
四、实验步骤及内容:
#include <iom16v.h>
#include <macros.h>
#define VREF 4.950
unsigned int V=0;
float Vin=0;
unsigned char led[]={0X 3F ,0X06,0X5B,0X 4F ,0X66,0X6D,0X7D,0X07,0X 7F ,0X 6F }; //0-9
unsigned char led_putff[]={0X 3F ,0X 3F ,0X 3F ,0X 3F };
//*******************延时 us
void delay_us(int t)
{
do
t--;
while(t>1);
}
//*******************延时 ms
void delay_ms(unsigned int t)
{
while(t!=0)
{
delay_us(1142);
t--;}
}
/*....中断....*/
#pragma interrupt_handler ADC_isr:15
void ADC_isr(void)
{
V=ADCL;
V=(ADCH<<8)+V; //读取转换数值
}
/*....系统初始化....*/
void xhushihua(void)
{
DDRD=0XFF; //位选
DDRB=0XFF; //数码管
DDRA=0XFE; //C0口电压输入
PORTD=0X00;
PORTB=0XC0;
PORTA=0X00;
ADCSRA|=(1<<ADEN); //开启AD
SEI();
}
/*....AD初始化....*/
void ad_link(void)
{
ADCSRA|=(1<<ADSC)|(1<<ADIE); //启动转换
ADCSRA|=(1<<ADPS0)|(1<<ADPS1); //八分频
ADCSRA|=(1<<ADATE); //开启连续模式使能
ADMUX=0X00; //右对齐,基准电源VREF。零通道
SFIOR=0X00; //开启连续模式
}
/*....计算转换值....*/
void led_put(void)
{
unsigned char sreg;
unsigned char i=0;
unsigned char f=0;
unsigned int X=0;
sreg = SREG; //保存全局中断标志
CLI(); //禁用中断
Vin=V*VREF/1024; //转换数值
X=(unsigned short)(1000*Vin);
for(i=0;i<4;i++)
{
f=X%10;
led_putff[i]=led[f];
X=X/10;
}
led_putff[3]=0X80|led_putff[3];
SREG=sreg; //恢复全局中断标志
}
/*....数码管扫描....*/
void display(void)
{
unsigned char i=0;
for(i=0;i<4;i++)
{
PORTB=led_putff[i];
PORTD|=(1<<i);
delay_us(30);
PORTD=0X00;
}
}
/*....主函数....*/
void main(void)
{
xhushihua();
ad_link();
for(;;)
{
led_put();
display();
}
}