找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6215|回复: 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有点不对。  求解释一下。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:262 发表于 2013-6-19 00:51 | 只看该作者
有高手知道吗
回复

使用道具 举报

板凳
ID:51036 发表于 2013-6-19 01:02 | 只看该作者

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

使用道具 举报

地板
ID:51036 发表于 2013-6-19 01:04 | 只看该作者

还是没有调试出来
回复

使用道具 举报

5#
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;

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

使用道具 举报

6#
ID:7485 发表于 2013-6-19 11:06 | 只看该作者
本帖最后由 ahshmj 于 2013-6-19 11:10 编辑

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

好的  好的  谢谢
回复

使用道具 举报

11#
ID:76287 发表于 2015-4-7 19:02 | 只看该作者
不懂,但是还是要顶,安抚楼主受伤心灵,每一个新手都是痛苦的开始,快乐的结局
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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