#include<iom16v.h> #include<macros.h> #pragma interrupt_handler exit:2 //定义外部中断0的中断处理函数 #pragma interrupt_handler time:9 unsigned int freq[] ={262, 294, 330, 349, 392, 440, 494}; unsigned int current_freq = 0; void exit(void) { // 按键1被按下 if(!(PINA & 0b00000001)) { current_freq = 0; } // 按键2被按下 if(!(PINA & 0b00000010)) { current_freq = 1; } // 按键3被按下 if(!(PINA & 0b00000100)) { current_freq = 2; } // 按键4被按下 if(!(PINA & 0b00001000)) { current_freq = 3; } // 按键5被按下 if(!(PINA & 0b00010000)) { current_freq = 4; } // 按键6被按下 if(!(PINA & 0b00100000)) { current_freq = 5; } // 按键7被按下 if(!(PINA & 0b01000000)) { current_freq = 6; } } void time(void) { OCR1A = 2000000 / freq[current_freq]; // 计算比较匹配值 PORTB ^= 0b00000001; // 翻转PB0的输出电平 } void main(void) { DDRA = 0x00; PORTA = 0xFF; DDRD = 0x00; PORTD = 0xFF; GICR = 0b01000000;// 开启INT0中断 SEI(); // 开启全局中断 TIMSK = 0b00000100;// 开启T/C1的比较匹配中断 TCCR1A = 0b00100000;//与下面构成WGM1000,模式8 TCCR1B = 0b00010001;//设置T/C1的计数脉冲源为4MHz的系统时钟,最后三位001证明系数1 while(1) { ; } }这代码的问题在哪里
时间: 2023-06-17 18:02:14 浏览: 387
iom16v.h ATmega16的头文件
3星 · 编辑精心推荐
有以下几个问题:
1. 缺少头文件`<stdint.h>`,用于定义`uint8_t`等数据类型。
2. 缺少头文件`<avr/io.h>`,用于定义AVR芯片的寄存器名和位域操作函数。
3. 缺少头文件`<avr/interrupt.h>`,用于定义中断处理函数和相关宏。
4. 中断处理函数`exit`和`time`的参数应该为`void`,而不是`void exit(void)`和`void time(void)`。
5. 中断处理函数的宏定义应该使用`__interrupt`,而不是`#pragma interrupt_handler`。
6. 在使用`PORTB`之前,需要将`DDRB`的相应位设置为1,以将其配置为输出模式。
7. 在使用`OCR1A`之前,需要将`TCCR1A`的相应位设置为1,以启用PWM模式。
8. 在`TCCR1B`的最后三位应该是010,而不是001,以选择分频系数为1。
9. 在主函数中的空循环`while(1)`可以用`for(;;)`或`while(true)`代替。
阅读全文