‘壹’ 单片机指令周期的计算
计算方法:PIC单片机的每四个时钟周期为一个内部指令周期,例如:8MHz的晶振,则内部指令周期为1/(8/4)= 0.5 uS
实例一:35us, 8MHz的晶振, 8位定时器, 分频比1/2 , 初值 E4
实例二:156.25us , 32768Hz的晶振, 8位定时器, 分频比1/32 , 初值 FC
计算方法一: 35 = =(256-初值)*分频*4/晶振 + 14/分频 =(256-初值)+14/2
计算方法二:0.015625 =(256-初值)*分频*4/晶振 = (256-初值)*32*4/32768
特别注意:分频比1-8 需要加上一个14/分频
指令周期是指令周期执行某一条指令所消耗的时间,它等于机器周期的整数倍。传统的80C51单片机的指令周期大多数是单周期指令,也就是指令周期=机器周期,少部分是双周期指令。
(1)pic单片机定时器初值计算扩展阅读
在MCS-51系统中,有单周期指令,双周期指令。四周期指令只有乘,除两条指令。指令的运算速度和它的机器周期直接相关,机器周期数较小则执行速度快。
在编程时要注意选用具有同样功能而机器周期数小的指令。每一条指令的执行都可以包括取指和执行两个阶段。在取指阶段,CPU从内部或者外部ROM中取出指令操作码及操作数,然后再执行这条指令。
在8051指令系统中,根据各种操作的繁简程度,其指令可由单字节,双字节和三字节组成。从机器执行指令的速度看,单字节和双字节指令都可能是单周期或双周期,
而三字节指令都是双周期,只有乘,除指令占四个周期,一条指令的字节数表征这条指令在存储器中所占空间大小,而周期数表征运行这条指令所花时间长短,即运行速度。
‘贰’ 在PIC单片机中,如何用一个普通的I/O端口输出一个38K的频率求解答,在线等,谢谢!
12MHZ晶振
#include<reg52.h>
#define uchar unsigned char
sbit PULS=P1^0;
void main()
{
TMOD=0x01; //设置定时器0位工作模式1(M1,M0位0,1)
TH0=(65536-600)/256;
TL0=(65536-600)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
while(1) ;
}
void T0_time()inte rrupt 1
{
TH0=(65536-600)/256; //重新装载初值
TL0=(65536-600)%256;
PULS=!PULS;
}
‘叁’ pic单片机 实现10ms定时的简单程序
这个可以用几种办法:
1、直接用软件延时,如用以下的DELAY()延时子程序,如要延时5ms,直接调用DELAY(5)就好了,但这种是纯软件的延时。
//======延时(n)ms,在4MHz晶振下!!!
void DELAY(uint n)
{ uint j;
uchar k;
for (j=0;j<n;j++)
for (k=246;k>0;k--) NOP();
}
2、用定时器延时,要通过计算延时的时间来确定延时的常数(分频比和定时器初值)。
‘肆’ 单片机中的12分频是什么意思
单片机中的12分频是单片机的标准运算速度是晶振的12分之1。
计算方法:PIC单片机的每四个时钟周期为一个内部指令周期,例如:8MHz的晶振,则内部指令周期为1/(8/4)= 0.5 uS
计数周期
1、时钟周期=振荡周期,名称不同而已,是指为单片机提供时钟信号的振荡源的周期,都是等于单片机晶振频率的倒数,如常见的外接12M晶振,那它的时钟周期=1/12M。
2、机器周期,8051系列单片机的机器周期=12*时钟周期。之所以这样分是因为单个时钟周期根本干不了一件完整的事情(如取指令、写寄存器、读寄存器等),而12个时钟周期就能基本完成一项基本操作了。
3、指令周期,一个机器周期能完成一项基本操作,但一条指令常常是需要多项基本操作结合才能完成,完成一条指令所需的时间就是指令周期,当然不同的指令,其指令周期就不一样的了。MCS-51系统中,有单周期指令、双周期指令和四周期指令。
(4)pic单片机定时器初值计算扩展阅读:
定时器/计数器每接受一个计数脉冲,加法计数器的值就加1;计满时则发生溢出,计数器又从0开始计数并置溢出标志位(TF0=1或TF1=1)。
1、定时模式 在此模式下,计数器的输入脉冲是由晶振12分频获得的。例如,晶振频率为12MHz的值加1.这样就可以根据计数值计算定时时间,也可以根据定时时间计算计数器的初值。
2、计数模式 在此模式下,计数器的输入脉冲是由外部引脚(T0或T1)输入的。外部引脚出现下降沿时,对应计数器的值加1.如果设置计数器的初值,那么读取当时计数器就可以计算脉冲个数。
‘伍’ PIC单片机 4M晶振 产生1秒延迟的原理
可以用任何定时器陆档,如TMR0,设置它基本延时时间为50ms,延时20次就是1s了!
因为你用的是4M晶振,指令周期为1us,TMR0的延时50ms延时常数计算如下:
先计算TMR0的分频系数K:
50000=256*1*K,K=195.3,取K=256(只能取略大的计算值,不能四舍五入!),这是的1是指令周期,下周
再计算TMR0的延时常数X:
5000=(256-X)*1*K,K用256代入,得X=61.
程序设计时用一个累计TMR0中断次数的变量T0_N,每早芦乱中断一次哗激T0_N+1,并判断其值>=20时就是1秒了。
注意,TMR0中断时要清TMR0IF,并要重新对TMR0赋初值61。