课程设计 基于51单片机的波形测量系统(方波,正弦)原理图 PCB 仿真 源代码及proteus 软件
1、测量正弦和方波的峰峰值和频率,方波的占空比,用lcd显示,精度要求在1%。
2、自动识别方波和正弦波
原理:测量频率,使用比较器把所有波形变成方波,便于测量;
测量振幅,将电压通过加法器抬升以后,消除负电压部分,最后送入AD芯片进行测量。
#include "reg51.h"
#include "lcd1602.h"
#include "ADC0832.h"
#define uchar unsigned char
#define uint unsigned int
uchar time=0,mode=0;//系统变量
uchar disp1[]="U:0.00V";
uchar disp2[]="PWM:00%";
uchar disp3[]="Freq:000000Hz ";
uint freq=0;//频率
uchar sec=0,flag=0;
uchar wave=0;//波形
uint j1=0,j2=0,j3=0;
uint dat1=0,dat2=0;//电平记录
void main()//主函数
{
uchar i=0;
init_1602();
TMOD|=0X51;
TH0=0X3C;
TL0=0XB0;
TH1=0;
TL1=0;
TR1=1;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
delay_uint(100);
if(flag==0)//判断类型
{
j1=j2;
j2=ADC0832(0);
if(j1==j2)
{
if(i<200)
i++;
}
else
{
if(i>0)
i--;
}
}
else
{
if(wave==0)
{
if(i>150)//方波
wave=1;
else //正弦波
wave=2;
j1=0;j2=0;
j3=ADC0832(0);
dat1=0;
dat2=0;
}
i=0;
//测量正弦波
if(wave==2)
{
j1=ADC0832(0);
if(j1>j2)//最大值
j2=j1;
if(j1<j3)//最小值
j3=j1;
}
//测量矩形波
if(wave==1)
{
j1=ADC0832(0);
if(j1>j2)//最大值
j2=j1;
if(j1<j3)//最小值
j3=j1;
if(j1<j2)
dat1++;
if(j1>j3)
dat2++;
}
}
}
}
//定时器中断
void Timer0() interrupt 1
{
if(time<19)//1s
time++;
else
{
time=0;
freq=TH1*256+TL1;//测量频率
TH1=0;
TL1=0;
}
if(sec<10)//判断类型
sec++;
else
{
sec=0;
flag=!flag;
if(flag==0)
{ //显示电压
if(wave==2)//正弦峰峰值
{
if(j2>j3)
j1=j2-j3;
else
j1=j3-j2;
j1=50*j1/255;
disp1[2]=j1/10+0x30;
disp1[4]=j1%10+0x30;
write_string(1,0,disp1);
write_string(1,8," ");
//write_string(2,11,"sin ");
}
if(wave==1)//矩形波峰峰值
{
if(j2>j3)
j1=j2-j3;
else
j1=j3-j2;
j1=50*j1/255;
disp1[2]=j1/10+0x30;
disp1[4]=j1%10+0x30;
write_string(1,0,disp1);
//占空比
j1=dat1+dat2;
j1=dat2*99/j1;
disp2[4]=j1/10+0x30;
disp2[5]=j1%10+0x30;
write_string(1,8,disp2);
//write_string(2,11,"squre");
}
wave=0;
}
//显示频率
disp3[8]=freq/100+0x30;
disp3[9]=freq%100/10+0x30;
disp3[10]=freq%10+0x30;
write_string(2,0,disp3);
}
TH0=0X3C;
TL0=0XB0;
}