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

📄 main.c

📁 AVR单片机六路ADC采集与七段数码管显示采集值
💻 C
字号:
#include <iom8v.h>
#include <macros.h>

#define F_CPU	   8000000	//主频
#include "delay.h"

#define MAXCH      16		//总通道数
#define MAXSCALECH 6		//比例通道数

//数码管显示值
unsigned char SEG7[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

//通道值
unsigned char PADV[MAXCH] = {-1};
unsigned char CADV[MAXCH] = {0};

unsigned char ScaleCHindex  = 0;

//以下定义中断处理程序
#pragma interrupt_handler OnTimer0:iv_TIMER0_OVF
void OnTimer0(void)
{   unsigned char adv;
    ADMUX = 0x20 + ScaleCHindex;	  //左对齐,只取高位

	ADCSRA|=(1<<ADSC);	  	  //启动ADC
	Delay_US(60);			  //第一次结果抛弃
	ADCSRA|=(1<<ADSC);	  	  //启动ADC
	Delay_US(60);
	adv = ADCH;

	if(adv == 0xFF)			adv = 0xFE;
	else if(ADCH == 0x00)	adv = 0x01;
		
	CADV[ScaleCHindex] = adv;

	ScaleCHindex++;
	if(ScaleCHindex >= MAXSCALECH) ScaleCHindex = 0;
	
	//去抖
	adv = PIND;
	Delay_US(50);
	if(adv != PIND) return; 
	
	CADV[MAXSCALECH]   = (PIND & 0x10) ? 0xFF : 0x00;  
	CADV[MAXSCALECH+1] = (PIND & 0x20) ? 0xFF : 0x00;
	CADV[MAXSCALECH+2] = (PIND & 0x40) ? 0xFF : 0x00;
	CADV[MAXSCALECH+3] = (PIND & 0x80) ? 0xFF : 0x00;

    //TCNT0 = 0xFF;
}

//初始化
void init_devices(void)
{
    //内部RC校准
	//OSCCAL = 0x7D;
	unsigned int baud = 9600;
	
    CLI();
    
    //端口初始化
	PORTB = 0xFF;
	DDRB  = 0xFF;
	
	//比例通道
	PORTC = 0x00;
	DDRC  = 0x00;
	
	//开关通道
	PORTD = 0xF0;
	DDRD  = 0x0F;
    
    //定时器初始化
    TCCR0 = 0x00; //禁止计时
    TCNT0 = 0x0F; //定时器时长
    TCCR0 = 0x05; //启动定时器 CLK/1024
    
    //ADC初始化
    ADCSR = 0x00; //禁止转换
    ADMUX = 0x20; //多路复用选择寄存器 E0 内部参考源,左对齐(只需高八位),通道0
		  		  // REFS1 RESF0(参考源) ADLAR(左对齐) 保留 MUX3 MUX2 MUX1 MUX0
    ACSR  = 0x80; //模拟比较器控制与状态寄存器
    ADCSR = 0x83; //10001011  83 禁止中断,使用查询方式 
		  		  //ADEN(AD允许) ADSC(AD开始) ADFR(连续) ADIF(中断标志) ADIE(中断允许) ADPS(预分频,三位)
	
    //UART初始化
	UBRRH = (unsigned char)(baud>>8);
	UBRRL = (unsigned char)(baud);
	UCSRB = (1<<TXEN);
	UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ8);
	
    //控制寄存器
    MCUCR = 0x00;
    GICR  = 0x00;
    TIMSK = 0x01; //充许Timer0中断
    
    SEI();
}

main()
{	  
	int i = 0,j = 0;
    	
    init_devices();
	
	while(1)
	{	
		for(j=0;j<MAXCH;j++)
    		if(PADV[j] != CADV[j])
			{   i = j;
			    PADV[j] = CADV[j];
			}
		
		//显示低位
   		PORTD = 0x01;
   		PORTB = SEG7[CADV[i] & 0x0F];
		Delay_MS(20);
   		
		//显示高位
       	PORTD = 0x02;
   		PORTB = SEG7[CADV[i] >> 4];
       	Delay_MS(20);

		//通道值
   		PORTD = 0x08;
   		PORTB = SEG7[i];
       	Delay_MS(20);
	}
}

⌨️ 快捷键说明

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