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

📄 051211-28.c

📁 小车程序
💻 C
字号:
#include <mega16.h>
#include<stdio.h>
#include<delay.h>
#define DCMOTORA1 PORTD.0
#define DCMOTORA2 PORTD.1
#define DCMOTORB1 PORTD.2
#define DCMOTORB2 PORTD.3 
#define SEGSCAN   PORTB
#define BUTTON    PINA          /*define PA0 STOP,PA1 UP,PA2 DOWN,PA3 LEFT,PA4 RIGHT,PA5 SPEED--,PA6 SPEED++ */
/*PORTD.4---speedB
PORTD.5---speedA
PORTB---SEG7
*/
unsigned char A=2,B=2,Speed=200;     /*电机B是左电机*/
unsigned char dispchar[] = {0x92,0x8e,0x83,0xc7,0x8f}; 
unsigned char dispnum[] = {0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char Direction=0;
unsigned char SegCount;
void dcmotorAset(unsigned char speed,unsigned char dir)//电机a的方向速度控制函数:speed为0~255,表示速度。dir为方向:0 正转,1 反转,2 停转
{
	OCR1A=speed;
	switch (dir){
	case 0:
		{DCMOTORA1=1;
		DCMOTORA2=0;
		break;}
	case 1:
		{DCMOTORA1=0;
		DCMOTORA2=1;
		break;}
	case 2:
		{DCMOTORA1=0;
		DCMOTORA2=0;
		break;}
	default:;     
	}           
	
}    
void dcmotorBset(unsigned char speed,unsigned char dir)//电机b的方向速度控制函数:speed为0~255,表示速度。dir为方向:0 正转,1 反转,2 停转
{
	OCR1B=speed;
	switch (dir){
	case 0:
		{DCMOTORB1=1;
		DCMOTORB2=0;
		break;}
	case 1:
		{DCMOTORB1=0;
		DCMOTORB2=1;
		break;}
	case 2:
		{DCMOTORB1=0;
		DCMOTORB2=0;
		break;} 
	default:;  
	} 
	
}
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)          //显示中断函数
{
	
	SegCount++;
	SEGSCAN.4=0;				 //准备锁存        
	SEGSCAN.4=1;				//锁存数据 
	if (SegCount==1) {
		SEGSCAN=(SEGSCAN&0xF0)|0b0111;
        SPDR=dispnum[Speed%10]; 
	}else{  
		if (SegCount==2) {  
			SEGSCAN=(SEGSCAN&0xF0)|0b1110; 
			SPDR=dispnum[(Speed%100)/10];
		}else{
			if (SegCount==3){     
				SEGSCAN=(SEGSCAN&0xF0)|0b1101;
				SPDR= dispnum[Speed/100];
			}else{       
				if(SegCount==4){  
					SEGSCAN=(SEGSCAN&0xF0)|0b1011; 
					SPDR=dispchar[Direction];
					SegCount=0;       
				}
			}
		}
	}
	
	
	
	
}    
void buttondetect(void)
{
	if ((BUTTON&0x01)==0) {               //stop
		A=2;B=2;
		dcmotorAset(Speed,A);
		dcmotorBset(Speed,B);  
		Direction=0;
		PORTC=0x03;
		delay_ms(250);
		PORTC=0x00; 
	}
	
	if  ((BUTTON&0x02)==0){            //up
		A=0;B=0;		
		dcmotorAset(Speed,0);
		dcmotorBset(Speed,0);
		Direction=1; 
		PORTC=0x00; 
	  	}
	if  ((BUTTON&0x04)==0){            //down
		A=1;B=1;			
		dcmotorAset(Speed,A);
		dcmotorBset(Speed,B);
		Direction=2;
		PORTC=0x00;    
	  	}                                              
	if  ((BUTTON&0x08)==0){           //left
		A=0;B=1;
		dcmotorAset(Speed,A);
		dcmotorBset(Speed,B);   
		Direction=3;
		PORTC=0x02;   
	} 
	if  ((BUTTON&0x10)==0){            //right
		A=1;B=0;			
		dcmotorAset(Speed,A);
		dcmotorBset(Speed,B);
		Direction=4; 
		PORTC=0x01;    
	}
	if( (BUTTON&0x20)==0){           //speeddown
		while((BUTTON&0x20)==0)
			delay_ms(5);    //按键消抖
		Speed=(Speed>10 ? Speed-10:0); 
		dcmotorAset(Speed,A);
		dcmotorBset(Speed,B);     
	} else{
		if( (BUTTON&0x40)==0){       //speedup
			while((BUTTON&0x40)==0)
				delay_ms(5);      //按键消抖
			Speed=(Speed<245 ? Speed+10:255);  
			dcmotorAset(Speed,A);
			dcmotorBset(Speed,B);
		}  
	} 
}
void main(void)
{
	
	// Port A initialization
	// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
	// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P 
	PORTA=0xff;
	DDRA=0x00;
	
	// Port B initialization
	// Func7=out Func6=In Func5=out Func4=out Func3=out Func2=out Func1=out Func0=out 
	// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
	PORTB=0x00;
	DDRB=0xBf;
	
	// Port C initialization
	// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
	// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
	PORTC=0x00;
	DDRC=0x03;
	
	// Port D initialization
	// Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
	// State7=T State6=T State5=0 State4=0 State3=1 State2=1 State1=1 State0=1 
	PORTD=0x0F;
	DDRD=0x3F;
	// Timer/Counter 1 initialization
	TCCR0=0x00;
	TCNT0=0x00;
	OCR0=0x00;
	// Timer/Counter 1 initialization
	// Clock source: System Clock
	// Clock value: 57.600 kHz
	// Mode: Fast PWM top=00FFh
	// OC1A output: Non-Inv.
	// OC1B output: Non-Inv.
	// Noise Canceler: Off
	// Timer 1 Overflow Interrupt: off
	// Input Capture Interrupt: off
	// Compare A Match Interrupt: Off
	// Compare B Match Interrupt: Off
	TCCR1A=0xA1;
	TCCR1B=0x43;
	TCNT1H=0x00;
	TCNT1L=0x00;
	ICR1H=0x00;
	ICR1L=0x00;
	OCR1AH=0x00;
	OCR1AL=0x00;
	OCR1BH=0x00;
	OCR1BL=0x00;
	// Timer/Counter 2 initialization
	// Clock source: System Clock
	// Clock value: 57.600 kHz
	// Mode: Normal top=FFh
	// OC2 output: Disconnected
	ASSR=0x00;
	TCCR2=0x04;
	TCNT2=0x00;
	OCR2=0x00;
	
	// External Interrupt(s) initialization
	// INT0: Off
	// INT1: Off
	// INT2: Off
	MCUCR=0x00;
	MCUCSR=0x00;
	
	// Timer(s)/Counter(s) Interrupt(s) initialization
	TIMSK=0x40;
	
	// Analog Comparator initialization
	// Analog Comparator: Off
	// Analog Comparator Input Capture by Timer/Counter 1: Off
	ACSR=0x80;
	SFIOR=0x00;
	// SPI initialization
	// SPI Type: Master
	// SPI Clock Rate: 2*921.600 kHz
	// SPI Clock Phase: Cycle Half
	// SPI Clock Polarity: Low
	// SPI Data Order: MSB First
	SPCR=0x50;
	SPSR=0x01;
	// Global enable interrupts 
 #asm("sei")
	dcmotorAset(Speed,2);
	dcmotorBset(Speed,2);
	Direction=0;	
	while (1)
		buttondetect();
#asm("cli");
	
	
}


⌨️ 快捷键说明

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