?? m8-adc測(cè)試.c
字號(hào):
/************ATMEGA8-ADC測(cè)試*************************/
/*******特別注意:經(jīng)常碰到提示錯(cuò)誤:不穩(wěn)定的語(yǔ)法,是因?yàn)楹瘮?shù)或變量名字起的和庫(kù)函數(shù)重復(fù)了。所以,盡量加上自己的標(biāo)志*********/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
#include "M8-ADC.h"
/**************************************************/
uchar adc_buf[5]={97,98,99,109}; //特別注意:如果數(shù)組不多空一位,當(dāng)字符串發(fā)送時(shí),就不能結(jié)束。會(huì)把上次指針指向的字符串也一起發(fā)送
uint adc_temp=105;
void adc_init();
void adc_wait();
/**************************************************/
int main()
{
port_init();
uart();
delayms(2000);
sendstr("ATMEGA8-ADC-TEST!!");
sendstr("data send as character");
delayms(3000);
send_UART(adc_temp);
sendstr(adc_buf);
while(1)
{
sendstr("ADC TEST START!");
M8_ADC(&adc_temp); //數(shù)據(jù)傳遞到外部變量保存
delayms(400);
convert(adc_temp,adc_buf); //用指針更新數(shù)組中的數(shù)據(jù)
sendstr(adc_buf);
sendstr("ADC TEST FINISH!");
delayms(4000);
}
}
/***************************************************/
void port_init()
{
DDRD= 0XFF;
PORTD=0xFF;
DDRD=(1<<1);//串口的輸出
}
/***************************************************/
void adc_init()
{
ADMUX=(1<<REFS0)|(1<<MUX1); //基準(zhǔn)用VCC,數(shù)據(jù)左對(duì)齊,選ADC3通道 0X63
ADCSRA=(1<<ADEN); //2分頻,使能ADC,開(kāi)啟ADC轉(zhuǎn)換開(kāi)關(guān)。不中斷,用查詢法,用單次轉(zhuǎn)換
ADCSRA|=(1<<ADSC);
}
/***************************************************/
void adc_wait()
{
while(!ADIF);
}
/*********ADC轉(zhuǎn)換***因?yàn)檗D(zhuǎn)換結(jié)果要存儲(chǔ),必須用指針傳遞出去*******************/
void M8_ADC(unsigned int *dat) //注意這里參數(shù):要用指針才能把數(shù)據(jù)傳遞到實(shí)參里去 adc_temp,不然M8_ADC(adc_temp);結(jié)果存不到adc_temp中
{ //ADC值送出外部int變量存儲(chǔ),參數(shù)傳遞,改變了實(shí)參,要用指針
uchar temp;
adc_init();
adc_wait();
temp=(unsigned char)ADCL;
*dat=ADCH;
*dat=*dat*256+temp;
ADCSRA=(1<<ADIF)|(1<<ADEN); //ADIF通過(guò)寫(xiě)1來(lái)清除
}
void convert(unsigned int adc_data,unsigned char *t) //這里用指針才能把數(shù)據(jù)存入到數(shù)組中,前面變量是ADC函數(shù)里存儲(chǔ)的
{
*t =adc_data/1000+'0';
*(t+1)=adc_data%1000/100+'0';
*(t+2)=adc_data%100/10+'0';
*(t+3)=adc_data%10+'0';
}
/******************發(fā)送數(shù)據(jù)到串口*****************/
void send_UART(uchar uart_data)
{
while (!(UCSRA&(1<<UDRE)));
UDR=uart_data;
while (!(UCSRA&(1<<UDRE)));
UDR=0x0a; //回車換行
while (!(UCSRA&(1<<UDRE)));
UDR=0x0d;
}
/************************************************/
void uart() //特別注意寫(xiě)UCSRC時(shí),要把最高位置1,否則寫(xiě)不進(jìn)去
{
UCSRB = 0x00; //先不使能發(fā)送接收
UCSRA = 0x00; //Bit1為1則倍速發(fā)送,這里不倍速
UCSRC = 0x86; //8位數(shù)據(jù)格式,異步方式,URSEL=1時(shí),寫(xiě)UCSRC寄存器
UBRRL = 25; //波特率:9600 Bps 8MHZ時(shí)鐘 51 1MHZ 6 2MHZ 12 4MHZ 25
UBRRH = 0x00; //誤差率:0.156%
UCSRB = 0x98; //使能發(fā)送接收,使能接收中斷
}
/*************串口接收***********************/
unsigned char Getchar(void)
{
while(!(UCSRA& (1<<RXC)));
return UDR;
}
/********************************************/
void sendstr(uchar *s)
{
while (*s)
{
while (!(UCSRA&(1<<UDRE)));
UDR=*s;
s++;
}
while (!(UCSRA&(1<<UDRE)));
UDR=0x0a; //回車換行
while (!(UCSRA&(1<<UDRE)));
UDR=0x0d;
}
/***********************************************/
void delayms(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<100;j++)
{;}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -