找回密码
 立即注册

QQ登录

只需一步,快速开始

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

89C52单片机定时中断里想输出引脚低电平1秒后恢复高电平 求帮助

  [复制链接]
跳转到指定楼层
楼主
ID:373124 发表于 2018-8-3 16:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问大侠们,89C52定时中断里想输出引脚低电平1秒后恢复高电平,要怎样写?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:310519 发表于 2018-8-3 20:16 | 只看该作者
设置定时多少时间触发一次中断,写0后启动定时器,在中断里计时到1秒就IO置1......
回复

使用道具 举报

板凳
ID:382694 发表于 2018-8-3 20:55 | 只看该作者
void timeinit()
回复

使用道具 举报

地板
ID:382689 发表于 2018-8-3 20:59 | 只看该作者
编程思想应该是   通过某种方式触发中断(外部中断还是定时中断或者串口中断)以进入中断函数——> 首先确定定时器初值然后拉低某个引脚通过某个寄存器记录定时器循环定时的次数是否具有一秒如果有一秒释放拉低的引脚退出中断;也可以采用程序定时的方法;还有很多方法。

评分

参与人数 1黑币 +10 收起 理由
yousunny + 10 很给力!

查看全部评分

回复

使用道具 举报

5#
ID:382710 发表于 2018-8-3 21:31 | 只看该作者
在定时器里设定1000ms的时间,通过进位标志位触发中断变为高电平
回复

使用道具 举报

6#
ID:382710 发表于 2018-8-3 21:32 | 只看该作者
通过定时器中断定时1000ms,到时间后进位标志位进位触发中断,变为高电平
回复

使用道具 举报

7#
ID:36299 发表于 2018-8-3 22:51 | 只看该作者
用定时器先设置定时50MS吧,然后每进入一次计数一次,20次计数到,就是定时1S
回复

使用道具 举报

8#
ID:373124 发表于 2018-8-4 11:03 | 只看该作者
串口3分钟接收不到发送端送来的指定数据,就输出(低电平)继电器1秒后变回常态(高电平),如果又收到指定数据,继电器还是(高电平),没收到指定数据一直输出知道怎样写,就是输出后取反就不行
回复

使用道具 举报

9#
ID:155507 发表于 2018-8-4 14:17 | 只看该作者
用定时器先设置定时50MS吧,然后用状态机,用状态逻辑实现
回复

使用道具 举报

10#
ID:373124 发表于 2018-8-4 17:48 | 只看该作者
angmall 发表于 2018-8-4 14:17
用定时器先设置定时50MS吧,然后用状态机,用状态逻辑实现

大侠,我是新手,能给个例子吗?
回复

使用道具 举报

11#
ID:373499 发表于 2018-8-4 20:25 | 只看该作者
先配置好定时器50ms   进入中断时候就计数和输出低电平  计数达到20的时候说明时间到  输出高电平即可
回复

使用道具 举报

12#
ID:381195 发表于 2018-8-4 21:44 | 只看该作者
void configTimer1(unsigned int ms) //比如设置50ms
{        //此函数用来计算用户需要的ms,然后转化为定时器1进入中断1的高8位和低8位数字
    unsigned long tmp;  
   
    tmp = 11059200 / 12;      
    tmp = (tmp * ms) / 1000;   //除1000是把秒转化为ms
    tmp = 65536 - tmp;         //计算出y
    tmp = tmp + 12;           //补偿

    T0RH = (unsigned char)(tmp>>8);   //取出y的高8位
    T0RL = (unsigned char)tmp;                  //取出y的低8位

    TMOD &= 0xf0;   
    TMOD |= 0x10;   //配置定时器模式

    TH0 = T0RH;     //给定时器1中断赋初值
    TL0 = T0RL;
    ET0 = 1;        //定时器1中断打开
    TR0 = 1;        //启动T1
}


void interruptTimer0() interrupt 1
{
  unsigned char cnt=0;
TH0 = T0RH;
TL0 = T0RL;
        if(TF0==1)
                {TF0=0;cnt++;
             if(cnt>=20)
               {cnt=0;P1 = 0xff;}
}
               
               
}
框架大概这样,可能会有点问题但是改改就行
回复

使用道具 举报

13#
ID:382993 发表于 2018-8-4 23:11 | 只看该作者
做个定时器,在中断中计数,1s后将引脚拉高
回复

使用道具 举报

14#
ID:62797 发表于 2018-8-5 00:45 | 只看该作者
用一个变量,每一秒加一,单数低双数高
回复

使用道具 举报

15#
ID:373124 发表于 2018-8-6 15:21 | 只看该作者
void Timer0() interrupt 1
{
        TH0 = 0xFC;
        TL0 = 0x66;
   TimeNo++;
   if(TimeNo >= 10000)
  {
   RELAY = 0;
  }
   TimeNo++;
  if(TimeNo >= 12000)
    {
   TimeNo = 12000;
   RELAY = 1;
   LED4 = 0;
}
}
请问这样写,继电器恢复高电平后(释放继电器),听到继电器有吱吱响,触发指示灯微亮,继电器没吸合,是什么问题啊?
回复

使用道具 举报

16#
ID:373124 发表于 2018-8-6 16:26 | 只看该作者
请问大侠们,这样写,继电器能复位,但是复位后,继电器吱吱响,输出灯有微光,是什么问题啊?
void Timer0() interrupt 1
{
        TH0 = 0xFC;
        TL0 = 0x66;
   TimeNo++;
   if(TimeNo >= 10000)
  {
   RELAY = 0;
  }
   TimeNo++;
  if(TimeNo >= 12000)
    {
   TimeNo = 12000;
   RELAY = 1;
   LED4 = 0;
}
}
回复

使用道具 举报

17#
ID:368940 发表于 2018-8-6 20:05 | 只看该作者
根据晶振的计数写一个delay函数,通过计算可以确保时间的准确性
回复

使用道具 举报

18#
ID:373124 发表于 2018-8-6 21:49 | 只看该作者
cyfdc51 发表于 2018-8-6 20:05
根据晶振的计数写一个delay函数,通过计算可以确保时间的准确性

用delay当有串口信号来,跑不起来了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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