51单片机之定时器实现PWM(内有示波器使用说明)

一、前言

       本篇主要讲一下51单片机定时器实现PWM,并且使用到keil的示波器方便大家对定时器实现的PWM做一个直观的了解。  在此之前相信大家都对PWM(脉冲宽度调制)或多或少的都有一定了解。下面来一个简单的演示:

二、实现过程

(一)代码部分

#include <reg51.h>

#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long

sbit GPIO_OUT= P3 ^ 1; //定义P3^1口为输出

uchar Counter = 0, Compare = 5;
ulong Ture_int = 0, Flast_int = 0; //用于记录高低电平产生的次数,本代码没有使用

void Timer0Init(void) //100微秒@12.000MHz
{
	TMOD &= 0xF0; //设置定时器模式
	TMOD |= 0x02; //设置定时器模式
	TL0 = 0x9C;	  //设置定时初值
	TH0 = 0x9C;	  //设置定时重载值
	TF0 = 0;	  //清除TF0标志
	TR0 = 1;	  //定时器0开始计时
	ET0 = 1;	  //定时器0中断开关
	EA = 1;		  //中断总开关
}
void main()
{
	Timer0Init();
	while (1)
	{
	}
}

void Timer0_Routune() interrupt 1 //中断函数,定时器0的中断号为1
{
	if (Counter == 20)
	{
		Counter = 0;
	}
	Counter++;
	if (Counter <= Compare)
	{
		//Ture_int++;
		GPIO_OUT = 0;
	}
	else
	{
		//Flast_int++;
		GPIO_OUT = 1;
	}
}

(二)定时器选择和设置

        本次使用了定时器0,方式二(8位自动重载),设置成每100us就中断一次。当TL0加到FF(256)就会产生一次中断,并执行中断函数。所以如果我们想定时器100us产生一次中断的话就需要给TL0一个9C(156)的值,因为机器使用的时钟是12MHZ,每1us产生一个计数脉冲。

(三)PWM原理

        实现PWM就需要对我们的脉冲宽度进行一个设定了,这里我把它放在了中断函数里面,每进入一次中断函数,counter计数值就会加一,如果counter小于我们设定的compare比较值,就会保持GPIO_OUT为低电平。直到进行到某次我们的counter比我们的compare大,就会对GPIO_OUT高电平。因此我们只需要修改compare就可以实现脉冲宽度的设定了。如上述代码,我们将compare设置成5,就会得到下面的波形图: 

keil中的示波器

 可以看到高电平占一个周期的四分之一。因为只有当counter累加到20才会重新置零。我们也可以修改累加置零的值来改变这个波形的频率。

我们也不难看出这个波形的频率为500hz,虽然只有500hz但是用来控制LED灯的亮度是一点问题也没有。

三、keilC51的使用说明

1、首先需要设置好我们的晶振频率,方便计算起见我这里使用的是12MHZ。

2、debug的设置

 

3、点击仿真,开始后找到示波器

4、按图中的步骤设置好,在其中输入PORT3.1。Display type选择bit(很多时候看不到波形就是这里搞错了)

5、设置完成后

6、点击开始执行后,马上就可以按停止执行查看波形了。

四、最后

以上就是使用51单片机定时器实现PWM的基本过程,如有错漏还望指出。

回答: 要使用keil5虚拟示波器,首先需要安装keil mdk,并下载工具Keil Array Visualization V1.0。然后打开相关选项,包括打开update选项和打开TCP端口号相关选项。\[1\]在虚拟环境下查看输出PWM的周期和频率,可以全速运行输出波形后,用鼠标滚轮改变PWM波的大小,选中波形的一个位置,图形底部会出现时间1。再将鼠标放在一个PWM结束的地方,会出现时间2。周期可以通过时间2减去时间1来计算,频率可以通过周期的倒数得到。如果选取两个PWM波,只需将结果除以2即可。占空比的计算类似,只需要计算高电平(低电平)的时间,然后除以周期即可。\[2\]在使用keil5虚拟示波器之前,还需要更改一些配置,包括选择debug并勾选use silmlator,然后根据实际需求更改配置。然后点击调试按钮,再点击虚拟示波器按钮进入软件仿真界面。点击setup进入配置界面,添加要检测输出的GPIO引脚号,并选择display type为bit。最后点击全速运行按钮,就可以看到波形的输出了。\[3\] #### 引用[.reference_title] - *1* [keil MDK使用虚拟示波器](https://blog.csdn.net/u011046042/article/details/80750817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [如何使用Keil5中的虚拟示波器进行软件仿真](https://blog.csdn.net/weixin_43737995/article/details/98049869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值