MCS-51单片机的编程题:已知系统晶振频率为12MHZ,采用定时器T0的方式1,请编程实现1s的延时。

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-06-30
编程题 设MCS-51单片机系统中晶振频率为12MHz,欲使用定时器/计数器1,采用方式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仿真看一下实际时间

每隔 250ms 翻转一次,就是输出周期500ms的方波。

中断服务函数就不用写了吧,就写个初始化函数:
void inition()
{
TOMD=0x01;//选择定时器0并选择工作方式1
TH0=(65536-50000)/256;
TL0=(65536-500000)%6;
EA=1;
ET0=1;
TR0=1;
}
这样初始化就没问题了,另外要实现1S延时,需要在中断函数里加个变量自增,因为我定义的是50ms中断一次,那么这个变量值自增到20后就代表1s时间到,清零这个变量之后方可写你的服务程序。
希望我的回答能帮助到你。

#include<reg51.h>
#define uchar unsigned char
uchar times;
void delay()
{
uchar times=0;
TR0=1;
while(1)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(TF0==1)
{
TF0=0;
times++;
if(times==20)
{
TR0=0;
return;
}
}
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
delay();
while(1);
}

#include <reg51.h>

void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0FC;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
}

  • 已知51单片机系统的外接晶体震荡器的振荡频率为12MHZ.请计算该单片机的...
    答:一个机器周期,是 12 个振荡周期。即 12/12MHz = 1us。
  • 已知51单片机系统是拥10MHZ的外部晶体振荡器,请问:该片机系统的状态周期...
    答:状态周期即为时间周期,它的值为晶振频率的倒数0.1us,而机器周期为12个时钟周期即1.2us。单片机中的中断系统和计时器均是一个机器周期触发一次。
  • 已知8051单片机的fosc=12MHz,用T1 定时,试编程由P1.2 和P1.3 引脚分别...
    答:代码如下:第一个代码程序:ORG 0000H LJMP MAIN ORG 001BH JMP T1_INT ORG 0030HMAIN:MOV TMOD, #20HMOV TH1, #6MOV TL1, #6MOV IE, #88HSETB TR1MOV R7, #4SJMP $T1_INT:CPL P1.3DJNZ R7, T1_ENDCPL P1.2MOV R7, #4T1_END:RETI END 第二个500us程序:include <reg51.h>...
  • 请教一下:51单片机题:已知51系列单片机的系统晶振频率为6MHz,请利用...
    答:汇编?C语言? 我给你一个C语言的 include <reg51.h> sbit pulse_out=P1^2;unsigned char t1;void main(){ TMOD=0x20;TH1=231;TL1=231;ET1=1;EA=1;TR1=1;while(1);} void t1_inter() interrupt 3 { t1++;if(t1==1) pulse_out=1;else pulse_out=0;if(t1==8) t1=0;} ...
  • 在80C51单片机系统中,已知时钟频率为6MHz。请编程P3.1口输出频率为100...
    答:include<reg52.h> //主程序 void main(){ TMOD=0x01;// 定时器0工作方式一 ET0=1;EA=1;TH0=(65536-2500)/256;//5ms定时 TL0=(65536-2500)%256;TR0=1;while(1);} //中断子程序 void Timer0() interrupt 1 { TH0=(65536-2500)/256;TL0=(65536-2500)%256;P3^1=~P3^1;} ...
  • 编程题 设MCS-51单片机系统中晶振频率为12MHz,欲使用定时器/计数器1...
    答:采用12Mhz晶振的51单片机,软件如下(调试通过)include <reg52.h> define PERIODH (65536l-50000l)/0X100 //设50ms中断1次TH1初值 define PERIODL (65536l-50000l)%0X100 //设50ms中断1次TL1初值 //如果需要极精确的延时,应根据实际编译后的产生的汇编指令,扣除掉中断响应中重装所占用的...
  • 已知单片机系统的晶振频率是12MHz,若要求定时为10ms,定时器T0对应的初值...
    答:ORG 0000HAJMP MAINORG 000BHAJMP ITOORG 0030HMAIN: MOV TMOD,#01HMOV TL0,#0CHMOV TH0,#0FEHMOV IE,#82HSETB TR0LOOP:AJMP $ITO:MOV TL0,#0CHMOV TH0,#0FEHCPL P2.0RETI END
  • MCS-51单片机编程题,用汇编语言,急求答。
    答:百度的推荐答案是错误的,正确的程序如下:MOV DPTR, #TABLE ;设置成表首地址 MOV A, DPL ;加上R2R3中的元素号码 ADD A, R3 MOV DPL, A MOV A, DPH ADDC A, R2 MOV DPH, A ;这时,DPTR就指向R2R3指定的元素了 CLR A MOVC A, @A+DPTR ...
  • 微型计算机及接口技术 实践课
    答:七、 编程题(20)已知MCS-51单片机系统片内RAM20H单元存放乐一个8位无符号数7AH,片外扩展RAM的8000H存放了一个8位无符号数86H,试编程完成以上两个单元中的无符号数相加,并将和值送往片外RAM的01H、00H单元中,同时将所编写程序运行完成后的数据和状态添入下表中给出的PSW的有关位以及寄存器A、DPTR和RAM...
  • MCS-51单片机编程题。
    答:ORG 0000H LJMP MAIN ORG 0100H MAIN: CLR C ;51单片机使用的是带进位的减法,使用前必须先清进位标志 MOV A,40H SUBB A,41H JC LLA ;如果41H中数大,不够减,则转LLA JZ LLB ;如果40H中数和41H中数相等,转LLB MOV GREAT,40H MOV LESS, ...