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)