基于51单片机的波形发生器方波,三角波,锯齿波和正弦波(4种,调幅调频,12864)原理图 PCB 仿真 源代码及proteus 软件

基于51单片机的波形发生器方波,三角波,锯齿波和正弦波(4种,调幅调频,12864)原理图 PCB 仿真 源代码及proteus 软件

1、通过键盘输入来选择信号类型和频率,采用DA 转换芯片输出相应的波形
2、用12864进行实时显示信号相关信息。
3、实现方波,三角波,锯齿波和正弦波四种波形的产生,且波形的频率可调。为使设计流程变得简洁,高效,先用Keil软件编辑完成后,然后在Proteus软件平台进行模拟仿真实现。

说明:频率很低,最高只能到10Hz请添加图片描述

-请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

#include<reg51.h>
#include"absacc.h"
#include"intrins.h"
#include <AMPIRE128X64.h>
#define uchar unsigned char
#define uint unsigned int
#define dac XBYTE[0xfeff]//DAC
sbit k1=P1^0;//按钮
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit smg1=P3^2;//数码管
sbit smg2=P3^3;
sbit smg3=P3^4;
uchar code char1[]={0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20};/*"H",0*/

uchar code char2[]={0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00};/*"z",1*/

uchar code char3[]={0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00};/*"V",0*/

uchar code str1[]={0x10,0x60,0x02,0x0C,0xC0,0x00,0xF8,0x88,0x88,0x88,0xFF,0x88,0x88,0xA8,0x18,0x00,
0x04,0x04,0x7C,0x03,0x80,0x60,0x1F,0x80,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00};/*"波",0*/

uchar code str2[]={0x80,0x82,0x82,0xFE,0x82,0x82,0xFE,0x82,0x82,0x80,0x20,0x10,0x08,0x86,0x60,0x00,
0x80,0x40,0x30,0x0F,0x00,0x00,0xFF,0x00,0x00,0x80,0x84,0x42,0x21,0x10,0x0C,0x00};/*"形",1*/

uchar code str3[]={0x40,0x7C,0x40,0x7F,0x48,0x48,0x40,0xF2,0x12,0x1A,0xD6,0x12,0x12,0xF2,0x02,0x00,
0x90,0x8E,0x40,0x4F,0x20,0x1E,0x80,0x4F,0x20,0x18,0x07,0x10,0x20,0x4F,0x80,0x00};/*"频",2*/

uchar code str4[]={0x00,0x14,0xA4,0x44,0x24,0x34,0xAD,0x66,0x24,0x94,0x04,0x44,0xA4,0x14,0x00,0x00,
0x08,0x09,0x08,0x08,0x09,0x09,0x09,0xFD,0x09,0x09,0x0B,0x08,0x08,0x09,0x08,0x00};/*"率",3*/

uchar code str5[]={0x10,0x10,0x10,0xFF,0x10,0x90,0xFE,0x82,0x92,0x92,0x92,0x92,0x92,0x82,0x00,0x00,
0x04,0x44,0x82,0x7F,0x81,0x60,0x1F,0x00,0xFF,0x80,0x47,0x18,0x24,0x42,0x80,0x00};/*"振",4*/

uchar code str6[]={0x00,0xF8,0x08,0xFF,0x08,0xF8,0x00,0x02,0x7A,0x4A,0x4A,0x4A,0x7A,0x02,0x02,0x00,
0x00,0x0F,0x00,0xFF,0x08,0x0F,0x00,0xFF,0x49,0x49,0x7F,0x49,0x49,0xFF,0x00,0x00};/*"幅",5*/

uchar code mao[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*":",0*/

uchar code str7[]={0x08,0x08,0x08,0x08,0x08,0xF8,0x89,0x8E,0x88,0x88,0x88,0x88,0x08,0x08,0x08,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00};/*"方",0*/

uchar code str8[]={0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00};/*"三",1*/

uchar code str9[]={0x20,0x10,0xE8,0x24,0x27,0x24,0x24,0xE4,0x24,0x34,0x2C,0x20,0xE0,0x00,0x00,0x00,
0x80,0x60,0x1F,0x09,0x09,0x09,0x09,0x7F,0x09,0x09,0x49,0x89,0x7F,0x00,0x00,0x00};/*"角",2*/

uchar code str10[]={0x40,0x30,0xEF,0x24,0x24,0x00,0xFE,0x92,0x92,0x92,0xF2,0x92,0x92,0x9E,0x80,0x00,
0x01,0x01,0x7F,0x21,0x91,0x60,0x1F,0x00,0xFC,0x44,0x47,0x44,0x44,0xFC,0x00,0x00};/*"锯",3*/

uchar code str11[]={0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0x44,0x44,0x44,0x44,0x44,0x40,0x40,0x00,
0x00,0x00,0x7F,0x40,0x50,0x48,0x44,0x43,0x44,0x48,0x50,0x40,0xFF,0x00,0x00,0x00};/*"齿",4*/

uchar code str12[]={0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00,
0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00};/*"正",5*/

uchar code str13[]={0x02,0xE2,0x22,0x22,0x3E,0x00,0x08,0x88,0x48,0x39,0x0E,0x08,0xC8,0x08,0x08,0x00,
0x00,0x43,0x82,0x42,0x3E,0x00,0x21,0x71,0x29,0x25,0x23,0x21,0x28,0x70,0x00,0x00};/*"弦",6*/

uchar code str14[]={0x10,0x60,0x02,0x0C,0xC0,0x00,0xF8,0x88,0x88,0x88,0xFF,0x88,0x88,0xA8,0x18,0x00,
0x04,0x04,0x7C,0x03,0x80,0x60,0x1F,0x80,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00};/*"波",0*/

uchar code str15[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

uchar code wave1[]={//方波
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255
};
uchar code wave2[]={//三角波
0, 2, 4, 6, 8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44
,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90
,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136
,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182
,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228
,230,232,234,236,238,240,242,244,246,248,250,252,254
,255,253,251,249,247,245,243,241,239,237,235,233,231,229,227,225,223,221,219,217,215,213,211
,209,207,205,203,201,199,197,195,193,191,189,187,185,183,181,179,177,175,173,171,169,167,165
,163,161,159,157,155,153,151,149,147,145,143,141,139,137,135,133,131,129,127,125,123,121,119
,117,115,113,111,109,107,105,103,101,99,97,95,93,91,89,87,85,83,81,79,77,75,73
,71,69,67,65,63,61,59,57,55,53,51,49,47,45,43,41,39,37,35,33,31,29,27
,25,23,21,19,17,15,13,11, 9, 7, 5, 3, 1
};
uchar code wave3[]={//锯齿波
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,
60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,
90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,120,121,122,123,124,125,126,
127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,
199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,
247,248,249,250,251,252,253,254,255,255,255,255,255,255,255,255,255,255
};
uchar code wave4[]={//正弦波
128,131,134,137,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,188,191,194,
196,199,202,204,207,209,212,214,216,219,221,223,225,227,229,231,233,234,236,238,239,241,242,244,245,246,247,249,
250,250,251,252,253,254,254,255,255,255,255,255,255,255,255,255,255,255,255,254,254,253,252,251,250,250,249,247,
246,245,244,242,241,239,238,236,234,233,231,229,227,225,223,221,219,216,214,212,209,207,204,202,199,196,194,191,
188,186,183,180,177,174,171,168,165,162,159,156,153,150,147,144,141,137,134,131,128,125,122,119,115,112,109,106,
103,100,97,94,91,88,85,82,79,76,73,70,68,65,62,60,57,54,52,49,47,44,42,40,37,35,33,31,29,27,25,23,22,20,18,17,15,
14,12,11,10,9,7,6,6,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,6,6,7,9,10,11,12,14,15,17,18,20,22,23,25,27,29,
31,33,35,37,40,42,44,47,49,52,54,57,60,62,65,68,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,119,122,125,128
};

uint time=0,sec=0;//计时变量
uchar boxing=0;//波形
uint freq[]={10,10,10,10};//频率
uint amp[]={50,50,50,50}; //振幅
uchar next=0;
uchar flag=0;//显示标志

void suan()//计算频率延时
{
	unsigned long i=0;
	i=10000;
	i=i/128;
	sec=i/freq[boxing];
}

void main()//主函数
{
	uchar k=0;
	lcd_init();                 // 初始化
    lcd_clear(0);               // 清屏
    lcd_set_line(0);

	suan();
	TMOD|=0X02;//模式2
	TH0=206;
	TL0=206;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器
	while(1)
	{		
		if(!k1 &&(k!=1))//正弦波  波形
		{
			if(boxing<3)
				boxing++;
			else
				boxing=0;
			k=1;
		}
		if(!k2 &&(k!=2))//振幅
		{
			k=2;
			if(amp[boxing]<50)
				amp[boxing]++;			
		}	
		if(!k3 &&(k!=3))
		{
			k=3;
			if(amp[boxing]>1)
				amp[boxing]--;			
		}
		if(!k4 &&(k!=4))//频率
		{
			k=4;
			if(freq[boxing]<100)
				freq[boxing]++;	
			suan();		
		}	
		if(!k5 &&(k!=5))
		{
			k=5;
			if(freq[boxing]>1)
				freq[boxing]--;	
			suan();		
		}
		if(k1 && k2 && k3 && k4 && k5)
			k=0;
	}
}
//定时器中断
void Timer0() interrupt 1
{
	uint i=0;
	if(time<sec)//波形输出
	{
		time++;
	}
	else
	{
		time=0;
		next++;
		i=amp[boxing];
		switch(boxing)
		{
			case 0:i=wave1[next]*i;
				break;
			case 1:i=wave2[next]*i;
				break;
			case 2:i=wave3[next]*i;
				break;
			case 3:i=wave4[next]*i;				
		}
		dac=i/50;
	}

	if(flag<100)//显示
		flag++;
	else
	{
		flag=0;
		
		display(0,0,str1);//波形
		display(0,1,str2);
		display(0,2,mao);
		if(boxing==0)
		{
		display(0,4,str7);
		display(0,5,str14);
		display(0,6,str15);
		}
		if(boxing==1)
		{
		display(0,4,str8);
		display(0,5,str9);
		display(0,6,str14);
		}
		if(boxing==2)
		{
		display(0,4,str10);
		display(0,5,str11);
		display(0,6,str14);
		}
		if(boxing==3)
		{
		display(0,4,str12);
		display(0,5,str13);
		display(0,6,str14);
		}
		display(1,0,str3);//频率
		display(1,1,str4);
		display(1,2,mao);
		find(freq[boxing]/1000);
		display_one(1,8,ppp);
		find(freq[boxing]%1000/100);
		display_one(1,9,ppp);
		find(freq[boxing]%100/10);
		display_one(1,10,ppp);
		find(freq[boxing]%10);
		display_one(1,11,ppp);
		display_one(1,12,char1);
		display_one(1,13,char2);
		display(2,0,str5);//振幅
		display(2,1,str6);
		display(2,2,mao);
		find(amp[boxing]/10);
		display_one(2,8,ppp);
		display_one(2,9,dian);
		find(amp[boxing]%10);
		display_one(2,10,ppp);
		display_one(2,11,char3);
	}

}
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cqtianxingkeji

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

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

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

打赏作者

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

抵扣说明:

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

余额充值