检测任意占空比PWN(与LED、数码管、按键结合)

本文为博主 LED-执棋困局,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步!
> 发布人:LED-执棋困局
> 欢迎你为独创博主LED-执棋困局点赞❤❤❤+关注👍+收藏🌹+评论☺。

系列专栏:CSDN-单片机学习系列🎁
> 我的格言是:“尽最大努力,做最好的自己!💪
版权声明:本文为CSDN博主「LCD-执棋困局」的原创文章,CSDN独一份。

如需转载,还请通知一声噢⚠!
————————————————
版权声明:本文为CSDN博主「LCD-执棋困局」的原创文章,转载请附上原文出处链接及本声明。

————————————————— CSDN ——————————————————————

目录

一、PWN的概念及占空比

1.1PWN概念

1.2占空比

二、项目设计-检测PWN

2.1项目要求

2.2整体设计

2.3PWN模块设计

2.4定时器设计

2.5数码管模块设计

2.6按键模块设计

2.7LED模块设计

三、软件编码

3.1主程序

3.2定时器模块

3.3数码管模块

3.4按键模块

3.5LED模块

四、仿真结果

4.1波形图

4.2数码管显示

4.3流水灯

————————————————— CSDN ——————————————————————

一、PWN的概念及占空比

1.1PWN概念

PWN是模拟信号数字化的一种表现形试,信号通常是方波、正弦波等。主要参数有频率、占空比。目前PWM已经被广泛应用在各种控制系统中,特别是各种模拟电路的控制,多数离不开PWM信号。

1.2占空比

占空比是描述PWN的参数,其定义是一个周期内高电平所占时间的占比,即占空比= t / T(其中t是高电平在一个周期内的所占时间,T为最小正周期)

————————————————— CSDN ——————————————————————

二、项目设计-检测PWN

2.1项目要求

(1)能通过示波器检测到PWN方波。

(2)数码管能显示当前PWN波形的占空比。

优化:出于减小功耗的考虑,占空比在数码管显示中多余的0不显示,例如本应显示"0050",实际显示"  50";本应显示"0006",实际显示"   6"。

(3)按键采用行列扫描,第一个按键功能是将占空比+1,第二个按键功能是将占空比-1。

(4)LED显示流水灯,每过一个PWN方波周期,下一个LED灯亮,当前LED灯灭。每个LED灯亮多久与方波低电平"0"所占时间成正比。

2.2整体设计

模块可以PWN模块、定时器模块、数码管模块、按键模块、LED模块。PWN模块可以作为主模块,因为其他模块多多少少与PWN方波占空比有关,其他模块应为子模块。先解决主模块,再一步步解决子母模块。

2.3PWN模块设计

我们选择频率f=200hz的方波。T=1/200s=5000us。将T分成100份,后面有用,即T/100=50us。

2.4定时器设计

经过2.3,将T分成100份,一份为50us,定时器就定时50us,即中断50us一次,高电平占多少份,占空比就是多少。现在先定义记录中断次数变量,然后用if语句,中断次数不超过占空比为高电平,超过为低电平。

2.5数码管模块设计

采用多个if语句,占空比变量pwn≤100(三位数)时,显示三位,在其基础上 ,pwn≤99(两位数)时,显示两位,最后,在其两个基础上,pwn(一位数)<10,显示一位。本次会介绍两种编程方法。

2.6按键模块设计

调用key.h模块,采用switch-case语句,利用返回值实现不同的功能。

2.7LED模块设计

使用库函数法,引用_crol_()循环左移函数完成流水灯功能。

————————————————— CSDN ——————————————————————

三、软件编码

3.1主程序

/******************************************************************************************
时间:2023/10/20
功能:
1.制作pwn,空占比可以通过按键自调,第一个按键空占比+1,第二个按键空占比+1
2.空占比由数码管显示
3.流水灯
4.示波器显示波形
模块:
1.主程序模块
2.定时器模块
3.数码管显示模块
4.按键模块
5.led模块
******************************************************************************************/
#include <reg51.h>
#include "display.h"
#include "delay.h"
#include "key.h"
#include <intrins.h>


void key_service();
void dis_service();
void led_service();
void Timer0_Init();
void Timer1_Init();
sbit IO3_7=P3^7;

#define IOP1 P1

unsigned char pwn=25;
unsigned char numcnd=0;

unsigned char ledcnd=0;

void main()
{
	Timer0_Init();
    Timer1_Init();
	while(1)
	{
		key_service();
		dis_service();
		led_service();
	}
}

3.2定时器模块

void Timer0_Init(void)		//50微秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0xCE;				//设置定时初始值
	TH0 = 0xFF;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	EA=1;
	ET0=1;
	TR0 = 1;				//定时器0开始计时
}

void timer0() interrupt 1
{
	TR0=0;
	numcnd++;
	if(numcnd>100)
	{
		numcnd=0;
	}
	if(numcnd<pwn)
	{
		IO3_7=1;
	}
	else
	{
		IO3_7=0;
	}
	TL0 = 0xCE;				//设置定时初始值
	TH0 = 0xFF;				//设置定时初始值
	TR0=1;
}

3.3数码管模块

void dis_service()
{
//方法一:
	unsigned char temp1,temp2,temp3,temp4;
	temp1=23;//千位数不显示,pwn范围为0~100
    temp2=pwn/100;//百位数
	temp3=pwn/10%10;//十位数
    temp4=pwn%10;//个位数
	LEDBuf[0]=temp1;
	if(pwn<100) pwn:0-99
	{
		LEDBuf[1]=23;
	}
	else //pwn:100
	{
		LEDBuf[1]=temp2;
	}
	if(pwn<10) //pwn:0-9
	{
		LEDBuf[2]=23;
	}
	else
	{
		LEDBuf[2]=temp3;
	}
	LEDBuf[3]=temp4;

//方法二:
//	if(pwn==100) //pwn:100
//	{
//		LEDBuf[0]=23;
//		LEDBuf[1]=pwn/100;
//		LEDBuf[2]=pwn/10%10;
//		LEDBuf[3]=pwn%10;
//	}
//	else if(10<=pwn&&pwn<=99) //pwn:10-99
//	{
//		LEDBuf[0]=23;
//		LEDBuf[1]=23;
//		LEDBuf[2]=pwn/10%10;
//		LEDBuf[3]=pwn%10;
//	}
//	else if(0<=pwn&&pwn<10) pwn:0-9
//	{
//		LEDBuf[0]=23;
//		LEDBuf[1]=23;
//		LEDBuf[2]=23;
//		LEDBuf[3]=pwn%10;
//	}
}	
void Timer1_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0x0F;			//设置定时器模式
	TMOD |= 0x10;			//设置定时器模式
	TL1 = 0x18;				//设置定时初始值
	TH1 = 0xFC;				//设置定时初始值
	TF1 = 0;				//清除TF1标志
	ET1=1;
	TR1 = 1;				//定时器1开始计时
}

void timer1() interrupt 3
{
	TR1=0;
	display();              //数码管显示延时1ms
	TL1 = 0x18;				//设置定时初始值
	TH1 = 0xFC;				//设置定时初始值
	TR1=1;
}

3.4按键模块

void key_service()
{
	switch(key())
	{
		case 1:pwn++;if(pwn>100)pwn=0;break;//pwn加一
		case 2:pwn--;if(pwn>100)pwn=100;break;//pwn减一
		default:break;
	}
}

3.5LED模块

void led_service()
{
	static unsigned char temp=0xfe;
    unsigned char i;
	for(i=0;i<100-pwn;i++)
	{
		IOP1=temp;//IOP1是P1接口
		temp=_crol_(temp,1);//左循环1位
		delay(5);
	}
}

————————————————— CSDN ——————————————————————

四、仿真结果

4.1波形图

占空比25%:

空占比50%:

空占比100:

空占比0%:

4.2数码管显示

4.3流水灯

———————————————————————————————————————————

本次介绍了PWN和占空比,同时提供模块代码和仿真图,帮助大家理解相关编码思路。

hi!我是博主LED-执棋困局🔥,喜欢或期待更好作品的,可以关注一下我🙏🙏🙏,我们一起进步,另外欢迎大家的点评😊!!!

下一文:电子时钟,下集更精彩。

关注博主:点击支持——LED-执棋困局
———————————————————————————————————————————
版权声明:本文为CSDN博主「LCD-执棋困局」的原创文章,转载请附上原文出处链接及本声明。
原文链接:LCD-执棋困局的文章---PWN

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值