请问这几个代码什么意思呢!

void init_arm_motors(void) {
/* --------------- Begin Answer to Task 3 Here ------------ */
DDRB |= (1 << PB1);
DDRB |= (1 << PB2);
PORTB &= ~(1 << PB1);
PORTB &= ~(1 << PB2);
TCCR1A = (1<<COM1A1)|(1<<WGM11);
TCCR1B |=(1<<CS11)|(1<<WGM12)|(1<<WGM13);

/* --------------- End Answer to Task 3 Here -------------- */
return;

可以稍微详细一点吗! 谢谢各位了

void init_arm_motors(void)
{
    /* --------------- Begin Answer to Task 3 Here ------------ */
    DDRB |= (1 << PB1);  /* Set the PB1 bit to 1 in DDRB */
    DDRB |= (1 << PB2);  /* Set the PB2 bit to 1 in DDRB */
    PORTB &= ~(1 << PB1); /* Set the PB1 bit to 0 in PORTB */
    PORTB &= ~(1 << PB2); /* Set the PB2 bit to 0 in PORTB */
    TCCR1A = (1 << COM1A1) | (1 << WGM11); /* Set the COM1A1 and WGM11 bits to 1 in TCCR1A. */
    TCCR1B |= (1 << CS11) | (1 << WGM12) | (1 << WGM13); /* Set the CS11, WGM12 and WGM13 bits to 1 in TCCR1B. */
    /* --------------- End Answer to Task 3 Here -------------- */
    return;
}
void init_arm_motors(void) {
/* --------------- Begin Answer to Task 3 Here ------------ */
DDRB |= (1 << PB1);
// 向左偏移一位,然后按位或 》》》 |= 这个符号是值比较值本身
// 例如:
// 先偏移 :PB1 = 255;二进制是 11111111 向左偏移一位 就会变成 11111110 因为 一个字节是8位,向左偏移一位后,就会少一位,内存就会自动向最后补齐一位0
// 再按位或:或位运算就是 比较两个二进制 返回一个结果二进制值,从右向左对其并进行比较,其中对应的二进制位数只要有1的 对应结果值得位置就是 1
// 11011110 第一个值
// 11101110 第二个值
// 11111110 结果值

DDRB |= (1 << PB2);
// 这个和上面得一样

PORTB &= ~(1 << PB1);
// 先向左偏移一位,再按位取反,最后比较两个二进制,按位与 》》》 &= 这个符号是值比较值本身
// 例如:
// 先偏移 :PB1 = 255;二进制是 11111111 向左偏移一位 就会变成 11111110 因为 一个字节是8位,向左偏移一位后,就会少一位,内存就会自动向最后补齐一位0
// 按位取反:就是二进制中位数若是true ,结果值就是false
// 11111110 二进制值
// 0000001 取反得结果值
// 按位与:就是 比较两个二进制 返回一个结果二进制值,从右向左对其并进行比较,其中对应的二进制位数两个值都是1的 对应结果值得位置就是 1
// 11101110 第一个值
// 11111010 第二个值
// 11101010 结果值

PORTB &= ~(1 << PB2);
// 这个和上面的是一样的

TCCR1A = (1<<COM1A1)|(1<<WGM11);
//  (1<<COM1A1) 和(1<<WGM11) 各自先向左偏移,括号是由优先级的,然后再进行 按位或 '|' 比较 (1<<COM1A1) 和(1<<WGM11) 的结果值

TCCR1B |=(1<<CS11)|(1<<WGM12)|(1<<WGM13);
// 这个和上面的是一样的 ,就是最后还要 比较自身 按位或 '|' 进行比较

补充:
DDR-X 方向数据寄存器 设置端口输入输出
PORT-X 端口数据寄存器 设置高低电平
TCCR-X 定时器

void init_arm_motors(void) {
/* --------------- Begin Answer to Task 3 Here ------------ */
DDRB |= (1 << PB1);
//用位操作定义方式定义PORTB1为输入口,只影响PB7这个端口,而不影响到其他的端口。如和DDRB=0x00差不多(将B端口所有的都设置为了输入),但是后者会影响所有端口
DDRB |= (1 << PB2);
//同上设置PORTB2端口
PORTB &= ~(1 << PB1);
//将PORTB的第PB1端口位清除,即设置其输出为0低电平
PORTB &= ~(1 << PB2);
//同上设置PB2端口
TCCR1A = (1<<COM1A1)|(1<<WGM11);
//比较输出,快速PWM(),快速匹配时,OC1A在TOP时置位,电平取反
TCCR1B |=(1<<CS11)|(1<<WGM12)|(1<<WGM13);
//512分频
、、


如有帮助,望采纳 ^.^