//程序说明:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> //中断函数头文件
//常量声明
#define BAUD 9600 //波特率设置值
//全局变量声明
unsigned int ADData; //AD转换获得的数据
//函数声明
void Port_Init(void); //端口初始化配置
void Usart_Init(void); //USART寄存器设置
void AD_Init(void); //AD初始化
void Usart_PutChar(unsigned char cTXData); //字节发送函数
void Usart_PutString(unsigned char *pcString); // 字符串发送数据
unsigned int AD_GetData(void); //AD转换函数
int main(void)
{
unsigned char Delay3s;
Port_Init();
Usart_Init();
AD_Init();
Usart_PutString("AD转换测试程序");
Usart_PutString("测得ADC0通道的电压值为:");
sei(); //使能全局中断
while(1)
{
ADData = (int)((long)AD_GetData() * 5010 / 1024); //将获得的AD值转换为电压值
//单位为mv。
Usart_PutChar(ADData / 1000 + 0x30); //得到电压值的千位并发送
Usart_PutChar('.'); //发送小数点
Usart_PutChar(ADData % 1000 / 100 + 0x30); //得到电压值的百位并发送
Usart_PutChar(ADData % 100 / 10 + 0x30); //得到电压值的十位并发送
Usart_PutChar(ADData % 10 + 0x30); //得到电压值的个位并发送
Usart_PutChar('V'); //发送电压符号“V”
Usart_PutChar(0x0d); //
Usart_PutChar(0x0a); // AD值发送结束,回车换行
for(Delay3s = 0;Delay3s < 30;Delay3s++) //延时3S
{
_delay_ms(90);
}
}
}
//端口状态初始化设置函数
void Port_Init()
{
PORTA = 0X00;
DDRA = 0x00; //ADC通道设置为输入口,高阻态
}
//USART寄存器配置函数
void Usart_Init()
{
UCSRA = 0X00;
UCSRC |= (1<<URSEL) | (1 << UCSZ1) | (1 << UCSZ0); //异步,数据格式8,N,1
//UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写 UCSRC 时, URSEL 应设置为 1。
UBRRL = (F_CPU / BAUD / 16 - 1) % 256; //波特率设置
UBRRH = (F_CPU / BAUD / 16 - 1) / 256;
UCSRB |= (1 << RXCIE) | (1 << RXEN) | (1 << TXEN); //发送使能
}
//字节发送函数
void Usart_PutChar(unsigned char cTXData)
{
while( !(UCSRA & (1 << UDRE)) ); //只有数据寄存器为空时才能发送数据
UDR = cTXData; //发送数据送USART I/O数据寄存器-UDR
}
//接收中断函数
ISR(USART_RXC_vect )
{
unsigned char Rev;
Rev = UDR; //从USART I/O数据寄存器-UDR中读出数据
Usart_PutChar(Rev); //将接收到的数据发送
}
void Usart_PutString(unsigned char *pcString)
{
while (*pcString)
{
Usart_PutChar(*pcString++);
}
Usart_PutChar(0x0D);
Usart_PutChar(0x0A); //结尾发送回车换行
}
//AD转换初始化函数
void AD_Init()
{
ADMUX |= (1 << REFS0); //ADC参考电压为AVcc,ADC结果右对齐,选择通道ADC0
ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); //使能AD转换,ADC时钟64分频
}
//AD转换函数
unsigned int AD_GetData()
{
ADCSRA |= (1 << ADSC); //开始AD转换
while(!(ADCSRA & (1 << ADIF))); //等待转换完成
ADCSRA |= (1 << ADIF); //清零ADC中断标志位
return ADC; //返回ADC值
}
评论0