专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机PWM-呼吸灯程序

作者:寒竹子   来源:本站原创   点击数:  更新时间:2014年04月15日   【字体:

程序是在51hei单片机开发板上面做的,灯接在P0^0上,程序可以通用,到你自己的开发板或者是自己搭的电路也行.

/**
  ******************************************************************************
  *file    :     main.c
  *author  :     xr
  *date    :     2014年4月15日17:38:07 - 2014年4月15日 18:47:29
  *version :     V1.2.3
  *brief   :     PWM应用-控制小灯的亮度-实现传说中的呼吸灯效果  单片机STC89C52RC MCU 晶振 11.0592MHZ
  ******************************************************************************
  */
#include <reg52.h>

sbit ADDR0 = P1^0;   //如果是自己搭的电路,可以无视下面这几行
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

sbit PWMOUTLED = P0^0;//用于PWM控制输出

unsigned char heighHR0, heighLR0;//PWM一个周期中高电平高字节和低字节重载值
unsigned char lowHR0, lowLR0;//PWM一个机器周期中低电平时高字节和低字节重载值

void Initial();
void ConfigPWM(unsigned int fr, unsigned char dc);
void ClosePWM();

void main(void)
{
unsigned int i;
Initial();

while (1)     //呼吸灯效果
{
//LED亮->暗
ConfigPWM(100, 10);//配置PWM频率为100HZ,占空比为10%
for (i = 0; i < 30000; i++); //软件测试延时大约76ms
ConfigPWM(100, 20);//配置PWM频率为100HZ,占空比为20%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 30);//配置PWM频率为100HZ,占空比为30%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 40);//配置PWM频率为100HZ,占空比为40%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 50);//配置PWM频率为100HZ,占空比为50%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 60);//配置PWM频率为100HZ,占空比为60%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 70);//配置PWM频率为100HZ,占空比为70%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 80);//配置PWM频率为100HZ,占空比为80%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 90);//配置PWM频率为100HZ,占空比为90%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 95);//配置PWM频率为100HZ,占空比为95%
for (i = 0; i < 30000; i++);
//LED暗->亮
ConfigPWM(100, 90);//配置PWM频率为100HZ,占空比为10%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 80);//配置PWM频率为100HZ,占空比为20%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 70);//配置PWM频率为100HZ,占空比为30%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 60);//配置PWM频率为100HZ,占空比为40%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 50);//配置PWM频率为100HZ,占空比为50%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 40);//配置PWM频率为100HZ,占空比为60%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 30);//配置PWM频率为100HZ,占空比为70%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 20);//配置PWM频率为100HZ,占空比为80%
for (i = 0; i < 30000; i++);
ConfigPWM(100, 10);//配置PWM频率为100HZ,占空比为90%
for (i = 0; i < 30000; i++);
ClosePWM();
}
}

/*初始化*/
void Initial()
{
ADDR3 = 1;
ENLED = 0;//选择U3,即LED
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;//LEDS6=0
}

/*使用T0配置PWM高低电平的频率*/
void ConfigPWM(unsigned int fr, unsigned char dc)  //fr为PWM的频率,100HZ无闪烁,dc是PWM的占空比(高电平占的百分比)
{
unsigned long tmp;
unsigned int heigh, low;

tmp = 11059200/12;//一个机器周期频率
tmp = tmp / fr;  //一个机器周期中fr的频率所需计数值(包括高电平和低电平)
heigh = (tmp * dc) / 100;//高电平占dc%,所需计数值
low   = tmp - heigh;//低电平所需计数值
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;//设定T0工作方式1,16位可设定时器
TH0 = heighHR0;
TL0 = heighLR0;//装入高电平计数初值
PWMOUTLED = 1;//开始时PWM输出高电平
TR0 = 1;
ET0 = 1;
EA  = 1;
}

/*关闭PWM*/
void ClosePWM()
{
TR0 = 0;//关闭Timer0
ET0 = 0;//关闭T0中断
PWMOUTLED = 1;//PWM输出高电平
}

/*定时器T0中断服务*/
void Timer0_ISP() interrupt 1
{
//判断PWM现在输出的是高电平还是低电平
  if (PWMOUTLED)
  {
   TH0 = lowHR0;
TL0 = lowLR0;//装载低电平计数初值
PWMOUTLED = 0;//PWM输出低电平
  }
  else
  {
   TH0 = heighHR0;
TL0 = heighLR0;//重装装载高电平计数初值
PWMOUTLED = 1;//PWM输出高电平
  }
}

关闭窗口

相关文章