基于51单片机的波形发生器(方波,VF转换)

请添加图片描述

V/F转换模块设计
设计任务:用单片机开发板实现根据输入电压值产生不同的对应频率方波。要求:1:输入0-5v对应产生1-10KHz的方波。
2:数码管显示当前的输入电压值和当前的频率值。3:按键:启动测量、停止测量

说明:

单片机速度原因,误差较大
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
在这里插入图片描述

#include "reg51.h"
#include "ADC0832.h"
#define uchar unsigned char
#define uint unsigned int
sbit smg1=P2^2;//数码管
sbit smg2=P2^3;
sbit smg3=P2^4;
sbit k1=P3^2;
sbit k2=P3^3;
sbit out=P2^1;
uchar code smgduan0[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9,无小数点
uchar code smgduan1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//显示0~9,有小数点
uchar time=0,mode=0;//系统变量
uint volt=0;//电压	0.1-5.0V
uint freq=0;//频率	1-10kHZ
uchar sec=0,set=0;//低频控制

uchar dat1=0,dat2=0;//定时器初值设置

//延时
void delay(uint i)
{
	while(i--)	
	{
		
	}
}
//显示
void disp()
{
	P0=0;smg3=1;smg2=1;smg1=1;P0=smgduan1[volt/10];delay(50);
	P0=0;smg3=1;smg2=1;smg1=0;P0=smgduan0[volt%10];delay(50);
	P0=0;smg3=1;smg2=0;smg1=0;P0=smgduan0[freq/10000];delay(50);
	P0=0;smg3=0;smg2=1;smg1=1;P0=smgduan0[freq%10000/1000];delay(50);
	P0=0;smg3=0;smg2=1;smg1=0;P0=smgduan0[freq%1000/100];delay(50);
	P0=0;smg3=0;smg2=0;smg1=1;P0=smgduan0[freq%100/10];delay(50);
	P0=0;smg3=0;smg2=0;smg1=0;P0=smgduan0[freq%10];delay(50);
}

//主函数
void main()
{
	uchar start=0;
	TMOD=0X11;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	TH1=215;
	TL1=215;	
	ET0=1;//打开定时器0中断允许
	ET1=1;
	EA=1;//打开总中断
	TR0=1;//打开定时器

	while(1)
	{
		if(start)
		{
			disp();//显示
		}
		else
			P0=0;
		if(!k1)//启动
		{
			start=1;
			TR1=1;
		}
		if(!k2)//停止
		{
			start=0;
			TR1=0;
		} 
	}
}
//定时器0中断
void Timer0() interrupt 1
{
	unsigned long i=0;
	if(time<20)//1s
		time++;
	else
	{
		time=0;
		volt=ADC0832(0);
		//计算频率
		i=volt;
		freq=10000*i/255;
		if(freq==0)
			freq=1;
		i=425185/freq;
		if(freq>20)//高频计算
		{			
			dat1=(65536-i)/256;
			dat2=(65536-i)%256;
			mode=0;
		}
		else	//低频计算
		{			
			set=i/1000;
			mode=1;
		}
		volt=volt*50/255;
		TL1=dat2;
		TH1=dat1;
	}
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
}
//定时器1中断
void Timer1() interrupt 3
{	
	if(mode==0)//高频模式
	{
		out=!out;
		TL1=dat2;
		TH1=dat1;	
	}
	else //低频模式
	{
		if(sec<set)
			sec++;
		else
		{
			sec=0;
			out=!out;			
		}
		TH1=(65536-1000)/256;
		TL1=(65536-1000)%256;
	}
	
}![请添加图片描述](https://img-blog.csdnimg.cn/direct/0e142da645f6479faaae8b514c7195f5.bmp)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cqtianxingkeji

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

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

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

打赏作者

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

抵扣说明:

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

余额充值