资讯详情

51单片机PWM-呼吸灯程序

程序是在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应用-控制小灯的亮度-实现传说中的呼吸灯效果单片机C89C52RC 晶振 11.0592MHZ ****************************************************************************** */ #include <reg52.h> sbit A0 = 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 heigh0, 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_I() interrupt 1 { //判断PWM现在输出的是高电平还是低电平 if (PWMOUTLED) { TH0 = lowHR0; TL0 = lowLR0;//装载低电平计数初值 PWMOUTLED = 0;//PWM输出低电平 } else { TH0 = heighHR0; TL0 = heighLR0;//重装装载高电平计数初值 PWMOUTLED = 1;//PWM输出高电平 } }

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台