蓝桥杯模块学习9——PWM脉冲宽度调制(深夜学习——单片机)
·
一、什么是PWM脉冲宽度调制:
对PWM简单理解(佛科院——深夜学习)_佛科院深夜学习的博客-CSDN博客
二、脉冲宽度调制实验:
1、代码思路:
(1)我们可以利用定时器规定周期为10ms(100HZ),通过调节高电平时间来产生想要的PWM波,不同的亮度对应着不同占空比。
(2)首先我们先通过定时器产生四种不同的亮度,然后编写可以转换四种不同状态的按键,走后把他们整合起来
2、公共函数:
#ifndef _PUBLIC_H
#define _PUBLIC_H
#include "STC15F2K60S2.H"
#define u8 unsigned char
#define u16 unsigned int
void Delay_1ms(u16 num);
void Close_All(void);
void Delay_10us(u16 num);
#endif
#include "Public.h"
// 延时函数(最小约1ms@12MHz)
void Delay_1ms(u16 num)
{
unsigned int i;
while(num--)
for(i=0; i<628; i++);
}
/*
输入变量:无
输出变量:无
功能:关闭蜂鸣器和继电器
*/
void Close_All(void)
{
//关闭蜂鸣器和继电器
P0 = 0x00;
P2 = (P2 & 0x1f) | 0xA0;
P2 &= 0x1f;
//关闭LED灯
P0 = 0xff;
P2 = (P2 & 0x1F) | 0x80;
P2 &= 0x1f;
}
void Delay_10us(u16 num)
{
u16 i;
while(num--)
for(i=0; i<3; i++);
}
- 主函数:
// 使用程序前,将J13调整为IO模式(2-3脚短接)
#include "Public.h"
u8 ms_count,h_time;
u8 key_old,key_delay;
void LED_ON(u8 L_X);
void Timer_0_Init(u16 time);
void Key_Proc();
// 主函数
void main(void)
{
Close_All();
Timer_0_Init(1000);//1ms
while(1)
{
Key_Proc();
}
}
/*****************定时器**********************/
/*
输入变量:定时时长___us
输出变量:无
功能:配置并开启定时器0
*/
void Timer_0_Init(u16 time)
{
//12T模式
AUXR &= 0x7f;
//定时器0 模式0
TMOD &= 0xf0;
//设置初值
TH0 = (65536-time)/256;
TL0 = (65536-time)%256;
//打开中断
ET0 = 1;
EA = 1;
//开始计数
TR0 = 1;
}
void Timer_0_IT(void) interrupt 1
{
if(++key_delay == 10) key_delay = 0;
ms_count++;
if(ms_count <= h_time)
LED_ON(~(0x01<<0));
else
LED_ON(0xff);
if(ms_count == 10)
ms_count = 0;
}
/***************LED*******************/
/*
输入变量:P0口的对应的16进制数
输出变量:无
功能:选择相应的锁存器后,通过P0口控制LED灯亮
*/
void LED_ON(u8 L_X)
{
P0 = L_X;
P2 = (P2 & 0x1f) | 0x80;
P2 &= 0x1f;
}
/*****************按键*******************/
/*
输入变量:无
输出变量:7-4代表第几个按键被按下;0代表没有按键按下
功能:检测哪个独立按键被按下
注意:只有消抖,没有松手检测
*/
u8 Key_read()
{
u8 i;
for(i=0;i<4;i++)
{
if(!(P3 & (0x01<<i)))
{
return 7-i;
}
}
return 0;
}
void Key_Proc()
{
u8 key_now=0,key_down=0;
static u8 state=1;
//消抖,同时节省CPU资源
if(key_delay) return;
key_delay = 1;
//读取按键按下的编号
key_now = Key_read();
//按键按下:通过判断按键状态是否发生变化,并且变化后状态是否为按下
key_down = key_now & (key_old ^ key_now);
//记录当前状态为下一次检测做准备
key_old = key_now;
if(key_down == 7)//按键按下
state++;
switch(state)
{
case 1:h_time = 0;break;
case 2:h_time = 1;break;
case 3:h_time = 5;break;
case 4:h_time = 9;break;
}
if(state == 5)state = 1;
}
更多推荐




所有评论(0)