
精确定时,只要你的晶振够准确零误差
(256-56)×144×32=921600=11059200÷12
汇编:
CNT0 EQU 20HCNT1 EQU 21H
ORG 0000H
AJMP MAIN
ORG 000BH
DJNZ CNT0,ENDT0
MOV CNT0,#144
DJNZ CNT1,ENDT0
MOV CNT1,#32
CPL P17
ENDT0: RETI
MAIN:
MOV TMOD,#02H
MOV TH0,#56
MOV TL0,#56
SETB ET0
SETB EA
SETB TR0
SLEEP:
MOV PCON,#01
NOP
SJMP SLEEP
END
用C语言
//f=110592MHzsbit pout=P1^7;
unsigned char cnt0=144,cnt1=32;
void main()
{
Init();
while(1)
{
PCON=0x01; //休眠
}
}
void Init()
{
TMOD=0x2; //方式2:8位自装入
TH0=0x56; //基础定时
TL0=0x56;
TR0=1;
ET0=1;
EA=1;
}
void Timeon() interrupt 1 //定时器
{
if(--cnt0==0)
{
cnt0=144;
if(--cnt1==0)
{
cnt1=32;
pout=~pout;
}
}
}
猜想你问的是1ms
下面为你写出1ms的程序:
用的是110592M的,你如果真的需要是12M的,那自己直接修改成12M就可以了。调用的时候直接把uinsigned int ms改成1就是1ms
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
tmp = 11059200/12;
tmp = (tmp ms)/1000;
tmp = 65536 - tmp;
tmp = tmp + 18;
T0RH = (unsigned char)(tmp >> 8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 =1;
TR0 = 1;
}
void delay(uint n)
{
uint i,j;
for(i=n;i>0;i--)
{
for(j=110;j>0;j--);
}
}
当n=1是延时大约是1ms,就是说n等于都少就延时多少ms,当然n的值不超过uint的最大值。
头文件下请定义宏
#define uchar unsigned char
#define uint unsigned int
单片机晶振频率6MHz的时钟周期是0166uS,89C51的指令周期是12个时钟周期,约等于2uS。
以下是例程:
汇编
DELAY: MOV Rn,#200 循环200次 10uS = 2mS
LOOP: NOP 一个指令周期
NOP
NOP
DJNZ Rn,LOOP 二个指令周期,一次循环总共5个指令周期耗时10uS
RET
C语言 #define NOP _nop_(),_nop_(),_nop_()
for(int i = 200;i!=0;i-- )NOP;
以上就是关于单片机编程:假设晶振频率为11.0592Mhz,试编写一程序,在P1.7引脚输出周期为2s的方波全部的内容,包括:单片机编程:假设晶振频率为11.0592Mhz,试编写一程序,在P1.7引脚输出周期为2s的方波、设51单片机晶振频率为12MHZ,延时1m的子程序、我的单片机用的11.0592M的晶振,想写一个大概延时1MS的子程序,应该怎样写(用C语言)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)