㈠ 51單片機怎樣採集正弦波的頻率
用比較器將正弦波變為方波,用單片機中的T0或T1口配合測頻率,T0可以用來計時,T1用來計算脈沖的個數,當定時1時間到了,計算T1的脈沖個數。calc()函數就是計算頻率的函數。
#include "reg51.h"
#define uchar unsigned char
uchar disp[8]={0,0,0,0,0,0,0,0};
uchar T0count,T1count;
void delay(void)
{
uchar i;
for(i=250;i>0;i--);
}
void display()
{
//uchar i,j,k=0x80;
uchar dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar i,k;
k=0x80;
for(i=0;i<8;i++)
{
P2=0;
P0=dispcode[disp[i]];
P0=~P0;
P2=k;
k=k>>1;
delay();
}
P2=0;
}
void calc()
{
uchar i;
long frequency;
frequency=(T0count*256+TH0)*256+TL0;
for(i=7;i>0;i--)
{
disp[i]=frequency%10;
frequency=frequency/10;
}
disp[0]=frequency;
}
void init()
{
T0count=0;
T1count=0;
TH0=0;
TL0=0;
}
void main()
{
init();
TMOD=0x15;
TH1=(65536-5*110592/12)/256;
TL1=(65536-5*110592/12)/256%10;
ET1=1;
ET0=1;
EA=1;
TR1=1;
TR0=1;
//以下四句的作用是在P1.0引腳上形成1000Hz的脈沖,用導線連接到P3.4作為測試用,如果是AT89S51,則四句不用。將其中
//高8位和低8位的初始值更改後可輸出不同頻率的脈沖。
/*
T2MOD=0x2;
RCAP2H=245;
RCAP2L=74;
TR2=1;
*/
while(1)
{
display();
}
}
void time0() interrupt 1
{
T0count++;
}
void time1() interrupt 3
{
TH1=(65536-5*110592/12)/256;
TL1=(65536-5*110592/12)/256%10;
if(T1count==19)
{
calc();
init();
}
else T1count++;
}
㈡ 我現在用了個51單片機要怎麼樣才能弄出個正弦波 不加DA轉換晶元的情況下可以辦到嗎
很簡單啊,單片IO輸出1的時候接近電源,輸出0的時候接近0V,取3個以上的IO口,假如IO全輸出1的時候那麼這個埠是電源電壓,每個I0用不同的電阻分壓,依次將IO值1,就可以得到上升的電平。依次值0就是下降的電平,輸出用電容平滑下,就是正弦波了。
㈢ 51單片機控制DAC0832產生正弦波,如何用定時器改變頻率,求代碼!
可以用一個定時器中斷,在中斷服務程序裡面,直接把對應的正弦采樣數據置入P1口,通過修改定時器的中斷間隔,達到調整輸出頻率的目的;
假設你的采樣數據的原始采樣率為1KHz, 被采樣正弦波頻率為100Hz,當Timer中斷間隔為1ms時,DAC那裡輸出處理後輸出即為100Hz, 如果中斷間隔為500us,輸出就是200Hz
static unsigned char byIndex=0;
中斷函數裡麵包含如下兩句
P1 = Sin[byIndex++];
byIndex &= 0x7f;
㈣ 怎麼用51單片機編寫正弦波,有程序的更好,謝謝!!!
方法1: 用PWM功能,定時器中斷,定時按照正弦波的規律數據不斷改變PWM脈寬,PWM輸出引腳用100K和104電容兩級濾波,最後用運放跟隨輸出一下,得到近似正弦波。
方法2: 單片機+DA轉換器,同樣定時器中斷,按正弦波數據不斷刷新DA數據,使DA輸出正弦電壓。改變定時器中斷時間,即可改變頻率,注意DA器件的速度要足夠快才行。