找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4959|回复: 4
打印 上一主题 下一主题
收起左侧

怎么用51单片机输出一个1kHz的正弦波

[复制链接]
跳转到指定楼层
楼主
ID:596741 发表于 2019-8-8 20:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:399417 发表于 2019-8-9 08:14 | 只看该作者
要么单片机带DA输出,要么用一个DA芯片
回复

使用道具 举报

板凳
ID:477152 发表于 2019-8-9 22:09 | 只看该作者
STC单片机有自带DAC的哈
回复

使用道具 举报

地板
ID:155507 发表于 2019-8-12 14:25 | 只看该作者
SPWM信号经低通滤波后可变换为正弦波,窄带范围内的方波经低通滤波后可变换为相应频率的正弦波

如果不是你想要的频率,那就 自己改一下数据 记得同时要替换数组里面的值

单片机SPWM波 产生正弦波的源程序及工具
http://www.51hei.com/bbs/dpj-55510-1.html

  1. #include<reg52.h>
  2. #define uInt unsigned int
  3. #define uchar unsigned char
  4. uchar t_max = 10;                       //一个周期
  5. static uchar t = 0,i = 0;        //PWM计数
  6. /*
  7. uchar code SinParam[40]={  
  8. 0,3,6,9,13,16,19,22,25,28,31,34,37,40,43,45,
  9. 48,51,54,56,59,61,64,66,68,71,73,75,77,79,81,83,
  10. 84,86,88,89,90,92,93,94,95,96,97,98,98,99,99,100,
  11. 100,100,100,100,100,100,99,99,98,98,97,96,95,94,93,92,
  12. 90,89,88,86,84,83,81,79,77,75,73,71,68,66,64,61,
  13. 59,56,54,51,48,45,43,40,37,34,31,28,25,22,19,16,
  14. 13,9,6,3
  15. };
  16. */
  17. uchar code SinParam[20]={  
  18.   5,5,6,7,7,8,9,9,9,9,10,9,9,9,9,8,
  19. 7,7,6,5
  20. };


  21. // 200点正弦波样本值

  22. void main(void)
  23. {
  24.         TMOD = 0x02;                                //定时器0,工作模式2,8位定时模式
  25.         TH0 = 146;                                //写入预置初值(取值1-255,数越大PWM频率越高)
  26.         TL0 = 146;                                //写入预置值(取值1-255,数越大PWM频率越高)
  27.         TR0 = 1;                                        //启动定时器
  28.         ET0 = 1;                                        //允许定时器0中断
  29.         EA = 1;                                        //允许总中断

  30.         P2 = 0xff;                                //初始化P1

  31.         while(1)
  32.         {
  33.                 ;
  34.         }
  35. }


  36. timer0()interrupt 1 using 2
  37. {
  38.         t++;                                //每次定时器溢出加1

  39.         if(t < t_max && t >= SinParam[i])        //PWM周期                                          5
  40.                 {                                
  41.                         P2 = 0x00;                        //使LED灯亮
  42.                 }
  43.                 else if( t >= t_max)
  44.                 {
  45.                         t = 0;        //使t=0,开始新的PWM周期
  46.                         i++;                        
  47.                         P2 = 0xff;        
  48.                 }               
  49.    if(i >= 20) i = 0;
  50. }
复制代码
回复

使用道具 举报

5#
ID:579053 发表于 2019-8-12 17:24 | 只看该作者
用定时器输出PWM
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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