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

📄 ad2.c

📁 这是关于AVR单片机学习的初步开发
💻 C
字号:
//Designed by Alf
//用于实现AD转换,转换结果由数码管显示,需要闭合SW5、SW6;以及SW8的1脚(AD0),而后旋转AD1电位器即可看到;
//AD将电位器分得的0~5V电压转换成了0~1023;
//ICC-AVR application builder : 2005-3-8 下午 04:53:49
// Target : M8
// Crystal: 11.059Mhz

#include <iom8v.h>
#include <macros.h>

//lednum全局变量
char lednum = 0;
char lednum1 = 0;
char lednum2 = 0;
char lednum3 = 0;
char lednum4 = 0;
//码表
char num[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


void port_init(void)
{
 PORTB = 0xFF;
 DDRB  = 0xFF;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x7E;
 PORTD = 0x00;
 DDRD  = 0xFF;
}

//TIMER0 initialisation - prescale:1024
// WGM: Normal
// desired value: 20mSec
// actual value: 19.908mSec (0.5%)
void timer0_init(void)
{
  TCCR0 = 0x00; //stop
 TCNT0 = 0x29; //set count
 TCCR0 = 0x04; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
 TCNT0 = 0x29; //reload counter value
 TCCR0 = 0x04; //start timer
 
 PORTB |= 0x30;
 PORTC |= 0x30;
 if(lednum == 0)	//更新PB4数码管;
 {	PORTB &= ~0x10;
	PORTD = lednum4;
 }
 else if(lednum ==1)	//更新PB5数码管;
 {	PORTB &= ~0x20;
	PORTD = lednum3;
 }
 else if(lednum ==2)	//更新PC4数码管;
 {	PORTC &= ~0x10;
	PORTD = lednum2;
 }
 else 	//更新PC5数码管;
 { 	PORTC &= ~0x20;
	PORTD = lednum1;
 }

lednum++;
while(lednum >= 4) lednum = lednum - 4;
 
}

//call this routine to initialise all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer0_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x01; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialised
}




//自定义函数
void delay(void)
{
 unsigned int i,j,z;
 for(i=0;i<10000;i++);
 {	for(j=0;j<10000;j++)
 	{	for(z=0;z<100;z++);}
 }
}

void main(void)
{
  char i;
  unsigned int data=0,temp;
  char num1=0,num2=0,num3=0,num4=0;
  init_devices();
 
 for(i=0;i<=9;i++)
 {	lednum1 = num[i];
 	delay();
 } 
 
 lednum1 = num[0];
 lednum2 = num[0];
 lednum3 = num[0];
 lednum4 = num[0];
 
 delay();
 delay();
 while(1)
 {	ADMUX = 0x40;	  //选择通道零
 	ADCSRA = 0xC7;
	
	while((ADCSRA | 0x10)==0);
	ADCSRA &=~0x10;
	
	data = ADCL;
	temp =ADCH<<8;
	data = data +temp;
	
	//num4 = data/1000;
	//num3 = (data- data/1000*1000)/100;
	//num2 = (data-data/100*100)/10;
	//num1= data-data/10*10; 
	if(data <=512)	   //逆时针
	{	lednum4 = 0x39;	   	//显示方向
		
		data = 511 - data;
		num3 = data/100;
		num2 = (data-data/100*100)/10;
		num1= data-data/10*10;
	} 
	
	else	  		  //顺时针
	{	lednum4 = 0x0F;	  //显示方向		  
		
		data = data-512;
		
		num3 = data/100;
		num2 = (data-data/100*100)/10;
		num1= data-data/10*10;
	}
	
	
	//lednum4 = num[num4];
	lednum3 = num[num3];  
	lednum2 = num[num2];
	lednum1 = num[num1];
	
	ADCSRA |= 0x40;    
	delay();
	
 } 
}

⌨️ 快捷键说明

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