【蓝桥杯单片机】PWM笔记

一、实现设置

定义一个边界例如为10,一个占空比在0-10之间。定义一个计数参数,在计时器中递增。

当计数参数小于占空比时亮灯;当计数参数大于于占空比时灭灯。

在设置占空比的函数中,每5次中断后更新占空比递增或递减(呼吸灯)/直接设置(电位器控制)。

二、呼吸灯/电位器控制代码示例

//呼吸灯实验现象:L1亮0.5秒灭0.5秒循环
//电位器控制实验现象:L1的亮度随RB2输出变化

//定时器定时1ms,边界为10,每5次更新一次占空比,递增占空比进行10次后,进入递减,故单次亮灭用时1*10*5*10=500ms

#include "stc15f2k60s2.h"
#include "iic.h"
#include "intrins.h"

code unsigned char SegNoDot_Table[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };

unsigned char Volt = 0;
unsigned char count = 0;
unsigned char pwm_duty = 0;
unsigned char flag = 0;
unsigned char stat_led = 0xff;
unsigned char times = 0;
unsigned char go = 0;
unsigned char PCF8591_Read();

void HC573_Choose(unsigned char channel, unsigned char value)
{
	P2 = (P2 & 0x1f) | 0x00;
	P0 = value;
	switch(channel)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
			break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
			break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
			break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
			break;
	}
	P2 = (P2 & 0x1f) | 0x00;
	
}

void DelaySMG(unsigned int t)
{
	while(t--);
}

void DisplaySMG_bit(unsigned char pos, unsigned char dat)
{
	HC573_Choose(6,0x01 << pos);
	HC573_Choose(7,dat);
	DelaySMG(500);
	HC573_Choose(6,0x01 << pos);
	HC573_Choose(7,0xff);
}

void DisplaySMG_All(unsigned char value)
{
	HC573_Choose(6,0xff);
	HC573_Choose(7,value);
}

void DisplaySMG_Function()
{
	DisplaySMG_bit(7,SegNoDot_Table[Volt % 10]);
	DisplaySMG_bit(6,SegNoDot_Table[Volt / 10 % 10]);
	DisplaySMG_bit(5,SegNoDot_Table[Volt / 100]);
}

void Init_Timer0()
{
	TMOD = 0x00;
	TH0 = (65535-1000)/256;
	TL0 = (65535-1000)%256;
	ET0 = 1;
	EA = 1;
	TR0 = 1;
}

void Service_Timer0() interrupt 1 //在小于占空比时亮,大于时灭
{
	count++;
	if(count <= pwm_duty)
	{
		flag = 1;
	}
	else if(count <= 10)
	{
		
		flag = 0;
	}
	else
	{
		count = 0;
		times++;
	}
}

unsigned char PCF8591_Read()
{
	unsigned char temp;
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x03);
	I2CWaitAck();
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	temp = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	return temp;
}


void Function()
{
	
	if(times == 5)
	{
		times = 0; //减轻了低亮度的闪烁情况
		
		//电阻器控制亮度
		Volt = PCF8591_Read();
		pwm_duty = Volt * 10 / 255;
		
		//呼吸灯
		/*if(go == 0)
		{
			pwm_duty = pwm_duty + 1;
			if(pwm_duty == 11)
			{
				pwm_duty = 10;
				go = 1;
			}
		}
		else if(go == 1)
		{
			pwm_duty = pwm_duty - 1;
			if(pwm_duty == 255)
			{
				pwm_duty = 0;
				go = 0;
			}
		}*/
	}

	if(flag == 1)
	{
		stat_led = 0xfe;
	}
	else
	{
		stat_led = 0xff;
	}
}

void Init_sys()
{
	HC573_Choose(4,0xff);
	HC573_Choose(5,0x00);
	DisplaySMG_All(0xff);
	Init_Timer0();
}

void main()
{
	Init_sys();
	while(1)
	{
		Function();
		HC573_Choose(4,stat_led);
		DisplaySMG_Function();
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值