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

📄 main.c

📁 avr单片机的ad转换例程 可以拷贝过来直接使用
💻 C
字号:
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/eeprom.h>



#define uchar unsigned char
#define uint unsigned int

#define RS_CLR PORTB &= ~(1 << PB2)
#define RS_SET PORTB |= (1 << PB2)

#define RW_CLR PORTB &= ~(1 << PB1)
#define RW_SET PORTB |= (1 << PB1)

#define EN_CLR PORTB &= ~(1 << PB0)
#define EN_SET PORTB |= (1 << PB0)

uchar table[]={'0','1','2','3','4','5','6','7','8','9'}; 

//	显示用指针变量
char *line1;
char *line2;
char *line3;
char *line4;
uchar  v;
uchar nb,ns,ng;

void num_do(uchar d)
{
nb=d/100;
ns=(d%100)/10;
ng=(d%100)%10;
}

void IO_INT(void)
{
DDRB=0xff;
PORTB=0xff;
DDRD=0xff;
PORTD=0xff;
PORTC |= (1 << PC1);
ADMUX = (1<<REFS0); 
ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
}

void busy_check(void)
{ 

uchar i;
PORTD=0Xff;
while(1)
   {
      RS_CLR;
      RW_SET;
      EN_SET;
      i=PIND;
      EN_CLR;
      if((i&0X80)==0X00)
      asm("nop");
      asm("nop");
      break;
   }
}

void wcom(uchar com)//并口写命令
{

 busy_check();
 RS_CLR;
 RW_CLR;
 EN_SET;
 asm("nop"); 
 PORTD=com;
 asm("nop"); 
 EN_CLR;
 }
void wdata(uchar dat)//并口写数据
{

 busy_check();
 RS_SET;
 RW_CLR;
 EN_SET;
 asm("nop"); 
 PORTD=dat;
 asm("nop"); 
 EN_CLR;
}

void initlcd(void)
{
wcom(0x30);//基本指令
wcom(0x0c);//0000,1100 游标显示关
wcom(0x02);//0000,0010 显示RAM 地址归位
wcom(0x80);//1000,0000 设定显示RAM 地址到地址计数器
wcom(0x06);//右移位
wcom(0x0c);//开显示
}
void clear(void)
{
wcom(0x30);
wcom(0x01);//clear
}

void display(void)
{
	wcom(0x80);
	while( *line1!=0x00 )
	{
		wdata(*line1);
		line1++;
	}

	wcom(0x90);
	while( *line2!=0x00 )
	{
		wdata(*line2);
		line2++;
	}

	wcom(0x88);
	while( *line3!=0x00 )
	{
		wdata(*line3);
		line3++;
	}

	wcom(0x98);
	while( *line4!=0x00 )
	{
		wdata(*line4);
		line4++;
	}
	//line1 = "";
    // line2 = "";
   // line3 = "";
   // line4 = "";
}
void system_init(void)
{
	line1 = "";
    line2 = "";
    line3 = "";
    line4 = "";
	initlcd();
	clear();
}

uchar get_ad(void) 
{   uchar  i;
	ADMUX = 0x60;			/*基准AVCC、左对齐、通0*/
	ADCSRA = 0xC2;			/*使能、开启、4分频*/
	ADMUX = 0x67;			/*基准AVCC、左对齐、通道7*/
	ADCSRA = 0xC2;			/*使能、开启、4分频*/
	while(!(ADCSRA & (1 << ADIF)));	/*等待*/
	i=ADCH;
	ADCSRA &= ~(1 << ADIF);		/*清标志*/
	ADCSRA &= ~(1 << ADEN);		/*关闭转换*/
	return i;
}

int main(void)
{
 uchar i;
 IO_INT();
 system_init();
 PCICR=0x03;
 PCIFR=0x03;
 PCMSK1=0x02;
 PCMSK0=0x40;
 sei();
	while(1)
	{   
	    get_ad();
		i=get_ad();
		v=i;
		num_do(v);
        wcom(0x94);
        wdata(table[nb]);
        wcom(0x95);
        wdata(table[ns]);
		wcom(0x96);
        wdata(table[ng]);
	    
		line1 = "AVR_ATmega48 PRO";
        line2 = "ADC-7 V=";		
		display();

		PORTB |=(1 << PB7);
		_delay_ms(255);
		_delay_ms(255);
		PORTB &=~(1 << PB7);
	}

 }
 
ISR(PCINT1_vect)
{
 
 line3 = "写入V=";
 display();
 num_do(v);
 wcom(0x8b);
 wdata(table[nb]);
 wcom(0x8c);
 wdata(table[ns]);
 wcom(0x8d);
 wdata(table[ng]);
 eeprom_write_byte (0x00,v);	
}


ISR(PCINT0_vect)
{
 uchar i;
 line4 = "读出V=";
 display();
 i=eeprom_read_byte (0x00);
 num_do(i);
 wcom(0x9b);
 wdata(table[nb]);
 wcom(0x9c);
 wdata(table[ns]);
 wcom(0x9d);
 wdata(table[ng]);

	
}

⌨️ 快捷键说明

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