定时器中断控制继电器问题,困扰一天一夜,求好心人指导,在线等。

BBL5211 2013-06-20 12:30:18
#include <reg52.h>
#define uchar unsigned char;

sbit RELAY = P1^4; //定义继电器对应单片机管脚
uchar tt;

main()
{
tt=0;
TMOD=0x01; //定时/计数器0工作于方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //允许定时/计数器1 中断
TR0=1; //启动定时/计数器1 中断
while(1)
{
if(tt==100)
{
tt=0;
RELAY = 0; //开启继电器
}
else RELAY = 1;
}
}
/**********************************定时器中断*/
void time1() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}

------tt一直是零。进不了if语句。但是继电器边上的指示灯会按我设置的继电器的开合频率微弱的闪烁。
...全文
875 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xujianxiang 2013-07-29
  • 打赏
  • 举报
回复
if(tt==100) { tt=0; RELAY =~RELAY ; //开启继电器 }
Mack_liu 2013-07-24
  • 打赏
  • 举报
回复
引用 7 楼 tnijerry 的回复:
[quote=引用 6 楼 tnijerry 的回复:] 开的是定时器0的中断,实际的中断子程序确用的是定时器1,void time1() interrupt 1,楼主你太大意了
不好意思,看错了,不过楼主的注释和函数的命名实在让人不敢恭维。5楼的已经解释了你的代码的用意,你是如何确定:tt一直是零。进不了if语句?[/quote] tt是0 怎么会跳呢。。。?而且楼上也说了 你是怎么知道tt一直是0的?
食肉狼 2013-07-23
  • 打赏
  • 举报
回复
从楼上能找到你要的答案了
cjf764555750 2013-06-27
  • 打赏
  • 举报
回复
while循环里置tt=0前加点延时吧,看能看到现象不
css201 2013-06-27
  • 打赏
  • 举报
回复
第一:这个程序本来就有问题,就算tt有变化,继电器打开就会马上关闭。根本来不及跳变。 第二:tt如果是一直等于0的话那就说明没进中断,不妨试试看进入前清除Time0溢出中断标志位。
wuxinpei11 2013-06-27
  • 打赏
  • 举报
回复
把else去掉试试,也就是while循环中只存在if语句,因为如果有else 就表示每while一次,继电器就动作一次,要是没有else,就需要50秒动作一次
shagua0916 2013-06-27
  • 打赏
  • 举报
回复
注意一下,驱动继电器,反串二极管不能省!
繁华落尽空 2013-06-23
  • 打赏
  • 举报
回复
引用 6 楼 tnijerry 的回复:
开的是定时器0的中断,实际的中断子程序确用的是定时器1,void time1() interrupt 1,楼主你太大意了
不好意思,看错了,不过楼主的注释和函数的命名实在让人不敢恭维。5楼的已经解释了你的代码的用意,你是如何确定:tt一直是零。进不了if语句?
繁华落尽空 2013-06-23
  • 打赏
  • 举报
回复
开的是定时器0的中断,实际的中断子程序确用的是定时器1,void time1() interrupt 1,楼主你太大意了
curious_cat 2013-06-22
  • 打赏
  • 举报
回复
不知你程序的本意如何,但是你的程序达到了如下的效果: 如果你main程序里面的循环一次时间为x(假如单位为秒), 定时器中断间隔时间为y (假如单位为秒), 继电器控制信号的低电平持续时间非常短: 每 100*y秒的时间里,只有x秒长的时间, 继电器才是闭合的; 你还能看到继电器上的指示灯在闪,说明你的眼睛非常犀利! 比示波器还好用!
snowboyfly 2013-06-21
  • 打赏
  • 举报
回复
1 是否进if分支可以加debug,用串口看一下 2 你的定时器中断多长时间起来一次?知道这个时间就能明白继电器的开合 就好比你让灯闪烁,只是不停给高低电平,但是又没延迟,你自然也就看不到什么闪烁效果
youzi722 2013-06-20
  • 打赏
  • 举报
回复
这个问题得先看一下你的程序, 就是While循环里发生了什么 1). 首先tt<100; 一直执行 RELAY = 1 2). 定时器每次超时,tt++; 主函数还是一直RELAY=1 3). tt加到100的那一刻,while循环里,RELAY=0,然后tt=0, 然后又立即while回来,RELAY=1 如此周而复始,没玩没了,没隔100次计数,继电器就被玩儿一次
dongshuangrui10 2013-06-20
  • 打赏
  • 举报
回复
是不是灯闪的太快,继电器来不及动作!还有就是把你的while里的代码放到中断函数里好些
zhxianbin 2013-06-20
  • 打赏
  • 举报
回复
既然进不了 if 怎么闪烁? 你把if中的 RELAY = 0; //开启继电器 修改为 RELAY = 1 还会闪烁吗?

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧