13018|31

20

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

(已解决)C编写的延时60S的程序,但是软件仿真延时不到1S [复制链接]

谢谢大家的鼎力相助和给力支持~~!我已经找到错误所在,就是少了个中断函数,应该加个void timer0() interrupt1 的函数,然后把定时器设定放在里面。只是这样的话就没有用delay函数来的方便,而且定时器中断不能反复调用,个人觉得没有delay的调用灵活~~~无论如何,谢谢大家了~~

 

原程序只要把delay函数全部去掉,然后设个中断函数,把定时和key2的设定放里面就行,只是单片机默认输出高电平,我改好程序后无论如何都不能在key1闭合的情况下,先让key2=0持续60秒再自动跳转key2=1持续60秒。

 

有兴趣的童鞋可以试试用下面的程序改改。有兴趣想看我改好后的程序的可以说一下,我放上来。

--------------------------------------------------------------------------------------------------------------------------

 

KEY1为闭锁开关,KEY2为输出口

 

计划用芯片  89S51 

 

6MHZ的晶振

理想预计延时60S,用软件仿真却仅延时1S左右,编译0错误0警告~~~ 不知道哪里出问题了,大伙帮看看吧~~

 

程序如下:

 

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P2^0;
sbit key2=P1^0;
void init();
void delay();
void main()

 init();
 while(1)
 {
  if(key1==0)
  {
    key2=0;
   delay();
   key2=!key2;
   delay();
  }
  if(key1==1)
  {
   key2=1;
   init();
  } 
 }
}
void init()

 TMOD=0x01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;
 ET0=1;
 TR0=1;
}
void delay()
{
 uint i,a=0;
 for(i=60;i>0;i--)
 {
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  a++;
  if(a==10)
  a=0;
 }
}
   

[ 本帖最后由 sj777209 于 2011-8-14 00:04 编辑 ]
此帖出自51单片机论坛

最新回复

楼主这个程序写的很给力啊!用软件延时套硬件延时!既然你都用到定时器了!为什么不直接在定时器的中断里面写!?  详情 回复 发表于 2011-8-13 10:02
点赞 关注
 

回复
举报

90

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
延时程序是不是有问题,for循环执行60次,里面的赋初值仅占用机器指令周期吧,不起作用。延时函数好像不是这么写的吧?
此帖出自51单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 skyflysgs 的帖子

就是想用内部定时器来计算延迟时间,这样貌似能精确点
此帖出自51单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

4
 
计划用的是6MHZ的晶振,所以一个机器周期是2us

TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  a++;
  if(a==10)
  a=0;

这个一次正好1S,for60次不是60秒了么
此帖出自51单片机论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(高级)

5
 

回复 板凳 sj777209 的帖子

从你的延时程序里看不到内部定时器,只是赋初值,占用机器指令周期,你把初值变一下,无论如何变,看看结果是不是也一样的。(应该是一样的)
此帖出自51单片机论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(高级)

6
 

回复 4楼 sj777209 的帖子

你循环一次用8us,...不是一秒
此帖出自51单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 6楼 skyflysgs 的帖子

TH0=(65536-50000)/256;
  TL0=(65536-50000)%256

这个一次不是100ms?

a10次不是1S?

8us怎么算的?
此帖出自51单片机论坛
 
 
 

回复

103

帖子

0

TA的资源

一粒金砂(中级)

8
 
用单片机定时器吧,这样精确
此帖出自51单片机论坛
 
个人签名方向大于努力
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

9
 

回复 8楼 zhengenhao 的帖子

现在这个程序调用的就是单片机的定时器。

有定义 TR0=1啊
此帖出自51单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

10
 
没人么。。。

我之前做倒计时器的时候用的也是和这个程序差不多的计时方法,那个就能很准的计时1S
此帖出自51单片机论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(高级)

11
 
如果给TH TL赋初值就是调用定时器的话。。。。(怀疑中)
for(i=60;i>0;i--)
for(a=0;a<10;a++)
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  
}
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

12
 

回复 4楼 sj777209 的帖子

首先,是65535,不是65536
你这一错,误了多少?你好好算算
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1万

帖子

16

TA的资源

版主

13
 

楼主程序错错再对定时器里解

void delay()
{
uint i,a=0;
for(i=60;i>0;i--)
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  a++;
  if(a==10)
  a=0;
}
}
这个函数错了,你应在定时器中断程序这样编然后搞个旗标,主程序就判断旗标即可。
此帖出自51单片机论坛
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

14
 

回复 12楼 辛昕 的帖子

是65536,这个是没错的。。。
此帖出自51单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

15
 

回复 13楼 ddllxxrr 的帖子

是放到
viod timer0() interrupt1

里面去吗?那我怎么调用让I/O口每输出60秒高低电平就转换一次呢?
此帖出自51单片机论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

16
 
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==10)
a=0;
这个怎么就1秒了!6MHZ晶振,1秒中要运行6000000条单周期指令,你说你的几句话编译后有吗?
此帖出自51单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

17
 

回复 16楼 alloybullet 的帖子

TH0=(65536-50000)/256;
TL0=(65536-50000)%256;

12MHZ的晶振的话,一个机器周期为1us,上面这个运行一次就是50ms(50000us=50ms),6MHZ的晶振,一个机器周期为2us,上面这个运行一次就是100ms,a=10就运行10次,就是1000ms,不是1s么?
此帖出自51单片机论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

18
 

你说的这个是定时器溢出一次的时间吧!但是你并没有等待计数器溢出后才继续往下执行程序的!

此帖出自51单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

19
 

回复 18楼 alloybullet 的帖子

找到问题所在了。。应该加个中断函数

但是那样加的话又调用不了DELAY来计数了。。。。好纠结。。
此帖出自51单片机论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

20
 

回复 10楼 sj777209 的帖子

TH0=(65536-5*110592)/256;
TL0=(65536-5*110592)%256;
然后循环1200次。因为T1工作状态下最大定时时间为65ms,根本达不到你说的什么100ms,为了好算,我写的是定时50ms,你试下吧
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表