编程题 设MCS-51单片机系统中晶振频率为12MHz,欲使用定时器/计数器1,采用方式1编写实现1秒定时时间的程

并写出定时时间的计算步骤... 并写出定时时间的计算步骤 展开
 我来答
lylxy1965
2011-05-03 · TA获得超过2413个赞
知道小有建树答主
回答量:436
采纳率:100%
帮助的人:215万
展开全部
采用12Mhz晶振的51单片机,软件如下(调试通过)

#include <reg52.h>

#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仿真看一下实际时间
sting549
推荐于2018-04-04 · TA获得超过201个赞
知道答主
回答量:63
采纳率:0%
帮助的人:70.1万
展开全部
#include <reg51.h>
unsigned char i;
void main()
{
TMOD=0x10;
TH1=0x3c;
TL1=0xb0;
EA=1;
ET1=1;
TR1=1;

while(1)
{
if(i==20)
{
i=0;
//下面写你要处理的的其他程序,你只要了定时1s。
}
}
}

void a(void) interrupt 3
{
unsigned char i;
TH1=0x3c;
TL1=0xb0;
i++;
}

12Mhz的51单片机,经过12分频后为1MHz,则一个指令周期为1/1Mhz = 1us.
则定时50ms为 0xffff - 0x3cb0,即65535 - 15535 = 50000us = 50ms,则20次的定时:20×50ms=1s。

明白了吗?怪简单的问题……

祝你顺利哦!
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
赚五百万退休
2011-05-03 · 超过36用户采纳过TA的回答
知道小有建树答主
回答量:75
采纳率:0%
帮助的人:78.1万
展开全部
这个太简单了,给你个方法,你自己弄吧,不会多看看书。
1 使能定时器
2 使能定时器中断
3 编写中断程序
我估计你是觉得1秒的时间,定时器达不到,你可以在中断里面再自己写个计数,或者开启计数器2,这样两两相乘,时间就能到1秒钟了。
要做到精确的定时,就要用计数器2,然后在Keil里可以看到时间,再对定时器进行微调就好了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
摆渡青茫
2016-05-03
知道答主
回答量:5
采纳率:0%
帮助的人:5425
展开全部
void sheding()
{
TMOD=0x10;//定时器/计数器工作方式寄存器的设定
TH1=(65536-50000)/256;
TL1=(65536-50000)%265;
//定时器/计数器控制寄存器设定
EA=1; //全局中断允许位
ET1=1; //打开定时器/计数器1
TR1=1;
}
void zhongduan() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
k++;
if(k==20)
{
k=0;
shu++;
if(shu==86400)
shu=0;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
单片机技术宅
2016-04-26 · 知道合伙人教育行家
单片机技术宅
知道合伙人教育行家
采纳数:251 获赞数:552
飞思卡尔智能赛车邀请赛二等奖全国大学生电子设计竞赛成功参赛奖

向TA提问 私信TA
展开全部
#include <reg51.h>
unsigned int num ;
void InitTimer1(void)
{
TMOD = 0x10;
TH1 = 0x3C; //50ms定时
TL1 = 0x0B0;
EA = 1;
ET1 = 1;
TR1 = 1;
}

void main(void)
{
InitTimer1();
}

void Timer1Interrupt(void) interrupt 3
{
TH1 = 0x3C;
TL1 = 0x0B0;
num++;
if(num==20){ ;} //1S时间到。
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式