设51单片机晶振频率为12MHZ,延时1m的子程序

作者&投稿:检凭 (若有异议请与网页底部的电邮联系)
设MCS-51单片机的晶振频率为12MHZ,试编写10ms的延时程序(要求误差不超过0.003ms)。~

C语言程序:
#include
void main (void)
{
TMOD = 0x10;
TH1 = (-50000>>8);
TL1 = -50000;
TCON = 0x40;
IE = 0x88;
while(1);
}
void T1_int (void) interrupt 3
{
TH1 = (-50000>>8);
TL1 = -50000;
}
汇编程序如下:
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP T1INT
ORG 0100H
MAIN:
MOV TMOD, #10H
MOV TH1, #HIGH(-50000)
MOV TL1, #LOW(-50000)
MOV TCON, #40H
MOV IE, #88H
AJMP $
T1INT:
PUSH ACC
MOV TH1, #HIGH(-50000)
MOV TL1, #LOW(-50000)
POP ACC
RETI

扩展资料:Keil C51程序设计中几种精确延时方法
延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
使用定时器/计数器实现精确延时
单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。
本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句。
执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。

采用12Mhz晶振的51单片机,软件如下(调试通过)

#include

#define PERIODH (65536l-50000l)/0X100 //设50ms中断1次TH1初值
#define PERIODL (65536l-50000l)%0X100 //设50ms中断1次TL1初值
//如果需要极精确的延时,应根据实际编译后的产生的汇编指令,扣除掉中断响应中重装所占用的时间

unsigned int count;//延时时间变量

void timer1() interrupt 3 using 1
{//定时器每0.05秒一次中断

TH1 = PERIODH;
TL1 = PERIODL;

if(count)
{//计数未到0,则保持定时器运行,计数器-1
count--;
}
else
{//计数到0,关定时器
TR1 =0; //stop timer 1
}

}

//以秒为基本定时单位的子程序
void Delay1S(unsigned char x)
{
TH1 =PERIODH;
TL1 =PERIODL;
TR1 = 1;//此时定时开始

count = 20*x;//因50ms中断1次,故乘20
while(count);
}

main()
{
TMOD = 0X10;//方式1
EA = 1;//总中断允许
ET1 = 1;//定时器1中断允许

while(1)
{
Delay1S(1);//延时1秒
Delay1S(2);//延时2秒
Delay1S(3);//延时3秒
Delay1S(4);//延时4秒

}
}

Delay1S函数是调用时才开始计时,根据需要的定时长度到时停止计时。如果定时精度要求不高,可以不用在中段服务程序中关闭定时器,每次调用误差也就在50ms。
可以用KEIL仿真看一下实际时间

猜想你问的是1ms.
下面为你写出1ms的程序:
用的是11.0592M的,你如果真的需要是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;
}


51单片机常用的晶振是什么频率???
11.0592MHz也有12MHz,速度要求高的可以用24MHz,使用11.0592MHz的频率主要是因为这个频率下串口以9600bps传输数据的误码率是最低的,12MHz主要是因为用这个频率段计算出的时间延时是比较准确的(执行速度为12\/12MHz);

51单片机晶振频率为6mhz
1、应用需求:在51单片机系统中,晶振频率为6MHz可以满足应用的需求,包括控制、定时、计数功能,6MHz的晶振频率也与单片机的内部时钟电路相匹配,能够实现更好的系统性能和稳定性。2、精准度:晶振频率的精度和稳定性对于单片机的正常运行非常重要,在选择晶振频率时,需要考虑到其精度和温漂等参数,在51单...

51单片机晶振频率12MHz,编程实现P1.0输出频率为2KHz,占空比为50%的方波...
51单片机晶振频率12MHz,编程实现P1.0输出频率为2KHz,占空比为50%的方波,使用定时器 51单片机晶振频率12MHz,编程实现P1.0输出频率为2KHz,占空比为50%的方波,使用定时器T1工作方式2... 51单片机晶振频率12MHz,编程实现P1.0输出频率为2KHz,占空比为50%的方波,使用定时器T1工作方式2 展开 我来答 答题抽奖 首次...

为什么51单片机的晶振一般使用11.0592晶振
标准的51单片机晶振是1.2M-12M,一般由于一个机器周期是12个时钟周期,所以先12M时,一个机器周期是1US,好计算,而且速度相对是最高的(当然现在也有更高频率的单片机)。11.0592M是因为在进行通信时,12M频率进行串行通信不容易实现标准的波特率,比如9600,4800,而11.0592M计算时正好可以得到,因此...

51单片机一般选用多少的晶振
这个与用途有关,比如说如果你要用到串口,那么就常用11.0592MHz晶振,因为这个频率的晶振分频后可以得到精确的波特率。如果要用到计时,就常用12MHz晶振,这样分频后是个整数,计时更精确。当需要单片机比较快速的处理数据时,通常使用频率更高的晶振,因为单片机的处理速度与晶振频率成正比,晶振频率越高...

51单片机晶振频率分别为11.0592MHz机器周期分别为多少?
12\/11.0592微秒,51单片机的一个机器周期等于12个振荡周期(晶振频率的倒数)。体积非常细小,非常方便插入到用户板中.插入时紧贴用户板,没有连接电缆,这样可以有效地减少运行中的干扰,避免仿真时出现莫名其妙的故障;仿真插针采用优质镀金插针,可以有效地防止日久生锈,选择优质园脚IC插座,保护仿真插针,同时...

51单片机的机器周期和晶振频率有何关系?当fOSC=8MHz时,机器周期是多少...
机器周期X振荡频率= 12。当fosc=8MHz时,机器周期为1.5微秒。因为规定一个机器周期为12个振荡周期,而振荡周期是振荡频率fosc的倒数,所以一个机器周期=12\/fosc,当fosc=8MHz时,代入公式,机器周期为12\/(8MHz)s,即1.5us。

单片机晶振频率时多少??
每个单片机和每个单片机的晶振频率不同。一般的为6MHz或者12MHz 对于51单片机来说。它的19角XTAL1和18角XTAL2是外接晶体引脚。19角接石英晶体的一端。在单片机内部,它是一个反向放大器的输入端,这个放大器构成了片内振荡器。当采用外部时钟时,对于HMOS单片机,该引脚接地;对于CHMOS单片机,该引脚为...

51单片机的时钟周期的频率为12MHz,那么ALE信号的频率为多少
ALE端为晶振频率的1\/6,题中给的是“时钟周期的频率”(即“晶振频率”的1\/2),所以“晶振频率”为24MHz,ALE信号的频率为24\/6,即4MHz。简介 51单片机是对兼容英特尔8051指令系统的单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单...

51单片机最大计时值
晶振频率为6MHz时,定时\/计数器在工作方式0、方式1、方式2下,其最大的定时时间分别为:16.384 mS;131.072 mS;0.512 mS;根据计算公式,X=M-计数初值=M-(fosc*t)\/12,其中X是计数初值,要得到最大定时时间X=0;M最大计数值,工作方式0时M=2^13=8192,工作方式1时M=2^16=65535,工作...

杏花岭区13261447766: 当80C51单片机晶振频率为12MHz时,时钟周期.机器周期各是多少? -
照沈甘贝: 当80C51单片机晶振频率为12MHz时,时钟周期为(1/12)微秒,机械周期为1微秒. 时钟周期:一个时钟脉冲所需要的时间.在计算机组成原理中又叫T周期或节拍脉冲.是CPU和其他单片机的基本时间单位.它可以表示为时钟晶振频率(1秒...

杏花岭区13261447766: 已经51单片机的晶振频率是12MHZ 要产生4800BPS的波特率 问波特率的计算公式 还有 计算 TH1 TL1的初始值 -
照沈甘贝: 串行口的四种工作方式对应三种波特率.由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同. 方式0的波特率 = fosc/12 方式2的波特率 =((2^SMOD)/64)• fosc 方式1的波特率 =((2^SMOD)/32)•(T1溢出率...

杏花岭区13261447766: 一个51单片机,晶振为12MHz,让前三个LED灯分别以1ms,1s,5s的频率闪烁,怎么用c语言写,谢谢各位了~~ -
照沈甘贝: LED1 1ms闪烁人眼分辨不出来 定时器设定为16位定时50ms 另设一变量作定时器中断计数,到10(0.5S)的倍数时LED2取反,到50(2.5S)的倍数时LED3取反 #include sbit led1=P0^0; sbit led2=P0^1; sbit led3=P0^2; unsigned int count; ...

杏花岭区13261447766: 51单片机晶振频率为12MHz,定时器1工作方式1中断方式在P2.3输出频率为10Hz的方波 -
照沈甘贝: MOD应该是/除号,因为是12M晶振,所以定时器一个计数值为1US,所以按这个赋值,定时器1将会50ms中断一次,要想产生10Hz的方波,周期得100ms,也就是说可以在中断服务程序中加条语句:cpl p2.3,就可以了,这样两次中断就是一个周期得方波信号,正好50X2=100ms.

杏花岭区13261447766: 51单片机晶振频率为12MHz,利用中断在P1.1口输出50HZ的方波,C语言,哪位大侠帮帮忙,帮忙写个程序 -
照沈甘贝: #include <reg51.h>sbit port=P1^1;void Timer0Init(void) //10毫秒@12.000MHz {TMOD &= 0xF0; //设置定时器模式TMOD |= 0x01; //设置定时器模式TL0 = 0xF0; //设置定时初值TH0 = 0xD8; //设置定时初值TF0 = 0; //清除TF0标志TR0...

杏花岭区13261447766: 设51单片机晶振频率为12MHZ,延时1m的子程序 -
照沈甘贝: 猜想你问的是1ms. 下面为你写出1ms的程序: 用的是11.0592M的,你如果真的需要是12M的,那自己直接修改成12M就可以了.调用的时候直接把uinsigned int ms改成1就是1ms.void ConfigTimer0(unsigned int ms) {unsigned long tmp;tmp =...

杏花岭区13261447766: 设MCS - 51单片机的晶振频率为12MHZ,使用定时器1工作方式1中断方式在P1输出周期为100ms的方波 -
照沈甘贝: ;ORG 0000HSJMP STARTORG 0001BHMOV TH1, #(65536 - 50000) / 256MOV TL1, #LOW(65536 - 50000)CPL P1.0RETI START:MOV TMOD, #10HMOV TH1, #(65536 - 50000) / 256MOV TL1, #LOW(65536 - 50000)SETB TR1MOV IE, #88HSJMP $END

杏花岭区13261447766: 80c51单片机若晶振频率为fosc=12MHz,一个机器周期? -
照沈甘贝: 单片机的晶振为6mhz,说明1s产生6 000 000个脉冲,那么1个脉冲的时间是1/6 000 000 s 即时钟周期为1/6 000 000 s,12个时钟周期=1个机器周期 所以1/6 000 000 s*12=2us即机器周期=2us

杏花岭区13261447766: 单片机中晶振频率为12MHZ的机器周期怎么算? -
照沈甘贝:[答案] 1、机器周期=晶振周期*12. 2、所以单片机中晶振频率为12MHZ的机器周期=12*1/12M=1微秒.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网