|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
大家對於arduino的開發介面應該不陌生但是當你想要寫一個自己想要的功能時,卻又被函式庫侷限了
而且內部底層程式如何作用也不是很清楚
所以我想把我自己寫的程式無私分享給各位希望能多多交流
開發軟體是atmel studio 7
至於用途是我將一台遙控車改成用單晶片控制
並且增加LED2段亮度調整
還有中斷是我看datasheet寫的一定對
#define F_CPU 16000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned int fb=100,i,s,sd ;
unsigned char buffer,step=1,ledmode=0,QQ=0x18,stage;
unsigned int rate=(F_CPU/16/9600)-1;
int main(void)
{
TCCR1A=0;
TCCR1B|=(1<<WGM12)|(1<<CS11)|(1<<CS10)|(0<<CS12);//cpu/256 mode {16000000/256=62500次/秒}{一次=(1秒/62500次)=16us
TCNT1H=(65536-6000)/256; //计数器初值
TCNT1L=(65536-6000)%256;
TIMSK1=(1<<OCIE1A); //timer1 COMPA interrup
.t
DDRB|=(1<<3)|(1<<4);
DDRD|=(1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3);
UBRR0H=rate/256;//baudrate
UBRR0L=rate%256;
UCSR0B=(1<<RXCIE0)|(0<<TXEN0)|(1<<RXEN0);//RX open,RX INTERRUPT
UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);//baudrate F
sei();
while (1)
{
if (ledmode==3)
{
ledmode=0;
}
if (step==0)
{
fb=fb+1;
_delay_ms(10);
if (fb>=100)
{
step=1;
}
}
if (step==1)
{
fb=fb-1;
_delay_ms(10);
if (fb<=10)
{
step=0;
}
}
}
}
ISR(TIMER1_COMPA_vect)
{
cli();
TCNT1H=(65536-fb)/256;
TCNT1L=(65536-fb)%256;
if(ledmode==0)
{
if (stage==0)
{
PORTB=0;
stage=1;
}
if(stage==1)
{
PORTB^=QQ;
}
}
else if(ledmode==1)
{
PORTB=0;
}
else if (ledmode==2)
{
PORTB=0x18;
stage=0;
}
sei();
}
ISR(USART_RX_vect)
{
buffer=UDR0;
if (buffer==0x41)//前進
{
PORTD|=(1<<4);
}
if (buffer==0x42)
{
PORTD&=~(1<<4);
}
if(buffer==0x57)//後退
{
PORTD|=(1<<5);
}
if (buffer==0x58)
{
PORTD&=~(1<<5);
}
if(buffer==0x53)//left
{
PORTD|=(1<<6);
}
if (buffer==0x54)
{
PORTD&=~(1<<6);
}
if (buffer==0x44)//right
{
PORTD|=(1<<7);
}
if (buffer==0X45)
{
PORTD&=~(1<<7);
}
if(buffer==0X05)
{
ledmode=ledmode+1;
}
if (buffer==0X06)
{
PORTD^=(1<<3);
}
} |
|