如何用单片机产生正弦波,方波(附图,程序)

如何用单片机产生正弦波,方波(附图,程序),第1张

就是让某一个I/O口输出高低电平,例如让P0^0输出1HZ的方波吧,就是让它持续500ms的高电平,500ms的低电平,程序如下

#include

sbit

L1=P0^0

void

delay1ms()

void

main()

{

LI=1

delay1ms(500)

L1=0

delay1ms(500)

}

这个简单,把两个方波进行异或,用430单片机的定时器A测量异或后的方波的脉冲宽度,在对测量数据进行简单的计算就可得到相位差。。。具体程序如下:

P1SEL |= BIT2//设置P1.2端口为功能模块使用

TACTL |=TACLR

TACTL = TASSEL_2+TAIE+MC1 //定时器A时钟信号选择SMCLK 8M,清计数寄存器,使能中断,同时设置定时器A计数模式为连续增计模式

CCTL1 =CM0+SCS+CAP+CCIE //输入上升沿捕获,同步,capture模式 CCI0A为捕获信号源,中断使能

//TACCTL1 =~CCIFG//清CCR2 的标志位

//中断允许

_EINT()

LPM0

}

#pragma vector=TIMERA1_VECTOR //定时器A中断处理

__interrupt void timer_a(void)

{

switch(TAIV) //向量查询

{ case 2://捕获中断

if(CCTL1CM0) //上升沿

{

CCTL1=(CCTL1(~CM0))|CM1 //更变设置为下降沿触发

start=TACCR1 //记录初始时间

overflow=0//溢出计数变量复位

}

else if(CCTL1CM1) //下降沿

{

CCTL1=(CCTL1(~CM1))|CM0 //更变设置为上升沿触发

end=TACCR1 //用start,end,overflow计算脉冲宽度

TACTL =~TAIE //不使能中断

CCTL1 =~CCIE

P1SEL =~BIT2

_DINT()

LPM0_EXIT

}

break

case 10: //定时器溢出中断

overflow++

break //溢出计数加1

default:break

}

}

然后再对得到的start,end,overflow处理计算即可。。。

#include<reg52.h>

#define  uchar unsigned char

#define  uint  unsigned int

#define DAdata  P0//DA数据端口

可以产生弦波、方波、三角波、三角波、梯形波及其他任意波形,波形的频率(最大790HZ)和幅度在一定范围内可任意改变。波形和频率的改变通过软件控制,幅度的改变通过硬件实现。

正弦波是频率成分最为单一的一种信号,因这种信号的波形是数学上的正弦曲线而得名。任何复杂信号——例如音乐信号,都可以看成由许许多多频率不同、大小不等的正弦波复合而成。振荡电路是电子技术的一个重要组成部分,正弦波振荡器广泛应用于广播、电视、通讯,工业自动控制,测量表计, 以及高频加热,超声波探伤等等方面。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11841200.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存