⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m8-adc测试.c

📁 AVR例子程序和protues仿真
💻 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 + -