【Proteus仿真】【51单片机】简易信号发生器设计


一、主要功能

1、可生成常用波形,方波、锯齿波、三角波、阶梯波、正玄波;
2、可通过按键切换不同波形输出;


二、使用方法

系统运行后,按下K1键输出方波信号,按下K2键输出锯齿波,按下K3键输出三角波,按下K4键输出阶梯波,按下K5键输出正弦波。可通过示波器测量显示输出波形。

三、硬件资源

1、51单片机核心模块
2、DAC0832模块
3、按键模块

四、软件设计

1、主要代码

代码如下:

#include <reg52.h>
#include <absacc.h>
#define uint unsigned int
#define uchar unsigned char
#define DAC0832 XBYTE[0xfffe]
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit beep=P1^7;
unsigned char mm=0;
unsigned char flag=0;
unsigned char x,y;
uchar code SETTAB[]={ //正弦波数据(正部分)
0x80, 0x83, 0x86, 0x89, 0x8D, 0x90, 0x93, 0x96, //(正上升部分)
0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE,
0xB1, 0xB4, 0xB7, 0xBA, 0xBC, 0xBF, 0xC2, 0xC5,
0xC7, 0xCA, 0xCC, 0xCF, 0xD1, 0xD4, 0xD6, 0xD8,
0xDA, 0xDD, 0xDF, 0xE1, 0xE3, 0xE5, 0xE7, 0xE9,
0xEA, 0xEC, 0xEE, 0xEF, 0xF1, 0xF2, 0xF4, 0xF5,
0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD,
0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD,
0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7, 0xF6, //(正下降部分)80
0xF5, 0xF4, 0xF2, 0xF1, 0xEF, 0xEE, 0xEC, 0xEA,
0xE9, 0xE7, 0xE5, 0xE3, 0xE1, 0xDE, 0xDD, 0xDA,
0xD8, 0xD6, 0xD4, 0xD1, 0xCF, 0xCC, 0xCA, 0xC7,
0xC5, 0xC2, 0xBF, 0xBC, 0xBA, 0xB7, 0xB4, 0xB1,
0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99,
0x96, 0x93, 0x90, 0x8D, 0x89, 0x86, 0x83, 0x80,
//正弦波数据(负部分)
0x80, 0x7C, 0x79, 0x78, 0x72, 0x6F, 0x6C, 0x69 , //(负下降部分)128,0x80
0x66, 0x63, 0x60, 0x5D, 0x5A, 0x57, 0x55, 0x51 ,
0x4E, 0x4C, 0x48, 0x45, 0x43, 0x40, 0x3D, 0x3A ,
0x38, 0x35, 0x33, 0x30, 0x2E, 0x2B, 0x29, 0x27 ,
0x25, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18, 0x16 ,
0x15, 0x13, 0x11, 0x10, 0x0E, 0x0D, 0x0B, 0x0A ,
0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02 ,
0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02 ,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 , //(负上升部分)//80
0x0A, 0x0B, 0x0D, 0x0E, 0x10, 0x11, 0x13, 0x15 ,
0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x25 ,
0x27, 0x29, 0x2B, 0x2E, 0x30, 0x33, 0x35, 0x38 ,
0x3A, 0x3D, 0x40, 0x43, 0x45, 0x48, 0x4C, 0x4E ,
0x51, 0x55, 0x57, 0x5A, 0x5D, 0x60, 0x63, 0x66 ,
0x69, 0x6C, 0x6F, 0x72, 0x76, 0x79, 0x7C, 0x80
};
void DelayMS(uint ms)
{
	uchar i;
	while(ms--)
	{
		for(i=0;i<120;i++);
	}
}
void delay(uint i)
{
	while(i--);	
}
void sound()
{
	uchar i=100;
	while(i--)
	{
		beep=~beep;
		delay(100);
	}
}
void fangbo()
{
	DAC0832=y;
	x++;
	if(flag==0)
	{	
		y=0xff;
		if(x==128)
		{
			flag=1;
			y=0x00;
		} //方波+
	}
	else
	{
		y=0x00;
		if(x==0)
		{
			flag=0;
			y=0xff;
		} //方波-
	}
}
void juchibo() //锯齿波
{
	DAC0832=y;
	y+=1;
}
void sanjiaobo()   //三角波
{
	DAC0832=y;
	x++;
	if(flag==0)
	{
		y+=2; //三角波数据(上升部分)
		if(x==128)
		{
			flag=1;
			y-=2;
		}
	}
	else 
	{
		y-=2;
		if(x==0)
		{
			flag=0;
			y=0;
		} //三角波数据(下升部分)
	}
}
void jietibo() //阶梯波
{
	DAC0832=y;
	y+=25;
}
void sin() //正弦波
{
	DAC0832=SETTAB[y];
	x++;
	y++;
}
void read_key()
{
	if(k1==0)	  //方波
	{
		DelayMS(10);
		if(k1==0)
		{ 
			mm=1;
			
			while(k1==0);
		}
	}
	else if(k2==0)
	{
		DelayMS(10);
		if(k2==0)
		{ 
			mm=2;
		
			while(k2==0);
		}
	}
	else if(k3==0)	 // 三角波
	{
		DelayMS(10);
		if(k3==0)
		{
		 	mm=3;
			
			while(k3==0);
		}
	}
	else if(k4==0)
	{
		DelayMS(10);
		if(k4==0)
		{ 
			mm=4;
			
			while(k4==0);
		}
	}
	else if(k5==0)	   //正弦波
	{
		DelayMS(10);
		if(k5==0)
		{ 
			mm=5;
			
			while(k5==0);
		}
	}
}
void main()
{
	TMOD=0x02;
	TL0=156;
	TH0=156;
	TR0=1;
	ET0=1;
	EA=1;
	mm=0;
	for(;;)
	{ 
		read_key();
	}
}
void t_0() interrupt 1 using 2
{ 
	switch(mm)
	{
		case 1: fangbo();break;
		case 2: juchibo();break;
		case 3: sanjiaobo();break;
		case 4: jietibo();break;
		case 5: sin();break;
	}
}

五、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系作者

作者B站链接:https://space.bilibili.com/444388619
可提供手把手教学服务,资料获取请联系作者QQ:3443792007
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

  • 7
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值