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的定时器。

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

直流电机调速

cpp 复制代码
#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Timer0.h"

sbit Motor=P1^0;

unsigned char Counter,Compare;	//计数值和比较值,用于输出PWM
unsigned char KeyNum,Speed;

void main()
{
	Timer0_Init();
	while(1)
	{
		KeyNum=Key();
		if(KeyNum==1)
		{
			Speed++;
			Speed%=4;
			if(Speed==0){Compare=0;}	//设置比较值,改变PWM占空比
			if(Speed==1){Compare=50;}
			if(Speed==2){Compare=75;}
			if(Speed==3){Compare=100;}
		}
		Nixie(1,Speed);
	}
}

void Timer0_Routine() interrupt 1
{
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	Counter++;
	Counter%=100;	//计数值变化范围限制在0~99
	if(Counter<Compare)	//计数值小于比较值
	{
		Motor=1;		//输出1
	}
	else				//计数值大于比较值
	{
		Motor=0;		//输出0
	}
}
相关推荐
国科安芯1 小时前
ASP4644芯片低功耗设计思路解析
网络·单片机·嵌入式硬件·安全
充哥单片机设计1 小时前
【STM32项目开源】基于STM32的智能厨房火灾燃气监控
stm32·单片机·嵌入式硬件
CiLerLinux8 小时前
第四十九章 ESP32S3 WiFi 路由实验
网络·人工智能·单片机·嵌入式硬件
时光の尘8 小时前
【PCB电路设计】常见元器件简介(电阻、电容、电感、二极管、三极管以及场效应管)
单片机·嵌入式硬件·pcb·二极管·电感·三极管·场效应管
Lu Zelin8 小时前
单片机为什么不能跑Linux
linux·单片机·嵌入式硬件
宁静致远20219 小时前
stm32 freertos下基于hal库的模拟I2C驱动实现
stm32·嵌入式硬件·freertos
Wave84514 小时前
STM32--智能小车
stm32·单片机·嵌入式硬件
wdfk_prog16 小时前
[Linux]学习笔记系列 -- lib/timerqueue.c Timer Queue Management 高精度定时器的有序数据结构
linux·c语言·数据结构·笔记·单片机·学习·安全
充哥单片机设计20 小时前
【STM32项目开源】基于STM32的智能家居环境(空气质量)检测系统
stm32·单片机·嵌入式硬件
夜月yeyue20 小时前
ART 加速器、流水线与指令预测的关系详解
linux·服务器·c语言·单片机·嵌入式硬件·性能优化·嵌入式高阶技巧