gpt4 book ai didi

c - PIC 16F628A 扬声器声音

转载 作者:行者123 更新时间:2023-11-30 17:59:06 25 4
gpt4 key购买 nike

我试图理解this code :

#include <pic.h>
#include "delay.h"

#define brisi_flag timer_flag=0

unsigned char timer;
unsigned char impuls;
unsigned char ton_koji_ne_svira;
static bit disable @ (unsigned)&PORTA*8+4;
static bit izlaz @ (unsigned)&PORTA*8+1;
static bit izlaz_inv @ (unsigned)&PORTA*8+0;
static unsigned char stanja @ 0x2e;
static bit stanje_izlaza @ (unsigned)&stanja*8+1;
static bit timer_flag @ (unsigned)&INTCON*8+2;

void
DelayMs_2(unsigned char cnt)
{
unsigned char i;
do { asm("CLRWDT");
if(ton_1)
return;
i = 4;
do {
DelayUs(250);
} while(--i);
} while(--cnt);
}

void
DelayMs(unsigned char cnt)
{
unsigned char i;
do { asm("CLRWDT");
i = 4;
do {
DelayUs(250);
} while(--i);
} while(--cnt);
}

void ton_1_2(unsigned char onaj_drugi_ton)
{
izlaz=0;
izlaz_inv=1;
stanje_izlaza=0;
TMR0=timer;
ton_1_2_start:
brisi_flag;
disable=0;
ton_1_2_sviranje:
while(timer_flag==0)
{
if((TMR0-timer)>=impuls)
{izlaz=0;
izlaz_inv=0;
}
}
brisi_flag;
TMR0=timer;
if(stanje_izlaza==0)
izlaz_inv=1;
else
izlaz=1;
stanje_izlaza=stanje_izlaza+1;
if((PORTA&0x0c)==onaj_drugi_ton)
return;
asm("CLRWDT");
goto ton_1_2_sviranje;
}

void main()
{
CMCON=0x07;//portA su normalni ulazi (za 16F628A)
TRISA=0x0c;
TRISB=0xff;
disable=1;
OPTION=0x81; //WDT na 18 msec, preset TMR0 sa 4

izlaz=0;
izlaz_inv=0;

timer=107;
impuls=0x1d;

ton_1_2(ton_koji_ne_svira);
}

该程序在扬声器上生成800 Hz声音。我不明白如何计算频率(它必须是带有变量 impulstimer 的东西)。此代码适用于 PIC16F628A,其外部振荡器设置为 4Mhz

最佳答案

这是我对代码的理解。

定时器从 107 开始。由于定时器中断在溢出时触发,因此周期为 256-107 = 149 个时钟周期。在每个周期内,输出在 IMPULS=29 个时钟周期后关闭。因此,占空比为 29/149=19%。此外,脉冲在两个引脚之间交替。

OPTION=0x81 为定时器设置 1:4 预分频器。因此,如果时钟以 4MHz(周期 0.25μs)运行,则定时器以 1MHz(周期 1μs)滴答。因此,149 个刻度的周期应等于 149μs,对应于 6711Hz 的频率。添加每次启动定时器所需的时间,实际频率略低。

你确定频率是800Hz吗?你测量了吗?也许处理器确实以 500Hz 运行,或者某处存在全局 1:8 预分频器。

关于c - PIC 16F628A 扬声器声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11740020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com