標(biāo)題: 我用51單片機(jī)寫(xiě)的波形發(fā)生器 可以輸出正弦波 但是不能調(diào)整頻率 難道是我的中斷... [打印本頁(yè)]

作者: happysunshine    時(shí)間: 2013-6-18 13:04
標(biāo)題: 我用51單片機(jī)寫(xiě)的波形發(fā)生器 可以輸出正弦波 但是不能調(diào)整頻率 難道是我的中斷...
#include<reg52.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define fosc 12000000
#define all 65535
float sindatar;
sbit hong=P2^3;
sbit lan=P2^5;
sbit huang=P2^7;
uint VM=2500,b=0;
uint FREQ=1,j=0;
void delay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=1;y>0;y--);
}

/**********************************************
                計(jì)算正弦波數(shù)據(jù)
********************************************/
void getsin(uchar x)
{   
    sindatar=((sin(6.28*x/256)+1)/2.0)*VM*0.051;
P3=(uchar)sindatar;
delay(1);
}
void main()
{
   TH1=(all-fosc/12/256/FREQ)/256;
   TL1=(all-fosc/12/256/FREQ)%256;
   ET1=1;
   EA=1;
   TR1=1;
   while(1)
   {
       n getsin(j);
   }
}
void timer1() interrupt 3 using 3
{
   TH1=(all-fosc/12/256/FREQ)/256;
   TL1=(all-fosc/12/256/FREQ)%256;
   j++;
   if(j==256)
   j=0;
}



這是我的程序,麻煩幫忙解答一下為什么。  此時(shí)示波器上的顯示的周期是2s,這跟我的設(shè)置的頻率的FREQ=1有點(diǎn)不對(duì)。  求解釋一下。

作者: heicad    時(shí)間: 2013-6-19 00:51
有高手知道嗎
作者: happysunshine    時(shí)間: 2013-6-19 01:02
游客 110.205.68.x 發(fā)表于 2013-6-19 00:58
我看看

謝謝  我真的調(diào)了好多天了  
作者: happysunshine    時(shí)間: 2013-6-19 01:04
游客 110.205.68.x 發(fā)表于 2013-6-19 00:58
我看看

還是沒(méi)有調(diào)試出來(lái)
作者: ahshmj    時(shí)間: 2013-6-19 11:00
本帖最后由 ahshmj 于 2013-6-19 11:09 編輯

你有必要搞這么復(fù)雜么?你這樣,中斷函數(shù)的運(yùn)行過(guò)程就超過(guò)了中斷定時(shí),怎能會(huì)正常?
不信,你直接將你需要的數(shù)值填寫(xiě)進(jìn)去試一試!
“   TH1=(all-fosc/12/256/FREQ)/256;
   TL1=(all-fosc/12/256/FREQ)%256;

如下改試一試,如果是值不對(duì)你自己計(jì)算一下:
   TL1=0XBD;
   TH1=0XF0;

正弦波發(fā)生器,如果要求嚴(yán)格的話,定時(shí)部分最好使用匯編。
作者: ahshmj    時(shí)間: 2013-6-19 11:06
本帖最后由 ahshmj 于 2013-6-19 11:10 編輯

定時(shí)需要再延長(zhǎng)一些,中間的計(jì)算過(guò)程耗時(shí)多。如果不能延長(zhǎng),就要使用更高的晶振。否則這個(gè)程序調(diào)不正常。
作者: happysunshine    時(shí)間: 2013-6-19 13:12
ahshmj 發(fā)表于 2013-6-19 11:00
你有必要搞這么復(fù)雜么?你這樣,中斷函數(shù)的運(yùn)行過(guò)程就超過(guò)了中斷定時(shí),怎能會(huì)正常?
不信,你直接將你需要 ...

恩恩  謝謝啊   是要開(kāi)始學(xué)學(xué)匯編了
因?yàn)槲沂且{(diào)這個(gè)波形發(fā)生器頻率的   假如不用這種方法  還可以有其他的方法么?
真的謝謝您啊
作者: happysunshine    時(shí)間: 2013-6-19 13:14
ahshmj 發(fā)表于 2013-6-19 11:06
定時(shí)需要再延長(zhǎng)一些,中間的計(jì)算過(guò)程耗時(shí)多。如果不能延長(zhǎng),就要使用更高的晶振。否則這個(gè)程序調(diào)不正常。

我當(dāng)時(shí)是想通過(guò)這種計(jì)算來(lái)控制頻率的  我是不能延時(shí)太長(zhǎng)了   因?yàn)橐蟛ㄐ伟l(fā)生器的頻率最高要1k  HZH
作者: ahshmj    時(shí)間: 2013-6-19 15:38
忘了告訴你了:
你沒(méi)有設(shè)置定時(shí)器的工作模式,就成了默認(rèn)的13位計(jì)數(shù)/定時(shí),需要加上一句:   TMOD = 0x10; 當(dāng)然你不加這一句也行,13位的。但是初裝值不一樣。
作者: happysunshine    時(shí)間: 2013-6-20 13:55
ahshmj 發(fā)表于 2013-6-19 15:38
忘了告訴你了:
你沒(méi)有設(shè)置定時(shí)器的工作模式,就成了默認(rèn)的13位計(jì)數(shù)/定時(shí),需要加上一句:   TMOD = 0x10; ...

好的  好的  謝謝
作者: livingliving    時(shí)間: 2015-4-7 19:02
不懂,但是還是要頂,安撫樓主受傷心靈,每一個(gè)新手都是痛苦的開(kāi)始,快樂(lè)的結(jié)局




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1