基于51单片机的波形发生器(5种波形,固定频率)原理图、流程图、物料清单、仿真图、源代码

本文介绍了使用51单片机实现的波形发生器,包括正弦波、方波、三角波、梯形波和锯齿波,通过按键切换波形并设置固定频率。使用定时器0和中断机制来控制波形输出和状态切换。
摘要由CSDN通过智能技术生成

基于51单片机的波形发生器(5种波形,固定频率)原理图、流程图、物料清单、仿真图、源代码
51单片机
波形发生器
用一个按键切换5种波形,正弦波,方波,三角波,梯形波,锯齿波。
固定频率

请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
在这里插入图片描述

#include <reg51.h>
#include <intrins.h>
#include <PCF8591.h>
#include "lcd1602.h"

#define uchar unsigned char
#define uint  unsigned int

uchar wave=0;//波形指示变量。0正弦波、1方波、2三角波、3梯形波、4锯齿波
uint time=0;//计时变量
uchar tixing=0;//梯形波变量
uchar sanjiao=0;//三角波变量
uchar code sin_data[]={
128,130,132,134,136,139,141,143,145,148,150,152,154,156,158,161,163,165,167,169,171,173,175,177,180,182,184,186,188,190,191,
193,195,197,199,201,203,204,206,208,210,211,213,215,216,218,220,221,223,224,226,227,228,230,231,232,234,235,236,237,238,239,
240,242,243,243,244,245,246,247,248,249,249,250,251,251,252,252,253,253,254,254,254,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,254,254,254,253,253,252,252,251,251,250,249,249,248,247,246,245,244,244,243,242,241,240,238,237,236,235,
234,232,231,230,228,227,226,224,223,221,220,218,217,215,213,212,210,208,206,205,203,201,199,197,195,194,192,190,188,186,184,
182,180,178,176,174,171,169,167,165,163,161,159,156,154,152,150,148,146,143,141,139,137,134,132,130,128,125,123,121,119,117,
114,112,110,108,105,103,101,99,97,95,92,90,88,86,84,82,80,78,76,74,72,70,68,66,64,62,60,58,56,54,52,51,49,47,45,44,42,40,39,
37,36,34,33,31,30,28,27,25,24,23,22,20,19,18,17,16,15,14,13,12,11,10,9,8,7,7,6,5,5,4,3,3,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,1,2,2,3,3,4,4,5,6,6,7,8,9,10,10,11,12,13,14,15,16,18,19,20,21,22,24,25,26,28,29,31,32,34,35,37,38,40,42,43,45,47,48,
50,52,54,56,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,88,90,92,94,96,98,101,103,105,107,109,112,114,116,118,120,123,125};
/**************************************************************************/
void main()//主函数
{
	init_1602();
	write_string(1,0,"sine    wave");
	TMOD=0X01;	//T0方式1。
	TH0=0XFC;	//定时1ms
	TL0=0X18;	
	ET0=1;		//打开定时器0中断允许
	TR0=1;
	//设置INT0
	IT0=1;//跳变沿出发方式(下降沿)
	EX0=1;//打开INT0的中断允许。
	EA=1;		//打开总中断

while(1)
{

}
}

/**************************************************************************/
void Timer0() interrupt 1//定时器0中断
{
	TH0=0XFC;	//定时1ms
	TL0=0X18;
	switch(wave)
	{
	case 0://正弦波
		if(time<360) //360度
			time++;
		else
			time=0;
		PCF8591_write(sin_data[time]);	 //输出DA
		break;
	case 1://方波
		if(time<100)
			time++;
		else
			time=0;
		if(time<50)
			PCF8591_write(0xfe);
		else
			PCF8591_write(0);
		break;
	case 2://三角波
		if(sanjiao==0)
		{
			if(time<255)
				time++;
			else
				sanjiao=1;
		}
		else
		{
			if(time>0)
				time--;
			else
				sanjiao=0;
		}
		PCF8591_write(time);
		break;
	case 3://梯形波
		if(tixing==0)//上升沿
		{
			PCF8591_write(time);
			if(time<255)
				time++;
			else
				{
				tixing=1;
				time=0;
				}			
		}
		if(tixing==1)//中间平坦区间
		{
			if(time<255)
				time++;
			else
				tixing=2;			
		}
		if(tixing==2)//下降沿
		{
			if(time>0)
				time--;
			else
				tixing=3;
			PCF8591_write(time);			
		}
		if(tixing==3)//中间平坦区间
		{
			if(time<255)
				time++;
			else
				{
				tixing=0;
				time=0;
				}			
		}
		break;
	case 4://锯齿波
		if(time<255)
			time++;
		else
			time=0;
		PCF8591_write(time);
	}  	
}
/**************************************************************************/
void Int0()	interrupt 0		//外部中断0的中断函数
{
	if(wave<4)
		wave++;//下一个波形
	else
		wave=0;
	switch(wave)
	{
		case 0:write_string(1,0,"sine    wave");break;
		case 1:write_string(1,0,"square  wave");break;
		case 2:write_string(1,0,"triang  wave");break;
		case 3:write_string(1,0,"trape   wave");break;
		case 4:write_string(1,0,"zigzag  wave");
	}
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqtianxingkeji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值