51单片机怎么用定时器定时10s,21MHZ的外部晶体振荡器,求给出详细计算过程,。100分!

供稿:hz-xin.com     日期:2025-01-14
51单片机同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间

至少已经发现两个问题:
1,通过程序可以看出,Timer0的中断周期比Timer1的中断周期长,那么定时器0控制频率,定时器1控制这个频率持续的时间的说法可能有误;
2,uchar b,a,c;中的“b”最大值不会超过255,那么b=temp[c]能行吗?当c = 0时,temp[c] = 20000,uchar b是不能=uint temp的,除非你的51编译器比较特殊。将程序改为:

uint b;
main()
{
...............
...............
while(1)
{
if(b==temp[c])
{
beep=~beep;
b=0;//如果不加这一句,一次循环之后,猴年马月才能等到b==temp[c]
}
if(a==40)
c++;
if(c==6);//如果不加这这两行,程序将出现不可预料的错误。
c = 0;
}

}

确定你的代码没问题,定时器设置时正确的再考虑其他问题,,如果是晶振不准不会误差这么大的

首先,晶振的周期就是机器周期
2机器周期=1状态周期
6状态周期=1指令周期
所以
1指令周期=6状态周期=12机器周期
21 MHz 晶振,1指令周期 = 12 / 21 us =约= 0.57143 us
51单片机的计数器为加法计数器,每加 1 用时 1 个指令周期
加到满时再加就溢出,溢出时置 TF = 1 ,向CPU发出中断请求
比如定时器工作方式1,16位加计数定时器时
溢出值为65536(2的16次方)
装初值为 65536 - x 时,就是定时 x 个指令周期,即
0.57143 x us
最大定时时间为,初值为0时,
0.57143 X 65536 = 37449.143 us = 37.449143 ms
当初值为 65536 - 7000 时,定时为 7000 X 12 / 21 = 4000 us = 4 ms
TH1 = (65536 - 7000) / 256
TL1 = (65536 - 7000) % 256
要定时 10s 只要循环定时 2500 次就行了
有问题再问
楼上的定时不准确,定时时间长时,累计误差会比较大的

能够直接定时10s,可以定时50ms,然后做循环200次,就是10s了,定时50ms如下:
TH1 = (65536 - (21/12)*50000) / 256
TL1 = (65536 - (21/12)*50000) % 256
这样设置初值就是50ms了,你在循环200次,就是10s了

用C语言怎么在单片机AT89C51上编写一个延时10秒的程序?
\/\/定时器1定时时间=500us TL1 = 0X06; YSJS++; if(YSJS==20000) \/\/500uS*20000=10000000us=10s { P1 = P1 ^ 0X01; \/\/P1.0十秒钟翻转一次 YSJS = 0 }}

如何使用51单片机定时器实现定时功能
4. 定时器在单片机系统中的应用 在实际工程中,定时器在单片机系统中的应用非常广泛,例如:1)时间测量:当需要使用单片机测量外部如人体红外线等信号的时间长度时,通过定时器就可以很方便地实现。2)闹钟:在电子时钟电路中,通过定时器的工作模式,实现小时、分、秒的计时及时钟的闹铃功能。3)PWM ...

求单片机C语言延时程序(延时10s)
用定时器做吧,DELAY了不能做别的事情,效率太低了。做一个1ms的定时程序,再到计数10000次的时候执行一次你要的程序(比如说置位某个变量),这样就可以了。51就那么几个寄存器,看一下就可以了设定了,TH和TL只要记住计数到0的时候,会产生中断就可以了 ...

单片机p1口输出1HZ和10HZ,持续10s后自动切换到另一个频率
1、1Hz的周期是1s,10Hz的周期是100ms,你开个定时器中断周期为50ms。要输出10Hz的时候每次中断取反P1口,要输出1Hz的时候每中断10次取反P1口,这样1Hz和10Hz就有了。2、50ms定时器中断200次就是10s,这个时候你可以修改一个标志位,然后根据标志位选择输出10Hz或者1Hz信号。

利用定时器T0的方式0,产生10ms的定时,已知系统时钟频率为6MHz。请给...
TMOD=0x01;\/\/T0做定时器,工作模式选择模式1:16位定时器,无预分频 由于51单片机1个机器周期等于12个时钟周期。T=1\/6MHz*12=2us,即一个机器周期是2us。没有预分频如果要定时10ms则需要10ms\/2us=5000次计数。所以可求得初值 TH0=(65535-5000)\/256;TL0=(65535-5000)%256;初值就上面这样...

设单片机fosc=12MHz,利用T0方式1产生10ms定时,在P1.0引脚上输出周期为2m...
你的程序有点乱,没有理解透单片机定时器的作用。在这里既然用定时器又为什么要用软件延时呢,定时器方式1最大可以定时65.536ms,定10ms完全可以了,不用再用软件延时了。另外你计算的定时器定时初值不太正确,你再算一下。可以这样写:ORG 0000H START:MOV SP,#60H MOV TMOD,#01H MOV TH0,#...

按下按键,开始15秒倒计时,并在数码管显示
首先要明确流程,例如:单片机开机,设置定时器(10s),数码管显示为零,当按下A按键时开始计时,再在10s内多次按下B键,每按一次由中断程序记录次数并在数码管显示,10s后关闭计数功能,当再次按下A按键时,数码管显示再次为零..

利用单片机的定时器t0工作于方式1,实现从p1.0引脚上输出周期为10ms的...
因为周期为10毫秒,定时器中断方式,所以初值应该为:65536-(10\/2)*1000=65536-5000 TH0=(65536-5000)\/256 TL0=(65536-5000)%256 程序如下:ORG 0000H LJMP MAIN ORG 000BH LJMP T0ISR ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-5000)MOV TL0,#LOW(65536-5000)SETB TR0 SETB ...

用任意定时器使流水灯以1s的速度运行,10s内,若没有外部中断则单片机进 ...
单片机要进入掉电模式,还能唤醒,这是STC单片机具有的功能,你这是做实物吗?是STC单片机吗?是为了测试掉电模式和唤醒功能吧?如下图所示,要进放掉电模式,只要设置PCON寄存器的一个位PD=1就行了。用外部中断来唤醒。

某51单片机系统时钟频率为12MHZ,使用定时器0定时10ms方式,实现从P1.1输...
51单片机的定时器T0要工作在方式1,才能定时10ms。而TMOD=0x02,是方式2,定时最长只有256us,是不行的,应该是TMOD=0x01,才对。采用中断方式,对10ms定时中断计数50次为500ms,交替从P1.1输出高电平和低电平,即输出周期 为1S的方波信号了。如下的仿真图,示波器测试为1S的方法信号。