📄 051211-28.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 + -