标题:
求大神讲解单片机pwm调光实验
[打印本页]
作者:
563524748
时间:
2014-7-10 11:27
标题:
求大神讲解单片机pwm调光实验
#include "config.h"
// 延时函数
void delay(U32 dly)
{
U32 i;
while(--dly > 0)
{
for(i=0;i++;i<1000000);
}
}
#define TIMER0_RUN_HZ 10000 //每秒多少次进入定时器中断
#define T0RELOAD (65536 - (Fpclk/TIMER0_RUN_HZ))
// 定义一个易变型变量并初始化为0
volatile U32 SYS_Time = 0;
volatile U32 LED_PWM = 0;
void ISR_TIMER0(void) interrupt 1 using 1
{
// 重新装载定时器值
TH0 = T0RELOAD / 256;
TL0 = T0RELOAD % 256;
// 以下添加用户程序
SYS_Time++;
if(SYS_Time < LED_PWM) // PWM调光程序
{
P0 = 0; // 点亮LED灯
}else{
P0 = 0xff; // 关闭LED灯
}
if(SYS_Time > 100)SYS_Time = 0;
}
void TIMER0_Init(void)
{
TMOD &= 0xf0;
TMOD |= 0x01; // 16位计数器
TH0 = T0RELOAD / 256;
TL0 = T0RELOAD % 256;
AUXR |= 0x80; // 计数器0时钟为Fosc,即1T
PT0 = 1; // 定时器0优先级控制位, 1 为高优先级 0 为低优先级
ET0 = 1; // 定时器0中断使能
TR0 = 1; // 启动定时器
EA = 1; // 开总中断
}
// 主程序入口函数
void main(void)
{
U8 i; // 循环用变量
TR0 = 0; // 暂时关闭定时器
for(i = 0;i<3;i++)
{
P0 = 0; // 八个灯全亮
delay(50000); // 延时一段时间
P0 = 0xff; // 八个灯全灭
delay(20000); // 延时一段时间
}
TR0 = 1; // 启动定时器
while(1)
{
delay(5000); // 延时一段时间
P33 = 1; // 释放按钮1输出
if(P33 == 0) // 检测按钮1是否按下
{
LED_PWM = 0;// 熄灭LED
}
P34 = 1; // 释放按钮2输出
if(P34 == 0) // 检测按钮2是否按下
{
if(LED_PWM < 100)LED_PWM++; // 调亮LED
}
P35 = 1; // 释放按钮3输出
if(P35 == 0) // 检测按钮3是否按下
{
if(LED_PWM > 0)LED_PWM--; // 调暗LED
}
}
}
这个程序里定时器、各个变量的作用以及它们之间的关系是怎么样的,LED_PWM++;LED_PWM--; 与定时器的周期是什么关系?
作者:
a110
时间:
2014-7-17 16:43
其实这就是改变了脉冲宽度 ,相同频率的方波如果脉冲宽度越宽的话 ,在单位时间内输出了功率就越高 所以等也就会越亮
作者:
563524748
时间:
2014-7-21 09:17
a110 发表于 2014-7-17 16:43
其实这就是改变了脉冲宽度 ,相同频率的方波如果脉冲宽度越宽的话 ,在单位时间内输出了功率就越高 所以等 ...
那这个程序里LED_PWM++;LED_PWM--;每加一次和每减一次的时间和定时器的周期有什么关系呢?
作者:
西门不吹雪
时间:
2014-7-24 22:28
加减是控制亮度,周期的大小决定亮度变化的精度
作者:
154860956
时间:
2014-8-6 02:47
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1