#include <reg52.h>
#define uint unsigned int
uint tt1;
sbit pluse=P2^0;
void init()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)/256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init();
while(1)
{
if(tt1==1)
{
TR0=0;
tt1=0;
pluse=~pluse;
TR0=1;
}
}
}
void time1() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)/256;
tt1++ ;
}
上面的程序是我写的产生频率为10000Hz的脉冲信号;在51单片机的最小系统上跑通了。
现在的问题是,我想能实现输出一个频率按照正弦变化的脉冲信号,即:y=A*sin(t);A就是最大频率10000Hz,t是时间,y是输出,就是说随着时间变化,输出是正弦变化的脉冲信号。
不知道怎么搞了,郁闷死了,跪求各位牛人不吝赐教!谢谢!
其实我就是想波形幅值为5V的,作为步进电机的脉冲信号。只是让频率是正弦变化的,这样电机的速度就可以正弦变化了,呵呵。也就是说无论什么频率输出,输出的都是电压为5V的方波信号,只是相同时间内(dt)输出的方波个数不同,这个方波个数是正弦变化的。
还想请教您有没有可能啊!
明白你的问题了,这个简单。
1、首先需要自由控制方波频率,你可以设置一个全局变量,例如T,timer1中断函数装载初值时,写(65535-T)/256,这样你就可以通过更改T的值来实时改变方波频率,T越大,频率越低(这个你应该明白)。
2、第二步离散的时间为单位(例如0.1S)取得一系列SIN值(还是举个例子吧,例如sin0.01、sin0.02、sin0.03、sin0.04···等等),每一个sin值都与上面的T建立一次函数关系就好了。怕你不懂,再举例,假设在第0S时,T的值=f(sin0.01),那么当第0.1S时,你让单片机重新给T赋值,T=f(sin0.02),以此类推。上句话中f是函数符号,T与sin显然是斜率为负值的一次函数关系。