单片机里面,点唱机用Arduino,用proteus电路原理图应该怎么画
不知道你这个问题是否已经解决, 如果还没有解决的话:在系统时钟为16MHz、预分频器为256时,创建500ms延时的定时器1的值计算公式如下:
Timer 1 speed = 16Mhz/256 = 62.5 Khz
Pulse time = 1/62.5 Khz = 16us
Count up to = 500ms / 16us = 31250
bool LED_STATE = true;
int ledPin = 7;
void setup() {
pinMode(ledPin, OUTPUT); // 设置引脚为输出模式
cli(); // 停止中断直到完成设置
/*第一步:重置控制寄存器以确保我们从禁用所有内容开始。*/
TCCR1A = 0; //重置整个TCCR1A寄存器
TCCR1B = 0; //重置整个TCCR1B寄存器
/*第二步:通过更改 CS10、CS12和CS12位将预标量设置为所需值. */
TCCR1B |= B00000100; // 设置 CS12为1,得到预分频值= 256
/*第三步:我们在寄存器OCIE1A上启用比较匹配模式*/
TIMSK1 |= B00000010; // 将OCIE1A设置为 1,启用比较匹配寄存器A
/*第四步:将寄存器A的值设置为31250*/
OCR1A = 31250; // 最后将比较寄存器A设置为这个值
sei(); // 启用中断
}
void loop() {
// put your main code here, to run repeatedly:
}
// 计时器中断服务函数
ISR(TIMER1_COMPA_vect){
TCNT1 = 0; // 将计时器设置回 0,以便为下一次中断重置
LED_STATE = !LED_STATE;
digitalWrite(ledPin,LED_STATE);
}
上面代码实现了每 500 毫秒中断一次。 每次触发中断,我们就去相关的ISR向量。 由于Arduino UNO有 3 个计时器,因此有 6 个 ISR 向量,每个计时器两个,它们具有以下名称:TIMER1_COMPA_vect