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

📄 ad1.c

📁 在ATmega16上的一个简单的AD转换程序
💻 C
字号:
#include <avr/io.h>
#include <math.h>
#include <float.h>

#define uchar unsigned char
#define uint unsigned int
#define F_cpu 7372800
//#define N 13
//uint value_buf[N]={0};
uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0到9显示
uchar Data[]={0,0,0,0};

void DelayMs(uint a) //延时0.2ms
{
 uint b;
 for(;a!=0;a--)
  {for(b=1000;b!=0;b--) 
   ;
  }
}

void USART_Init(long int baud)
{
 uint temp;
 temp=F_cpu/baud/16-1;
 UBRRH=(uchar)(temp>>8); //写波特率寄存器
 UBRRL=(uchar)(temp);//uchar为8位,它会截取16位temp数据中的低8位
 
 UCSRB=(1<<RXEN)|(1<<TXEN); //接收发送使能
 UCSRC=(1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);  //异步,2个停止位,8个数据位
}

void USART_Transmit(uchar data)
{
 while(!(UCSRA&(1<<UDRE)));  //等待数据发送完
 UDR=data;
}
//
void Display(unsigned int v)
{
 Data[0]=v/1000;
 v=v%1000;
 Data[1]=v/100;
 v=v%100;
 Data[2]=v/10;
 v=v%10;
 Data[3]=v;
 
 PORTD=0x04;//选通第一个数码管
 PORTB=Table[Data[0]];
 DelayMs(60);//延时5ms
 PORTD=0x08;//选通第二个数码管
 PORTB=Table[Data[1]];
 DelayMs(60);//延时5ms
 PORTD=0x10;
 PORTB=Table[Data[2]];
 DelayMs(60);
 PORTD=0x20;
 PORTB=Table[Data[3]];
 DelayMs(60);
}

int main (void)
{
uint temp1,temp2;
uint j,adc,n;
DDRA=0x00;
PORTA=0x00; //非上拉输入
DDRB=0xff;
PORTB=0x00;
DDRD=0xff;
PORTD=0x00;
USART_Init(9600);

ADCSRA=0x00;
ACSR=0x80; //禁用模拟比较器
ADMUX=0xc0; //内部基准电压2.56v,右对齐,0通道
//ADMUX=0x40; //基准电压AVCC,右对齐,0通道
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0); //ADC使能、、32分频、单次转换
//SFIOR=0x00;
DelayMs(3000);
while(1)
{
ADCSRA |=_BV(ADSC);
while(!(ADCSRA&(1<<ADIF))); //未转换完,等待
 ADCSRA|=(1<<ADIF); //清转换结束标志
 temp1=(uint)ADCL;
 temp2=(uint)ADCH;
 temp2=(temp2<<8)+temp1;
 
j=temp2<<1;//放大一千倍
adc=(temp2>>1)+j;
Display(adc);

//USART_Transmit(0xff);//发送所得数据前先发送00当作AD转换后数据的起始位
//for(n=0;n<4;n++)
//USART_Transmit(Data[n]+'0');
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -