📄 m8-adc测试.c
字号:
/************ATMEGA8-ADC测试*************************/
/*******特别注意:经常碰到提示错误:不稳定的语法,是因为函数或变量名字起的和库函数重复了。所以,尽量加上自己的标志*********/
#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}; //特别注意:如果数组不多空一位,当字符串发送时,就不能结束。会把上次指针指向的字符串也一起发送
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); //数据传递到外部变量保存
delayms(400);
convert(adc_temp,adc_buf); //用指针更新数组中的数据
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); //基准用VCC,数据左对齐,选ADC3通道 0X63
ADCSRA=(1<<ADEN); //2分频,使能ADC,开启ADC转换开关。不中断,用查询法,用单次转换
ADCSRA|=(1<<ADSC);
}
/***************************************************/
void adc_wait()
{
while(!ADIF);
}
/*********ADC转换***因为转换结果要存储,必须用指针传递出去*******************/
void M8_ADC(unsigned int *dat) //注意这里参数:要用指针才能把数据传递到实参里去 adc_temp,不然M8_ADC(adc_temp);结果存不到adc_temp中
{ //ADC值送出外部int变量存储,参数传递,改变了实参,要用指针
uchar temp;
adc_init();
adc_wait();
temp=(unsigned char)ADCL;
*dat=ADCH;
*dat=*dat*256+temp;
ADCSRA=(1<<ADIF)|(1<<ADEN); //ADIF通过写1来清除
}
void convert(unsigned int adc_data,unsigned char *t) //这里用指针才能把数据存入到数组中,前面变量是ADC函数里存储的
{
*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';
}
/******************发送数据到串口*****************/
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() //特别注意写UCSRC时,要把最高位置1,否则写不进去
{
UCSRB = 0x00; //先不使能发送接收
UCSRA = 0x00; //Bit1为1则倍速发送,这里不倍速
UCSRC = 0x86; //8位数据格式,异步方式,URSEL=1时,写UCSRC寄存器
UBRRL = 25; //波特率:9600 Bps 8MHZ时钟 51 1MHZ 6 2MHZ 12 4MHZ 25
UBRRH = 0x00; //误差率:0.156%
UCSRB = 0x98; //使能发送接收,使能接收中断
}
/*************串口接收***********************/
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++)
{;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -