宜昌百度网站建设,网页设计 html,万网主机服务,网站设计维护合同单片机中晶振频率为12MHZ的机器周期怎么算?
1、系统晶振频率是12M#xff0c;则机器周期#xff1d;12#xff0f;12#xff1d;1us#xff1b;
2、定时1ms#xff1d;1#xff0a;1000#xff1d;1000us#xff1b;
3、工作在方式0下#xff1a;最大计数值是2则机器周期12121us
2、定时1ms110001000us
3、工作在方式0下最大计数值是2138192
4、定时初值8192110007192
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用于设置计时器的工作方式。浇口一般不需要设置。CT选择计数模式或计时模式如TMOD0x01这意味着定时器0在模式1下工作。
二、接下来我们需要设定时间。50毫秒的定时器th06553550000256和tl06553550000256可以这样使用。
可以理解为因为这是定时器的初始值也就是说计数脉冲在这个数字的基础上向上增加当它达到65535时就会溢出并中断。
三、第三步是打开中断并使用ie寄存器打开总中断ea1。此步骤对于所有中断都是必需的然后打开定时器0中断和ET01。
四、此时准备工作完成定时器启动使用tcon寄存器tr01实现50ms的定时器。
//*定时器中断函数
void Timer0_Init()
{//*TMOD配置配置为0x01为不干扰定时器1改用如下代码TMOD0xF0;//把TMOD的低四位清零高四位保持不变TMOD|0x01;//把TMOD的低四位置1高四位保持不变//*TCON配置TR01;//定时器0开始计算//*计数器配置初值设置为64535TH00xFC;//设置定时初值 64535/256TL00x18;//设置定时初值 64535%256/********************************************如单片机为12Mhz晶振,则 时钟周期: 1/12000000 机器周期: 12/12000000假设定时1ms,则次数*(12/12000000)0.001则 次数1000而单片机的定时器相当于一个水桶能装65535,要让他数1000次就满所以要在里面提前装好65535-1000的水才可以。**********************************************///*中断配置TF00;//清楚TF0标志ET01;//对应的定时器中断允许EA1;//总中断允许PT00;//低优先级
}
直流电机调速
#include REGX52.H
#include Delay.h
#include Key.h
#include Nixie.h
#include Timer0.hsbit MotorP1^0;unsigned char Counter,Compare; //计数值和比较值用于输出PWM
unsigned char KeyNum,Speed;void main()
{Timer0_Init();while(1){KeyNumKey();if(KeyNum1){Speed;Speed%4;if(Speed0){Compare0;} //设置比较值改变PWM占空比if(Speed1){Compare50;}if(Speed2){Compare75;}if(Speed3){Compare100;}}Nixie(1,Speed);}
}void Timer0_Routine() interrupt 1
{TL0 0x9C; //设置定时初值TH0 0xFF; //设置定时初值Counter;Counter%100; //计数值变化范围限制在0~99if(CounterCompare) //计数值小于比较值{Motor1; //输出1}else //计数值大于比较值{Motor0; //输出0}
}