在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 8140|回复: 0

[DIY] arduino單晶片底層程式

[复制链接]
发表于 2017-10-27 13:44:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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);
    }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-20 00:14 , Processed in 0.014969 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表