#include <avr/io.h>
#include <avr/delay.h>
#define PIN_RXD 0 //PD0 RXD
#define PIN_TXD 1 //PD1 TXD
#define BAUDRATE 9600 //baudrate
//#define F_CPU 8000000 //the frequency of the global clock
unsigned int advalue;
void init_USART(void);
void put_s(unsigned char *ptr);
void put_c(unsigned char c);
int main(void)
{
//上電默認(rèn)DDRx=0x00,PORTx=0x00 輸入,無(wú)上拉電阻
PORTA=0XFF; //上拉
PORTB =0xFF; //不用的管腳使能內(nèi)部上拉電阻。
PORTC=0XFF;
DDRD =(1<<PIN_TXD); //TXD為輸出
PORTD =0xFF;
init_USART();
while(1)
{
unsigned char highvalue,lowvalue;
ADMUX=(1<<REFS0); //AVCC基準(zhǔn)電壓,通道0,10bits ad value
/*----------------------------------------------------------------
ADMUX
7,6 REFS1:0--------Rrference Selection Bits
00-------------AREF,Internal Vref truned off
01-------------AVCC with external capacior at AREF pin
10-------------Reserved
11-------------internal 2.56V Voltage Reference with external
capacitior at AREF pin
5 ADELAR---------ADC Left Adjust Result
1--------------Left Adjust-----8 bits resolution
0--------------Right Adjust----10 bits resolution
4:0 MUX4:0---------Analog Channel and Gain Selection Bits
00000----------ADC0
00001----------ADC1
||||||||||||||||||||||||||||||||||||
00111----------ADC7
|||||||||||||||||||||||||||||||||||||
----------------------------------------------------------------*/
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //AD使能,單次轉(zhuǎn)換,128分頻
/*--------------------------------------------------------------------
ADCSRA
7 ADEN-----------ADC Enable
6 ADSC-----------ADC Start Comversion
5 ADATE----------ADC Auto Trigger Enable
4 ADIF-----------ADC Interrupt Flag
3 ADIE-----------ADC Interrupt Enable
2:0 ADPS2:0--------ADC Prescaler Select Bits
000------------2
001------------2
010------------4
011------------8
100------------16
101------------32
110------------64
111------------128
---------------------------------------------------------------------*/
while(!(ADCSRA & (1 << ADIF))); /*等待*/
advalue=ADC;
ADCSRA&=(~(1<<ADEN))|(~(1<<ADSC));
advalue=advalue*4.89;
highvalue=(unsigned char)(advalue/100);
lowvalue=(unsigned char)(advalue%100);
put_s("AD轉(zhuǎn)換電壓值為:");
put_c(highvalue/10+0x30);
put_c('.');
put_c(highvalue%10+0x30);
put_c(lowvalue/10+0x30);
put_c(lowvalue%10+0x30);
put_s("V\n");
unsigned char i;
for(i=0;i<255;i++)
_delay_ms(20);
}
}
/*---------------------------------------------------------------------------
function send an unsigned char to the uart
----------------------------------------------------------------------------*/
void put_c(unsigned char c) //發(fā)送采用查詢(xún)方式
{
while( !(UCSRA & (1<<UDRE)) ); //wait until the uart is empty
UDR=c; //write data to uart
}
/*----------------------------------------------------------------------------
function send a string to the uart and with return back
-----------------------------------------------------------------------------*/
void put_s(unsigned char *ptr)
{
while (*ptr)
{
put_c(*ptr++);
}
put_c(0x0D);
put_c(0x0A); //結(jié)尾發(fā)送回車(chē)換行
}
/*---------------------------------------------------------------------------
fuction initialize the uart unit
----------------------------------------------------------------------------*/
void init_USART(void)//USART 初始化
{
//USART 9600 8, n,1 PC上位機(jī)軟件(超級(jí)終端等)也要設(shè)成同樣的設(shè)置才能通訊
UCSRC = (1<<URSEL) | 0x06;
//異步,8位數(shù)據(jù),無(wú)奇偶校驗(yàn),一個(gè)停止位,無(wú)倍速
/*
UBRRH與UCSRC共用I/O 地址。因此訪問(wèn)該地址時(shí)需注意以下問(wèn)題。
寫(xiě)訪問(wèn)
當(dāng)在該地址執(zhí)行寫(xiě)訪問(wèn)時(shí), USART 寄存器選擇位(URSEL)控制被寫(xiě)入的寄存器。
若URSEL為0,對(duì)UBRRH值更新;若URSEL為1,對(duì)UCSRC設(shè)置更新
讀訪問(wèn)
對(duì)UBRRH 或UCSRC 寄存器的讀訪問(wèn)則較為復(fù)雜。但在大多數(shù)應(yīng)用中,基本不需要讀這些寄存器
沒(méi)有UBRR這個(gè)16位寄存器,因?yàn)閁BRRL(0x09)/UBRRH(0x20)的地址不連續(xù),而且UBRRH跟UCSRC共用地址
*/
//U2X=0時(shí)的公式計(jì)算
UBRRL= (F_CPU/BAUDRATE/16-1)%256;
UBRRH= (F_CPU/BAUDRATE/16-1)/256;
//U2X=1時(shí)的公式計(jì)算
//UBRRL= (F_CPU/BAUDRATE/8-1)%256;
//UBRRH= (F_CPU/BAUDRATE/8-1)/256;
//也可根據(jù)數(shù)據(jù)手冊(cè)的[波特率設(shè)置的例子]查得
//UBRRL = 0x2F; //set baud rate lo
//UBRRH = 0x00; //set baud rate hi
UCSRA = 0x00; //無(wú)倍速
UCSRB = (1<<RXEN)|(1<<TXEN);
//使能接收,使能發(fā)送
}