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
	}
}
相关推荐
17(无规则自律)23 分钟前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
芯岭技术29 分钟前
PY32MD310单片机:高性能、低功耗的32位电机控制微控制器
单片机·嵌入式硬件
wotaifuzao1 小时前
STM32 + FreeRTOS 的订阅通知组件架构
stm32·嵌入式硬件·架构·freertos·事件驱动·嵌入式架构
小龙报2 小时前
【51单片机】深度解析 51 串口 UART:原理、配置、收发实现与工程化应用全总结
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·51单片机
Lester_11019 小时前
STM32 高级定时器PWM互补输出模式--如果没有死区,突然关闭PWM有产生瞬间导通的可能吗
stm32·单片机·嵌入式硬件·嵌入式软件
小李独爱秋11 小时前
“bootmgr is compressed”错误:根源、笔记本与台式机差异化解决方案深度指南
运维·stm32·单片机·嵌入式硬件·文件系统·电脑故障
梁洪飞13 小时前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
进击的小头13 小时前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
宵时待雨16 小时前
STM32笔记归纳8:时钟
笔记·stm32·单片机·嵌入式硬件
JJRainbow17 小时前
SN75176 芯片设计RS-232 转 RS-485 通信模块设计原理图
stm32·单片机·嵌入式硬件·fpga开发·硬件工程