电力电子课设|数控产生PWM波|使用51单片机输出占空比可调PWM波(按钮控制、数码管显示)速成教程

news/2024/11/17 3:42:55/

我们学校电气专业开始做电力电子的课设了,小组选了一项制作硬件电路的任务,里面有要求采用数控方式实现DC-DC电压变换的输出电压调节,数控在电路中的体现就是用单片机输出可调占空比的PWM作用于IRF520模块,实现电压的变化,以作用于SG3525驱动IGBT。考虑到可能有同学没接触过51单片机的C语言编程,特写下此篇文章,希望能够给大家带来帮助。

选用51开发板

本人买了这本书,配套了一个开发板,懂的都懂哈,这本书非常适合初学者入门

目标分析

我们的目标:数码管显示当前输出PWM波占空比,使用按键可以调节占空比。

所以,我们需要:

1.一个引脚输出PWM波;

2.一个定时器控制PWM波的占空比;

3.若干按钮对占空比进行操作;

4.数码管显示占空比。

以下对这四个任务逐一进行拆解。

数码管

数码管有共阴极和共阳极两种,它们可通过向端子输入不同的字形码,就可在数码管显示对应的数字。

大家DIY的时候选扩展数码管最好用共阳极的数码管,因为共阳极数码管通过低电平驱动发光,要求驱动功率小。不过本教程配套的开发板上配了共阴极数码管,我们就用共阴极数码管了。

以下是详细解释为什么要使用共阳极数码管的文章:

单片机驱动共阳数码管和共阴数码管的比较-昌晖仪表网 (yunrun.com.cn)

选择数码管上的2个位,对应占空比0~99。

按钮

使用按钮需消抖。原因如下:

什么是按键消抖?为什么要消抖?_百度知道 (baidu.com)

这里选用四个按钮,详细作用见代码注释。

定时器

定时器配置内容可看看此文章:

51单片机定时器/计数器_单片机计数器_KeLin&的博客-CSDN博客

定时时间=振荡周期*12*(65536-初值)。

PWM波输出

选择一个引脚,当定时器达到初始装载时间A,引脚从高电平跳转到低电平;当定时器达到初始装载时间B,引脚从低电平跳转到高电平。

完整代码

#include<reg52.h> 
#define uchar unsigned char
//PWM周期选择:1毫秒
#define PWMZHOUQI 1000
#define JISHIMAX 65536-PWMZHOUQI
#define CHUZHI	30#define duan P0	 
sbit wei1=P2^4; //LED显示器的位
sbit wei2=P2^5;
sbit wei3=P2^6; 
sbit wei4=P2^7;
sbit k1=P3^4;	 //+1、-1
sbit k2=P3^5; //可长按
sbit k3=P3^6;	//改变变化方向
sbit k4=P3^7;	 //重置占空比
sbit output=P2^0; //PWM输出端口int is_gd=0;
int GD=	JISHIMAX*CHUZHI;//高电平时间
int zhankongbi=CHUZHI;uchar code num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};//对应数字0~9void delay(unsigned int xms)   //按键消抖用延时,单位毫秒
{unsigned int i,j;for(i=xms;i>0;i--)for(j=112;j>0;j--);}void timer0_init() 
{TMOD=0x01;//16位定时器TH0=(GD>>8)&0xFF;//初始值TL0=GD&0xFF;EA=1; //打开总中断ET0=1; //打开定时器T0中断TR0=1; //启动定时器T0}
void main()
{int dir=1;int shi;int ge;int had_press=0;output=1;is_gd=1;timer0_init();while(1){if(k4==0){delay(10);if(k4==0){while(k4==0);zhankongbi=CHUZHI;had_press=1;}}if(k3==0){delay(10);if(k3==0){while(k3==0);dir=-dir;had_press=1;	}}if(k1==0){delay(10);if(k1==0){while(k1==0);if ((zhankongbi+dir)>=0&& (zhankongbi+dir)<=99)zhankongbi+=dir;had_press=1;	}}if(k2==0){delay(10);while(k2==0){delay(10);if ((zhankongbi+dir)>=0&& (zhankongbi+dir)<=99)zhankongbi+=dir;had_press=1;	}}shi=zhankongbi/10;ge=zhankongbi%10;if (had_press){GD=JISHIMAX*zhankongbi;TH0=(GD>>8)&0xFF;//初始值TL0=GD&0xFF;is_gd=1;	}duan=num[shi];wei1=0;wei2=0;wei3=1;wei4=0;delay(5);duan=num[ge];wei1=0;wei2=0;wei3=0;wei4=1;delay(5);}
}void timer0()interrupt 1
{	if(is_gd){TH0=((JISHIMAX*(1-zhankongbi))>>8)&0xFF;//初始值TL0=(JISHIMAX*(1-zhankongbi))&0xFF;	}	if(!is_gd){TH0=(GD>>8)&0xFF;//初始值TL0=GD&0xFF;}is_gd=-is_gd;output=~output;
}


http://www.ppmy.cn/news/102125.html

相关文章

ubuntu循环登录,无法进入桌面

现象 在用户登录界面输入用户名和密码后无法正常登录&#xff0c;并且一直循环提示输入登录信息。 问题定位 1. 键入&#xff1a;ctrlaltF1&#xff0c; 进入命令行登录界面 2. 输入当前的用户名和密码&#xff08;也可以是root&#xff0c;操作需谨慎&#xff09; 3.…

泰国这场发布会,UTONMOS元宇宙游戏玩出炫酷新花样

Sensor Tower 最近发布的一项报告显示&#xff0c;全球元宇宙 App 下载量在 2022 年H1 达到 1.7 亿次&#xff0c;其中游戏达到了 1.1 亿次&#xff0c;占比 67.3%。在营收方面&#xff0c;元宇宙 App 在 H1 共获得 6.5 亿美元收入&#xff0c;游戏占 94%&#xff0c;达到 6.4 …

多线程面试题

1. 多线程的创建方式 &#xff08;1&#xff09;、继承Thread类&#xff1a;但Thread本质上也是实现了Runnable接口的一个实例&#xff0c;它代表一个线程的实例&#xff0c;并 且&#xff0c;启动线程的唯一方法就是通过 Thread类的start()实例方法。start()方法是一个 nativ…

免改造数据安全技术,实现企业关键数据资产保护落地

4月26日&#xff0c;腾讯安全联合中国信通院“数据安全推进计划”共同在深圳举办了数据安全研讨会。炼石网络创始人兼CEO白小勇受邀出席&#xff0c;分享了“免改造数据安全的实践与思考”的议题&#xff0c;与中国信息通信研究院云计算与大数据研究所高级业务主管龚诗然、腾讯…

一文说透高性能计算在仿真上的应用

“如果你的仿真还没有受到硬件限制&#xff0c;说明你的仿真还没有入门。” 对于仿真工程师来讲&#xff0c;最痛苦事情莫过于等待求解器计算。实际工程中稍微上规模的案例计算时间短则几小时&#xff0c;长则几天甚至更长。在这个过程中如果出现问题&#xff0c;还要…

数据结构并查集2 --种类并查集

前置学习&#xff1a; 数据结构并查集的学习 文章目录 种类并查集实现 例题P1892 [BOI2003]团伙题目描述题解 [NOI2001] 食物链题目描述题解 种类并查集 种类并查集是拓展并查集的一种应用。普通并查集主要解决的是朋友的朋友是朋友的一类问题。而种类并查集则要解决敌人的…

终极AI工具包--不用到处找资料了

终极AI工具包 学习 第1章&#xff1a;如何学习ChatGPT&#xff08;基础知识&#xff09; 1、什么是ChatGPT2、ChatGPT简介&#xff1a;基础知识3、什么是ChatGPT以及如何使用它 第2章&#xff1a;如何学习ChatGPT&#xff08;高级&#xff09; 从零开始到精通ChatGPT 第3…

Qt Quick系列(3)—组件component

&#x1f680;作者&#xff1a;CAccept &#x1f382;专栏&#xff1a;Qt Quick 文章目录 概念相关知识点代码示例总结 概念 在Qt Quick中&#xff0c;组件&#xff08;Component&#xff09;是一种可重用的元素&#xff0c;可以包含其他子组件或属性。它们可以用来创建自定…