51单片机学习笔记:定时器产生PWM可调方波,控制led灯亮度

发布者:SparkCrafter最新更新时间:2017-02-19 来源: eefocus关键字:51单片机  定时器  PWM  可调方波  led灯亮度 手机看文章 扫描二维码
随时随地手机看文章

使用定时器T0产生PWM方波,

用按键调整占空比,20级可调

控制led灯的亮度等级.

 

C代码  收藏代码

  1. #include  "my51.h"  

  2. #include  "timer0.h"  

  3.   

  4. #define grading    20          //亮度20级变化  

  5. sbit keyS3=P3^5;               //按键调整占空比,PWM_keyChange++  

  6. sbit keyS4=P3^6;               //               PWM_keyChange--  

  7.   

  8. u8 PWM_keyChange=10;           //初值,按键调整在1~20之间变化  

  9.                                //占空比   PWM_keyChange/grading  

  10.   

  11. void T0_work()                 //本函数由T0定时器中断函数调用  

  12. {     

  13.     if(timeMultiple1Flag)  

  14.     {         

  15.         led=off(7);            //关闭7号灯  

  16.         timeMultiple1Flag=0;   //清定时器复用置位标志  

  17.     }  

  18.       

  19.     if(timeMultiple2Flag)  

  20.     {         

  21.         led=on(7);             //打开7号灯  

  22.         timeMultiple2Flag=0;   //清定时器复用置位标志  

  23.     }         

  24. }  

  25.   

  26. void main()                     //测试  

  27. {  

  28.     u8 keyFlag=1;               //程序中没有消抖处理,只是简易的按键进出自锁标志  

  29.     led0=ledon;                 //先打开0号灯,用于和7号灯对比亮度       

  30.     initT0(1,10,grading);       //1毫秒的基本定时,亮的时间1*10毫秒,暗1*(grading-10)毫秒  

  31.     while(1)  

  32.     {  

  33.         if(0==keyS3)  

  34.         {  

  35.             if(keyFlag)                       //防止一次按键中多次执行  

  36.             {  

  37.                 keyFlag=0;                    //清标志,类似同步锁  

  38.                 if(++PWM_keyChange>grading)  

  39.                 {  

  40.                     PWM_keyChange=grading;    //占空比最大100%  

  41.                 }  

  42.                 initT0(1,PWM_keyChange,grading);      

  43.             }             

  44.         }  

  45.         else if(0==keyS4)  

  46.         {  

  47.             if(keyFlag)  

  48.             {  

  49.                 keyFlag=0;  

  50.                 if(0==--PWM_keyChange)              //占空比减小  

  51.                 {  

  52.                     PWM_keyChange=1;                //最小占空比 1/20  

  53.                 }     

  54.                 initT0(1,PWM_keyChange,grading);    //占空比减小  

  55.             }  

  56.         }  

  57.         else  

  58.         {  

  59.             keyFlag=1;  //按键锁释放标志,下一次按键时允许调整占空比  

  60.         }  

  61.     }  

  62. }  

 

C代码  收藏代码

  1. #ifndef _MY51_H  

  2. #define _MY51_H  

  3. #include   

  4. //#include   

  5. #include   

  6. #include   

  7. #include "mytype.h"  

  8.   

  9.   

  10. #ifndef _51LED_  

  11. #define _51LED_  

  12. #define led       P1                 //P1总线连8个led灯,灯连573锁存器,P1置低电平点亮  

  13. #define LED       led  

  14. #define ON(x)     P1&(~(1<<(x)))   //打开某个灯,开多个灯用 ON(m) & ON(n)  

  15. #define OFF(x)    P1|(1<<(x))      //关闭某个灯,关多个灯用 OFF(m)| OFF(n)  

  16. #define on(x)     ON(x)              //包含大小写  

  17. #define off(x)    OFF(x)  

  18.   

  19. #define ledon     0                  //某个灯,打开  

  20. #define ledoff    1                  //某个灯,关闭  

  21.   

  22. sbit led0=P1^0;       

  23. sbit led1=P1^1;  

  24. sbit led2=P1^2;  

  25. sbit led3=P1^3;  

  26. sbit led4=P1^4;  

  27. sbit led5=P1^5;  

  28. sbit led6=P1^6;  

  29. sbit led7=P1^7;   

  30. sbit ledLock=P2^5;  //锁定当前8个led的状态,0锁定 ,1不锁定  

  31.   

  32. #endif  

  33.   

  34. /*************二进制输入宏****************************/  

  35. #ifndef _LongToBin_  

  36. #define LongToBin(n) \               

  37. (                    \   

  38. ((n >> 21) & 0x80) | \   

  39. ((n >> 18) & 0x40) | \   

  40. ((n >> 15) & 0x20) | \   

  41. ((n >> 12) & 0x10) | \   

  42. ((n >> 9)  & 0x08) | \   

  43. ((n >> 6)  & 0x04) | \   

  44. ((n >> 3)  & 0x02) | \   

  45. ((n ) & 0x01)        \   

  46. )  

  47. #define  bin(n)  LongToBin(0x##n##l)  

  48. #define  BIN(n)  bin(n)  

  49. #define  B(n)    bin(n)  

  50. #define  b(n)    bin(n)             

  51. #endif  

  52.   

  53. /*************单个数据位的置位宏*********************/  

  54. #ifndef   _BIT_  

  55. #define   BIT(n)   (1<

  56. #define   bit(n)   BIT(n)  

  57. #endif  

  58.   

  59. #define high    1   //高电平  

  60. #define low     0   //低电平  

  61.   

  62.   

  63. sbit beep=P2^3;     //蜂鸣器  

  64.   

  65. extern void delayms(u16 ms);  

  66. extern void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085  

  67. /////////////////////////////////////////////////////////////////////////////  

  68.   

  69.   

  70. #endif  

 

C代码  收藏代码

  1. #ifndef _TIMER0_H  

  2. #define _TIMER0_H  

  3. #include "my51.h"  

  4.   

  5.   

  6. extern u8   timeMultiple1Flag; //中断时间复用置位标志,须手动清零  

  7. extern u8   timeMultiple2Flag; //中断时间复用置位标志,须手动清零  

  8. extern void T0_work();         //该函数未实现,需外部实现  

  9. extern void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) ; //定时器初始化  

  10.   

  11.   

  12. #endif  

 

C代码  收藏代码

  1. #include "timer0.h"  

  2.   

  3. u8   TH0Cout=0 ;         //初值     

  4. u8   TL0Cout=0 ;         

  5. u16  T0IntCouts1=0;          //中断计数  

  6. u16  T0IntCouts2=0;          //中断计数  

  7. u16  timeMultiple1=0;     //中断复用时间的倍数  

  8. u16  timeMultiple2=0;     //中断复用时间的倍数  

  9. u8   timeMultiple1Flag=0; //中断时间复用置位标志,须手动清零  

  10. u8   timeMultiple2Flag=0; //中断时间复用置位标志,须手动清零  

  11.   

  12. //开启定时器,定时完成后需要手动关闭TR0,否则将循环定时  

  13. //参数一是定时的毫秒数,参数二和三是定时基时的倍率数(定时复用)  

  14. void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2)       //定时器初始化设定,ms取值不超过65  

  15. {     

  16.     u16   N=11059.2*ms/12;               //定时器总计数值  

  17.     TR0=STOP;                            //停掉定时器  

  18.     ET0=CLOSE;                           //关定时器中断  

  19.   

  20.     //对于110592晶振,ms为5的整数倍时没有计算误差,但ms最大不超过71毫秒  

  21.     TH0Cout =(65536-N)/256;              //装入计时值零头计数初值  

  22.     TL0Cout =(65536-N)%256;  

  23.     if(0==t_multiple1)    //0倍的基准时间是不合理的,至少1倍  

  24.     {  

  25.         t_multiple1=1;    

  26.     }  

  27.     if(0==t_multiple2)    //0倍的基准时间是不合理的,至少1倍  

  28.     {  

  29.         t_multiple2=1;    

  30.     }  

  31.     timeMultiple1=t_multiple1;       //倍时  

  32.     timeMultiple2=t_multiple2;       //倍时  

  33.     TMOD &= 0xf0;                    //清定时器0配置  

  34.     TMOD |= 0x01;                    //配置定时器0的工作方式为1  

  35.       

  36.     EA =OPEN;           //打开总中断  

  37.     ET0=OPEN;           //打开定时器中断  

  38.   

  39.     TH0=TH0Cout;        //定时器装入初值  

  40.     TL0=TL0Cout;  

  41.     TR0=START;          //启动定时器  

  42. }  

  43. void T0_times() interrupt 1           //T0定时器中断函数  

  44. {  

  45.     TH0=TH0Cout;                      //重装初值  

  46.     TL0=TL0Cout;  

  47.     if(++T0IntCouts1==timeMultiple1)  //判断是否复用定时器  

  48.     {     

  49.         T0IntCouts1=0;                //中断次数清零,重新计时  

  50.         timeMultiple1Flag=1;          //复用定时器标志,须在T0_work()中手动清零  

  51.     }  

  52.     if(++T0IntCouts2==timeMultiple2)  //判断是否复用定时器  

  53.     {     

  54.         T0IntCouts1=0;                //这个也要清,防止到达最小公倍数时乱掉  

  55.         T0IntCouts2=0;                //中断次数清零,重新计时  

  56.         timeMultiple2Flag=1;          //复用定时器标志,须在T0_work()中手动清零  

  57.     }  

  58.     T0_work();                        //调用工作函数  

  59. }  

 


关键字:51单片机  定时器  PWM  可调方波  led灯亮度 引用地址:51单片机学习笔记:定时器产生PWM可调方波,控制led灯亮度

上一篇:51单片机学习笔记:ST7920控制器的12864液晶使用总结
下一篇:51单片机学习笔记:写了个led宏,并尝试控制led灯的亮度

推荐阅读最新更新时间:2024-03-16 15:33

stm32定时器的ETR、CH1N、CH2N、CH3N
一、CH1N、CH2N、CH3N是高级定时器才有的引脚,是CH1、CH2、CH3的互补引脚,用来做三相电机控制的。 二、ETR 首先定时器的时钟来源有4种: 1、内部时钟(CK_INT) 2、外部时钟模式1:外部输入引脚 3、外部时钟模式2:外部触发输入ETR 4、内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器。如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。 其中的第3种就是ETR,即把外部信号接到ETR引脚上,当ETR引脚上有上升沿或下降沿,就会触发定时器计数。 使用步骤: 1、TIMx_SMCR寄存器中的ETF 用来设置滤波器。 2、TI
[单片机]
stm32<font color='red'>定时器</font>的ETR、CH1N、CH2N、CH3N
STM32定时器输出PWM
一、PWM 1.定义 英文全称:PULSE WIDTH MODULATION,脉冲宽度调制。 脉冲:频率,方波 宽度:占空比(duty),高电平的宽度 2.用途 (1)控制输出的电压和电流 (2)灯光的亮度 (3)电机 二、编程细节 PWM输出是没有中断触发的,PWM由硬件输出波形,用了中断反而会影响系统定时的效率。 所以,记住以后使用定时器输出PWM都不需要使用到中断 1.如配置STM32F407的TIM14的通道1,10ms即100Hz. 1ms = 0.01s=100HZ 84000000 /8400 = 10000 10000/x = 100 x=100 得到周期8400-1,分频系数10-1 基本
[单片机]
STM32<font color='red'>定时器</font>输出<font color='red'>PWM</font>
51单片机做的74HC595驱动控制LED
51单片机做的74HC595驱动控制LED 单片机代码如下: #include reg51.h #include intrins.h sbit SRCLK=P3^6; sbit RCLK=P3^5; sbit SER=P3^4; void Hc595SendByte(unsigned char dat); void Delay10ms(unsigned int ) ; void main() { unsigned char ledNum; ledNum=0xfe; while(1) { Hc595SendByte(ledNum); ledNum=_c
[单片机]
Allegro MicroSystems, LLC推出全新四路DMOS全桥式PWM电机驱动器IC
美国马萨诸塞州伍斯特市 Allegro MicroSystems, LLC发布全新四路DMOS全桥式驱动器IC A5988,它能够驱动多达两个步进电机或四个直流电机,每一全桥式输出额定值可达1.6A和40V。A5988集成有固定停机时间脉宽调制(PWM)电流稳压器,以及2位非线性DAC(数模转换器),可允许步进电机以整步、半步、以及四分之一步进模式控制,直流电机则能够以正转、反转及自由停机模式(coast modes)控制。PWM电流稳压器采用了Allegro 已获专利的混合衰减模式,以减轻可闻电机噪声、提高步进精度、并降低功耗。新器件面向消费产品和办公室自动化市场,终端应用包括闭路电视(摇摄和斜摄)应用、扫描仪、POS机,以及激
[电源管理]
Allegro MicroSystems, LLC推出全新四路DMOS全桥式<font color='red'>PWM</font>电机驱动器IC
stm8S毫秒定时器
#include tim4.h #include stm8s_tim4.h #define TIM4_PERIOD 124 void Dely1ms(void) { TIM4_DeInit(); /* Time base configuration */ // 8M/64=125000HZ // (x + 1)/125000=0.001s = 1ms // x = 124 TIM4_TimeBaseInit(TIM4_PRESCALER_64, TIM4_PERIOD); /* Clear TIM4 update flag */ TIM4_ClearFlag(TIM4_FLAG_UPDATE); /* Enable update
[单片机]
51单片机在wave6000下编程如何实现几个模块的结合
本文主要是关于wave6000的相关介绍,并着重对51单片机在wave6000下编程如何实现几个模块的结合进行了详尽的阐述。 wave6000 wave6000,这个软件是南京伟福公司的单片机开发软件,一般就是用在C51单片机。不需要购买仿真器,使用软件模拟器就可以了,使用很方便的。 也支持KEILC,但最好不要在WAVE内使用C,如果想用C编写,还是用KEIL C方便。 WAVE6000编译软件,采用中文界面。用户源程序大小不受限制,有丰富的窗口显示方式,能够多方位、动态地展示程序的执行过程。其项目管理功能强大,可使单片机程序化大为小,化繁为简,便于管理。另外,其书签、断点管理功能以及外设管理功能等为51单片机的仿真带来
[单片机]
51单片机1s延时程序设计
#include sbit P1_0 = P1^0; void Delay(); // 下面引用时一定要和这里的大小写一致否则会有警告或错误 void Main() { while (1) // 开始一直循环 { P1_0 = 0; Delay(); // 没有参数也要加 () 否则会有Warning P1_0 = 1; Delay(); } } void Delay() // 12M晶振1s延时 { unsigned char h, i, j, k; for (h = 5; h 》 0; h--) for (i = 4; i 》 0; i--) for (j = 116; j 》 0; j--) for (k = 214;
[单片机]
<font color='red'>51单片机</font>1s延时程序设计
Intersil :卫星电源管理解决方案
Intersil Supported Functions ______________________________________________________________________ PWM IS-1825ASRH-Single Event and Total Dose Hardened, High-Speed, Dual Output PWM IS-1845ASRH-Single Event Rad-Hard High Speed, Current Mode PWM HS-1825ARH-Rad-Hard High-Speed, Dual Output PWM FET Driver ISL74422
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved