基于51单片机的波形测量(方波,正弦)原理图、流程图、物料清单、仿真图、源代码

请添加图片描述

课程设计 基于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;
}
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cqtianxingkeji

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

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

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

打赏作者

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

抵扣说明:

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

余额充值