基于51单片机的波形发生器(三角波,调频,调幅)2
三角波发生器
1、幅值在0-5V可调,频率可调
2、显示器显示幅值和频率
3、使用示波器查看波形
#include<reg51.h>
#include"absacc.h"
#include"intrins.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
#define out XBYTE[0xfeff]
sbit k1=P3^0;//按钮
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^7;
uint freq=50,set=0; //频率
uchar amp=255;//振幅
uchar time=0,sec=0;//计时
uchar hang1[]="fre:050Hz";
uchar hang2[]="Amp:5.0V ";//振幅
void main()
{
uint i;
//设置定时器
TMOD|=0X02;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=156;//给定时器赋初值
TL0=156;
ET0=1;//打开定时器0中断允许
TR0=0;//打开定时器
EA=1;//打开总中断
init_1602();//初始化LCD
write_string(1,0,hang1);
write_string(2,0,hang2);
while(1)
{
if(!k1)//频率加
{
if(freq<50)
freq++;
set=50/freq;//50HZ-1HZ
if(set>0)
set--;
hang1[4]=freq/100+0x30;
hang1[5]=freq%100/10+0x30;
hang1[6]=freq%10+0x30;
write_string(1,0,hang1);
while(!k1);
}
if(!k2)//频率减
{
if(freq>1)
freq--;
set=50/freq;//50HZ-1HZ
if(set>0)
set--;
hang1[4]=freq/100+0x30;
hang1[5]=freq%100/10+0x30;
hang1[6]=freq%10+0x30;
write_string(1,0,hang1);
while(!k2);
}
if(!k3)//振幅加
{
amp+=3;
i=amp*10/51;
hang2[4]=i/10+0x30;
hang2[6]=i%10+0x30;
write_string(2,0,hang2);
while(!k3);
}
if(!k4)//振幅减
{
amp-=3;
i=amp*10/51;
hang2[4]=i/10+0x30;
hang2[6]=i%10+0x30;
write_string(2,0,hang2);
while(!k4);
}
}
}
void Timer0() interrupt 1//定时器中断
{
uint i;
if(time<51)//输出
{
i=time*amp/50;
out=i;
}
else
{
i=(99-time)*amp/50;
out=i;
}
if(sec<set)//延时控制
sec++;
else
{
sec=0;
if(time<99)
time++;
else
time=0;
}
}