单片机PWM技术实现呼吸灯和KTV等娱乐场所的灯光闪烁效果
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机PWM技术实现呼吸灯和KTV等娱乐场所的灯光闪烁效果
程序是在51hei单片机开发板上面做的,电路很简单,最小系统+P0的八个led即可.ADDR0和ENLED那是开发板上的led使能电路控制端,如果是你自己做的电路
可以删掉这几个语句.或者不用管他,不会影响程序的运行.
/**
************************************************* ************************************************* **********
* @file
:
main.c
* @author :
xr
* @date
:
2014年4月15日20:34:05 - 2014年4月15日22:28:08
* @version: V1.2.3
* @brief :
PWM技术实现呼吸灯和KTV等娱乐场所的灯光闪烁效果单片机STC89C52RC MCU 晶振 11.0592MHZ
************************************************* ************************************************* **********
*/
#include ;
//74HC138
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
//sbit PWMOUT = P0^0;//PWM输出
#define PWMOUT P0
//8个LED小灯同时呼吸
//灯光控制编码(调整PWM的占空比)
unsigned char code PWM_Table[] = {
1, 3, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50,
53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98, 99
}; //34个占空比
unsigned char heighHR0, heighLR0;//PWM高电平计数初值的高字节和低字节
unsigned char lowHR0, lowLR0;
//PWM低电平计数初值的高字节和低字节
unsigned char thr1, tlr1;
//T1计数初值高字节和低字节
unsigned long PWMCounter = 0;
//PWM设定频率后的对应的所需计数值 UL型
void Initial();
void ConfigPWM(unsigned int fr, unsigned char dc); void ConfigTimer1(unsigned int xms);
void main(void)
{
Initial();
/**********呼吸灯效果***************/ ConfigPWM(100, 5);//设定PWM的脉冲宽度为100hz,即10ms,占空比为5%,当PWM的脉冲宽度小于100HZ时,形成的是闪烁的灯光效果
ConfigTimer1(50); //定时50ms调整PWM占空比
/*PWM技术实现KTV等娱乐场所的灯光闪烁效果*/ /***************灯光闪烁****************/
/*
ConfigPWM(10, 5); //PWM脉冲宽度为10HZ,即1ms, 占空比5%
ConfigTimer1(50); //定时20ms调整PWM占空比
*/
while (1);
}
/*初始化*/
void Initial()
{
ADDR3 = 1;
ENLED = 0;//选择LED
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;//选择LEDS6,即流水灯
}
/*使用定时器T0配置PWM*/
void ConfigPWM(unsigned int fr, unsigned char dc) //参数:fr PWM配置的频率,当是100时,即是100HZ,周期是10ms,dc为占空比
{
unsigned long tmp;
unsigned int heigh, low;//分别存放高电平计数值和低电平计数值
tmp = 11059200/12;//一个机器周期的计数频率PWMCounter = tmp / fr;//一个机器周期计数频率是多少个fr计数频率,即fr频率需要的计数值
heigh = (PWMCounter * dc) / 100;//高电平所需计数值1/fr周期内高电平计数值
low
= PWMCounter - heigh;//低电平所需计数值 1/fr 周期内低电平计数值
heigh = 65536-heigh;
//高电平时定时器需要装入的初值
low
= 65536-low;
//低电平时定时器需要装入的初值
heighHR0 = (unsigned char)(heigh >;>; 8); heighLR0 = (unsigned char)heigh;
lowHR0
= (unsigned char)(low >;>; 8);
lowLR0
= (unsigned char)low;
TMOD &= 0xF0;//清零T0控制位
TMOD |= 0x01;//Timer0方式1,16位可设定定时模式TH0 = heighHR0;
TL0 = heighLR0;//装入高电平时的初值
PWMOUT = 0xFF;//开始PWM输出高电平
TR0 = 1;//启动定时器T0
ET0 = 1;//开启T0中断
EA = 1;//开总中断
}
/*配置定时器Timer1,用于定时xms调整PWM的占空比*/
void ConfigTimer1(unsigned int xms)
{
unsigned long tmp;
tmp = 11059200/12;//一个机器周期的计数频率