找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3681|回复: 10
打印 上一主题 下一主题
收起左侧

while延时问题

[复制链接]
跳转到指定楼层
楼主
ID:117939 发表于 2016-5-7 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Hi 各位大神,
我的程序有定时器,工作方式为8位自动重装;用while延时误差太大了,我的想法是:定时器13us溢出一次,tt加1,用while(tt <692)延时,即延时时长13us*692 = 8996us ,设置两个断点,软件仿真时间为16秒!!!求解,谢谢!
详细程序如下:
#include <REG52.H>
#include <intrins.H>
#define  uint unsigned int
#define uchar unsigned char

/*****************************************************************************************************
函数功能:定时器初始化
说明:定时器1工作方式2(8位自动重装模式)
******************************************************************************************************/
void Timer_Init()
{
TMOD = 0x20;       //定时器1工作方式2
  TH1 = 0xF3;       //装初值,13us溢出一次,产生约38KHz的方波/红外载波
  TL1 = 0xF3;
   EA = 1;
}

void main()
{
Timer_Init();
while(1)
{
                    TR1 = 1;
【断点1】      ET1 = 1;
              while(tt != 692);    //开定时器的期间,要用定时器延时,若用软件延时,处理中断服务程序占用的时候导致延时出错
【断点2】         tt = 0;      
。。。。。。。。。。。。。。。
}      

/*****************************************************************************************************
定时器1中断服务程序:产生38KHz的方波
******************************************************************************************************/
void Timer1_IRQ() interrupt 3  //13us中断一次
{
      IR_Si = ~IR_Si;
      tt++;   
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:117939 发表于 2016-5-7 17:59 | 只看该作者
顶!
回复

使用道具 举报

板凳
ID:118448 发表于 2016-5-7 21:28 | 只看该作者
你把主函数改成for循环试试

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:117939 发表于 2016-5-8 10:43 | 只看该作者
桃子不懂爱 发表于 2016-5-7 21:28
你把主函数改成for循环试试

多谢回复!
请问在主函数哪个地方改?我只是需要将程序停在while(tt != 692)这里,延时9ms;是不是把这条语句改成这样:"for(;tt != 692;);"?试过了也是一样的16秒多!
回复

使用道具 举报

5#
ID:127555 发表于 2016-6-23 14:09 | 只看该作者
顶!
回复

使用道具 举报

6#
ID:111634 发表于 2016-6-24 20:53 | 只看该作者
你的定时器13us溢出一次,其他工作CPU就基本不能做了。
回复

使用道具 举报

7#
ID:111634 发表于 2016-6-24 20:56 | 只看该作者
CPU忙死了,在定时器中断里外跑进跑出,哪还有空做其他事呢?
回复

使用道具 举报

8#
ID:117939 发表于 2016-6-26 17:45 | 只看该作者
zl2168 发表于 2016-6-24 20:56
CPU忙死了,在定时器中断里外跑进跑出,哪还有空做其他事呢?

按理来说,定时器只是一个硬件寄存器,定时期间不会占用CPU时间,CPU一直停在“while(tt != 692); ”这个语句查询tt的值而已!
回复

使用道具 举报

9#
ID:111634 发表于 2016-6-26 19:55 | 只看该作者
本帖最后由 zl2168 于 2016-6-26 19:56 编辑

如果每隔13秒叫你接个电话,即使这个电话很短,你忙否?你对定时器中断操作还理解不够。
回复

使用道具 举报

10#
ID:128151 发表于 2016-6-26 20:53 | 只看该作者
cpu太忙
回复

使用道具 举报

11#
ID:128275 发表于 2016-6-27 13:08 | 只看该作者
把主函数改成for循环
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表