蓝桥杯单片机_用定时器产生PWM信号

一、PWM

PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化。
占空比就是指在一个周期内,高电平所占整个周期的比例。
我们可以通过改变PWM 信号的占空比来调节设备的通电时间,例如在LED 小灯的控制上,我们在LED的引脚上产生一个PWM 信号,那么通过改变PWM信号的占空比,则可以改变小灯一个周期内的通电时间,从而使小灯产生不同的亮度

在这里插入图片描述

二、题目+分析

1.PWM脉宽信号的频率为100Hz。
2.系统上电后L1指示灯处在熄灭状态。
3. L1指示灯有4种亮度模式,分别是完全熄灭、10%的亮度、50%的亮度和90%的亮度。
4.按下S7按键,循环切换L1指示灯的四种亮度模式。

1.51单片机中我们可以通过定时器来实现PWM信号,通过定时器来控制PWM信号的周期,把每个周期分成n等份,设高电平所占每个周期的时间为t,则t/n*100即为占空比
2.要想实现LED小灯的不同亮度,则可以通过改变LED引脚的占空比来实现。

三、详细代码

//@mzw
/*1.PWM脉宽信号的频率为100Hz。
  2.系统上电后L1指示灯处在熄灭状态。
  3. L1指示灯有4种亮度模式,分别是完全熄灭、10%的亮度、50%的亮度和90%的亮度。
  4.按下S7按键,循环切换L1指示灯的四种亮度模式。*/
#include <reg52.h>
#include <intrins.h>

sbit hc138_A=P2^5;
sbit hc138_B=P2^6;
sbit hc138_C=P2^7;

sbit LED1 = P0^0;
sbit S7 = P3^0;

unsigned char key_value = 0;//按键值
unsigned int count = 0;	//PWM占空比,小灯点亮的时间,10为满
//正常情况下占空比为高电平所占总周期的时间比,但这里因为LED为低电平点亮,所以相反
/*****配置138译码器*****/
void HC138(unsigned int n)
{
    switch(n)
    {
        case 4:
        hc138_A=0 ; hc138_B=0 ; hc138_C=1; break;
        case 5:
        hc138_A=1 ; hc138_B=0 ; hc138_C=1; break;
        case 6:
        hc138_A=0 ; hc138_B=1 ; hc138_C=1; break;
        case 7:
        hc138_A=1 ; hc138_B=1 ; hc138_C=1; break;
    }
}
/*****延时函数*****/
void delay(unsigned int k)
{
    while(k--);
}

/*****定时器TIM0初始化*****/
void TIM0_Init()
{
	TMOD = 0x01;
	TH0 = (65535 - 1000)/256;	//设置定时器初值,高八位放在TH0中,定时时间1000us = 1ms
	TL0 = (65535 - 1000)%256;	//设置定时器初值,低八位放在TL0中
	TR0 = 1;	//启动T0
	ET0 = 1;	//开T0中断
	EA = 1;		//开总中断
}
/*****定时器0中断服务函数*****/
unsigned int time = 0;	//设置计时标志,每产生一次中断则+1
void TIM0_work()	interrupt 1	//定时器0的中断号为1
{
	TH0 = (65535 - 1000)/256;	//设置定时器初值,高八位放在TH0中,
	TL0 = (65535 - 1000)%256;	//设置定时器初值,低八位放在TL0中,
	time++;
	if(time < count)
		LED1 = 0;	//点亮
	else 
		LED1 = 1;
	
	if(time == 10)//周期为10ms//频率为100HZ
		time = 0;	//清零
}

void key_scan()	//按键扫描函数
{
	if(S7 == 0)
	{
		delay(100);
		if(S7 == 0)
			key_value = 7;
		while(!S7);
	}
}

void main()
{
	char i = 0;
	HC138(5);
	P0=0x00;	//蜂鸣器和继电器初始化、、全关
	HC138(4);
	P0= 0xff;	//LED小灯初始化、、全关
	TIM0_Init();
	while(1)
	{
		key_scan();
		if(key_value == 7)
		{
			switch(i)
			{
				case 0 : count = 1; i = 1; break;
				case 1 : count = 5; i = 2; break;
				case 2 : count = 9; i = 0; break;
			}
			key_value = 0;
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值