找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5768|回复: 12
收起左侧

我用51单片机写的波形发生器 可以输出正弦波 但是不能调整频率 难道是我的中断...

[复制链接]
ID:51036 发表于 2013-6-18 13:04 | 显示全部楼层 |阅读模式
#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--);
}

/**********************************************
                计算正弦波数据
********************************************/
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;
}



这是我的程序,麻烦帮忙解答一下为什么。  此时示波器上的显示的周期是2s,这跟我的设置的频率的FREQ=1有点不对。  求解释一下。
回复

使用道具 举报

ID:262 发表于 2013-6-19 00:51 | 显示全部楼层
有高手知道吗
回复

使用道具 举报

ID:51036 发表于 2013-6-19 01:02 | 显示全部楼层

谢谢  我真的调了好多天了  
回复

使用道具 举报

ID:51036 发表于 2013-6-19 01:04 | 显示全部楼层

还是没有调试出来
回复

使用道具 举报

ID:7485 发表于 2013-6-19 11:00 | 显示全部楼层
本帖最后由 ahshmj 于 2013-6-19 11:09 编辑

你有必要搞这么复杂么?你这样,中断函数的运行过程就超过了中断定时,怎能会正常?
不信,你直接将你需要的数值填写进去试一试!
“   TH1=(all-fosc/12/256/FREQ)/256;
   TL1=(all-fosc/12/256/FREQ)%256;

如下改试一试,如果是值不对你自己计算一下:
   TL1=0XBD;
   TH1=0XF0;

正弦波发生器,如果要求严格的话,定时部分最好使用汇编。
回复

使用道具 举报

ID:7485 发表于 2013-6-19 11:06 | 显示全部楼层
本帖最后由 ahshmj 于 2013-6-19 11:10 编辑

定时需要再延长一些,中间的计算过程耗时多。如果不能延长,就要使用更高的晶振。否则这个程序调不正常。
回复

使用道具 举报

ID:51036 发表于 2013-6-19 13:12 | 显示全部楼层
ahshmj 发表于 2013-6-19 11:00
你有必要搞这么复杂么?你这样,中断函数的运行过程就超过了中断定时,怎能会正常?
不信,你直接将你需要 ...

恩恩  谢谢啊   是要开始学学汇编了
因为我是要调这个波形发生器频率的   假如不用这种方法  还可以有其他的方法么?
真的谢谢您啊
回复

使用道具 举报

ID:51036 发表于 2013-6-19 13:14 | 显示全部楼层
ahshmj 发表于 2013-6-19 11:06
定时需要再延长一些,中间的计算过程耗时多。如果不能延长,就要使用更高的晶振。否则这个程序调不正常。

我当时是想通过这种计算来控制频率的  我是不能延时太长了   因为要求波形发生器的频率最高要1k  HZH
回复

使用道具 举报

ID:7485 发表于 2013-6-19 15:38 | 显示全部楼层
忘了告诉你了:
你没有设置定时器的工作模式,就成了默认的13位计数/定时,需要加上一句:   TMOD = 0x10; 当然你不加这一句也行,13位的。但是初装值不一样。
回复

使用道具 举报

ID:51036 发表于 2013-6-20 13:55 | 显示全部楼层
ahshmj 发表于 2013-6-19 15:38
忘了告诉你了:
你没有设置定时器的工作模式,就成了默认的13位计数/定时,需要加上一句:   TMOD = 0x10; ...

好的  好的  谢谢
回复

使用道具 举报

ID:76287 发表于 2015-4-7 19:02 | 显示全部楼层
不懂,但是还是要顶,安抚楼主受伤心灵,每一个新手都是痛苦的开始,快乐的结局
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表