• 51单片机晶振频率与定时中断产生pwn占空比


    单片机中晶振频率为12MHZ的机器周期怎么算?

    1、系统晶振频率是12M,则机器周期=12/12=1us;

    2、定时1ms=1*1000=1000us;

    3、工作在方式0下:最大计数值是2^13=8192;

    4、定时初值=8192-(1*1000)=7192;

    5、换算成十六进制数为:定时初值=1C18H。

    定时器中断是由单片机中的定时器溢出引起的中断,51单片机中有两个定时器t0和t1。

    定时/计数器t0和t1由两个8位专用寄存器组成,即定时/计数器t0由th0和tl0组成,t1由th1和tl1组成。

    此外,还有两个8位特殊功能寄存器tmod和tcon。tmod负责控制和确定t0和t1的功能和工作模式。tcon用于控制t0和t1的开始或停止计数,以及定时/计数器的状态。

    扩展资料:

    计时器工作流简介:

    定时器的工作过程可以按此顺序进行(以51为例,使用定时器0模式生成一个50ms的定时器)

    一、确定使用哪个计时器和使用哪种方式。在此步骤中,使用tmod进行设置。tmod的低位4位用于设置定时器0,高位4位用于设置定时器1。

    其中,m0和m1用于设置计时器的工作方式。浇口一般不需要设置。C/T选择计数模式或计时模式,如TMOD=0x01,这意味着定时器0在模式1下工作。

    二、接下来,我们需要设定时间。50毫秒的定时器,th0=65535-50000/256和tl0=65535-50000%256可以这样使用。

    可以理解为:因为这是定时器的初始值,也就是说,计数脉冲在这个数字的基础上向上增加,当它达到65535时,就会溢出并中断。

    三、第三步是打开中断,并使用ie寄存器打开总中断ea=1。此步骤对于所有中断都是必需的,然后打开定时器0中断和ET0=1。

    四、此时,准备工作完成,定时器启动,使用tcon寄存器tr0=1实现50ms的定时器。

    1. //*定时器中断函数
    2. void Timer0_Init()
    3. {
    4. //*TMOD配置:配置为0x01,为不干扰定时器1,改用如下代码
    5. TMOD&=0xF0;//把TMOD的低四位清零,高四位保持不变
    6. TMOD|=0x01;//把TMOD的低四位置1,高四位保持不变
    7. //*TCON配置
    8. TR0=1;//定时器0开始计算
    9. //*计数器配置:初值设置为64535
    10. TH0=0xFC;//设置定时初值 64535/256
    11. TL0=0x18;//设置定时初值 64535%256
    12. /********************************************
    13. 如单片机为12Mhz晶振,则
    14. 时钟周期: 1/12000000 机器周期: 12/12000000
    15. 假设定时1ms,则
    16. 次数*(12/12000000)=0.001
    17. 次数=1000
    18. 而单片机的定时器相当于一个水桶,能装65535,要让他数1000次就满,
    19. 所以要在里面提前装好65535-1000的水才可以。
    20. **********************************************/
    21. //*中断配置
    22. TF0=0;//清楚TF0标志
    23. ET0=1;//对应的定时器中断允许
    24. EA=1;//总中断允许
    25. PT0=0;//低优先级
    26. }

    直流电机调速

    1. #include
    2. #include "Delay.h"
    3. #include "Key.h"
    4. #include "Nixie.h"
    5. #include "Timer0.h"
    6. sbit Motor=P1^0;
    7. unsigned char Counter,Compare; //计数值和比较值,用于输出PWM
    8. unsigned char KeyNum,Speed;
    9. void main()
    10. {
    11. Timer0_Init();
    12. while(1)
    13. {
    14. KeyNum=Key();
    15. if(KeyNum==1)
    16. {
    17. Speed++;
    18. Speed%=4;
    19. if(Speed==0){Compare=0;} //设置比较值,改变PWM占空比
    20. if(Speed==1){Compare=50;}
    21. if(Speed==2){Compare=75;}
    22. if(Speed==3){Compare=100;}
    23. }
    24. Nixie(1,Speed);
    25. }
    26. }
    27. void Timer0_Routine() interrupt 1
    28. {
    29. TL0 = 0x9C; //设置定时初值
    30. TH0 = 0xFF; //设置定时初值
    31. Counter++;
    32. Counter%=100; //计数值变化范围限制在0~99
    33. if(Counter//计数值小于比较值
    34. {
    35. Motor=1; //输出1
    36. }
    37. else //计数值大于比较值
    38. {
    39. Motor=0; //输出0
    40. }
    41. }

  • 相关阅读:
    RFID在钢筋仓库管理中的应用
    Enterprise Architect安装与使用
    多实例安装 mysql 5.7
    数据结构——栈和队列互相实现
    8.5 Spring解决循环依赖的机理(AOP)
    【C++的OpenCV】第十四课-OpenCV基础强化(二):访问单通道Mat中的值
    业务架构·应用架构·数据架构实战~架构实践全景图
    可编程 USB 转串口适配器开发板芯片驱动文件说明
    Python大数据之PySpark(八)SparkCore加强
    UE4 回合游戏项目 17- 进入指定区域触发战斗事件
  • 原文地址:https://blog.csdn.net/u014657752/article/details/136325900