基于51单片机的PWM信号源(互补,调频,脉宽)原理图、流程图、物料清单、仿真图、源代码

请添加图片描述

基于51单片机的PWM信号源(互补,调频,脉宽)

PWM波(两路互补)发生器
1、要求占空比和频率可调
2、占空比调节范围:0.1-0.9,频率调节范围0.5kHZ—3.0kHZ
3、使用4个按键调节,占空比每次步进0.1,频率每次步进0.5.
4、通过6位数码管显示占空比和频率请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

#include "reg51.h"
#define uchar unsigned char 
#define uint unsigned int
sbit out1=P3^6;//输出
sbit out2=P3^7;
sbit k1=P1^0;//占空比加
sbit k2=P1^1;//占空比减
sbit k3=P1^2;//频率加
sbit k4=P1^3;//频率减
sbit smg1=P2^0;
sbit smg2=P2^1;
sbit smg3=P2^0;
sbit smg4=P2^3;
sbit smg5=P2^4;
sbit smg6=P2^5;

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 pwm=5;//占空比
uchar time=0;
//1K T=1ms   10K T=100us
uchar freq=10;//频率

void suan()//计算定时器初值
{
	uchar i;
	if(freq>39)
	{
	i=10000/freq+freq/10;
	TH0=256-(i/10)*pwm;
	TH1=256-(i/10)*(10-pwm);
	}
	else
	{
		TH0=256-1000/freq;
		TL0=TH0;
	}
}
void delay(uint j)//延时ms
{
	uint i;
	while(j--)
	for(i=0;i<110;i++);
}
void delay_us(uint i)//延时us
{
	while(i--);
}
void main()
{
	TMOD|=0X22;
	TH0=156;//500us
	TL0=156;
	TH1=206;//500us
	TL1=206;	
	ET0=1;//打开定时器0中断允许
	ET1=1;
	EA=1;//打开总中断
	TR0=1;//打开定时器
	while(1)
	{	
		if(freq<40)//低频
		{
			TR1=0;
		}
		if(!k1)//占空比加
		{
			delay(10);
			if(!k1)
			{
			if(pwm<9)
				pwm++;
			suan();
			while(!k1);
			}
		}
		if(!k2)//占空比减
		{
			delay(10);
			if(!k2)
			{
			if(pwm>1)
				pwm--;
			suan();
			while(!k2);
			}
		}
		if(!k3)//频率加
		{
			delay(10);
			if(!k3)
			{
			if(freq<95)
				freq+=5;
			suan();
			while(!k3);
			}
		}
		if(!k4)//频率减
		{
			delay(10);
			if(!k4)
			{
			if(freq>5)
				freq-=5;
			suan();
			while(!k4);
			}
		}
		//显示
		P0=smgduan1[0];smg1=0;delay_us(100);smg1=1;
		P0=smgduan0[pwm];smg2=0;delay_us(100);smg2=1;
		P0=smgduan1[freq/10];smg5=0;delay_us(100);smg5=1;
		P0=smgduan0[freq%10];smg6=0;delay_us(100);smg6=1;
	}
}
//定时器0中断
void Timer0() interrupt 1
{
		if(freq<40)//低频
		{
			if(time<9)
				time++;
			else
				time=0;
			if(time<pwm)
			{
				out1=0;
				out2=1;
			}
			else
			{
				out1=1;
				out2=0;
			}
		}
		else  //高频
		{
			out1=1;
			out2=0;
			TR1=1;
			TR0=0;
		}
}
//定时器1中断
void Timer1() interrupt 3
{
		out1=0;
		out2=1;
		TR0=1;
		TR1=0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cqtianxingkeji

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

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

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

打赏作者

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

抵扣说明:

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

余额充值