#include<reg52.h>
#include<absacc.h>
#define DAC0832 XBYTE[0x7fff]
sbit dawr=P3^6; //DA写数据
sbit csda=P2^7; //DA片选
unsigned char code sin[128]={64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,
109,111,113,115,117,118,120,121,123,124,125,126,126,
127,127,127,127,127,127,127,126,126,125,124,123,121,
120,118,117,115,113,111,109,106,104,102,99,96,94,91,
88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39,
36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,
1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23,
25,28,31,33,36,39,42,45,48,51,54,57,60};
void delay()
{
unsigned char i;
for(i=0;i<=30;i++)
{};
}
void main(void)
{
unsigned char j;
csda=0;
dawr=0;
while(1)
{
for(j=0;j<128;j++)
DAC0832 = sin[j];
delay();
}
}
根据DAC0832 = sin[j];可知,数组值直接赋给了DAC,数组中,最大值为127,最小值为0,这就是幅值 0~127。如果要电压幅值,这与电路有关。设数据255(0xFF)对应输出5V,数据0对应输出0V,则0~127对应的电压幅值为0~2.5V。
频率决定于delay()的延时量,这个又与单片机的时钟有关,所以看你的程序是确这不了的。
另外:
===============================
(1)SIN[ ]数组的值 可以用EXCEL简单地算出。如图,A2开始以0,1,2,3,4....向下填充直到359,在B2输入公式(如图),公式向下复制,直到B360。算出的值就是上面数组SIN[]的值。这个更精确。
(2)然后
for(j=0;j<360;j++){
DAC0832 = sin[j];
delay();
}
可得正弦波输出。但频率用delay()不精确,只能设试确定。
(3)可以用定时中断。中断时间为1/(360*1000)秒。每次中断程序中:
DAC0832 = sin[j++];
if(j==360)j=0;
这就可得1000Hz的正弦波。
用51单片机产生正弦波,那个数据表怎么得到的?谢谢!
这个表是预先算好的,就是将标准正弦波上移1\/2幅值后模256。三角波和锯齿波也可以按相同方法计算得到对应的数值表。对一个周期取样256次,也就是说第0个取样点的弧度是0,第一个取样点的弧度值就是pi\/128,第二个取样点的弧度为(pi\/128)*2,依次类推。测峰峰值为256,所以f(x) = sin(x)*1...
用51单片机产生正弦波的查表方法
单相的从正弦涵数中从0度到90度范围中均匀取出n个数再用256的模转换成表格数。三相的只需从0度到30度取,可这会n要是三的公倍数。后在运行中按你的频率的不同从该表格中抽取就行了。这就是单牌机由PWM产生的正弦波中的那时间段的数。
51单片机输出100Hz正弦波
用一个正弦数组(组数里装的是sin x的值,x的值正比于数组下标),然后把数组的值送给DAC,那么DAC输出的就是正弦波了
51单片机256个点怎么产生1000hz的正弦波
送数的频率是256KHz,用15.36M的晶体,一周期是60时钟,5个指令周期 查表、输出、加1,返回。有可能够 用4周期的单片机(华邦77\/78系列)是15个指令周期 单周期的单片机(C8051Fxxx)是60个指令周期
51单片机产生锯齿波变方波汇编语言程序
让人给你现编这不太现实,我的空间里面有我单片机课设的汇编程序,调试通过的,是产生正弦波,三角波,方波的程序,可以调节幅值。使用的单片机就是51单片机,你可以参考下。http:\/\/hi.baidu.com\/bettergreen\/home
用51单片机控制AD采集正弦波信号,并把其频率计算出来的程序。
51好久没弄过了,给你个思路吧,因为51对浮点型运算较慢,不适合使用傅里叶变换,可以这样 定义一个数组v[3]={0};每次采集一个电压放到数组的最后一位;然后判断当v[0]<v[1]<v[2]时启动计时器进行 计时,否则{v[0]=v[1];v[1]=v[2];} 重复这个过程。当又一次v[0]<v[1]<v[2]...
基于STC51系列单片机的SPWM波形实现,程序如何编写?急急急急
\/\/ 正弦波频率50Hz \/\/ 高电平的宽度Tpw = Tt\/2*(1+Msimwt)\/\/ 低电平的宽度Tpw = Tt\/2*(1-Msimwt)\/\/ Tt周期 \/\/ T2是产生SPWM波形,并从P1^1输出,用导线连接到P3.4作为测试频率使用。\/\/ T1工作在定时方式1,定时1s \/\/ T0工作在计数方式,对输入的脉冲进行计数,溢出产生中断。
51单片机C语言怎样编写用DA可以出现正弦波
将一个周期的正弦波的幅值量化为0-255,将这256个值 存在程序空间里面,单片机定时依次循环取出这些值送到DA转换器,DA输出后进行低通滤波即能得到正弦波了。如果要节省空间可以利用正弦波形的对称性只需存入1\/4周期的数据再经一个简单算法也可以得到正弦波。
怎样提高 用51单片机做的正弦波的 频率?
第一,可以使用1T单片机使得速度更快 第二,程序上可以减少输出的采样值精度,比如8位da,应存在255个值,我们可以删减掉一些点,保留关键点,比如波风波谷,使得存正弦信号的数组数据变小,精度降低,在DA输出端接电容接地,使信号在电容冲放电作用下又回归正弦的波形。第三,第二个解决方案是灵活的,...
如何用51单片机控制DAC0832产生不同频率正弦波,键盘改变频率,求具体的...
我就不写程序了,费事,说说思路吧 假设你把一个正弦波的一周期分成180个点,那么每个点相差是2度,那么每个点是有一个对应的SIN值的,比如SIN0 SIN2 SIN4等。假设1ms发送一个点(即单片机向DA写一个该SIN值所对应的电压大小), 那么写完一个正弦波,要180ms。如果2ms写一个点,这就改变...