找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2230|回复: 16
收起左侧

为什么舵机使用单片机定时器1的时候定时器0进不去了?定时器方式和初始化有问题码?

[复制链接]
ID:515826 发表于 2022-4-2 12:51 | 显示全部楼层 |阅读模式
70黑币
void main()
{

        unsigned int time,distance;        

        TH=30;                  //上电初始值30
        EX0=0;                  //关闭外部中断
        IT0=1;                  //下降沿有效
        EA=1;                  //打开中断系统总开关
        TMOD=0x11;          //定时器工作方式
        TH0=0x3c;
        TL0=0xb0;          //定时器0赋初值50ms
        TH1=0xff;
        TL1=0x9c;
        ET0=1;                  //T0中断允许
        ET1=1;
        TR0=1;                  //开启T0计时
        servorTime=0;
        Trig=0;
        Echo=0;
        while(1)          //进入while循环
        {

                TH1=0;
                TL1=0;
                Trig=1;
                Delay_us(5);
                Trig=0;
                while(Echo==0);
                TR1=1;
                while(Echo);
                TR1=0;
                time=(TH1)*256+(TL1);
                distance=(int)(time*0.017);                           //计算路程 单位为cm
                TH1=0xff;
                TL1=0x9c;

                read_wendu();                         //读温度
                keyscan();                                 //按键扫描
                if(key_num==0)                         //判断状态,是否是设置状态
                        LcdDisplay(tvalue,0);         //显示正常值
                else
                        LcdDisplay(TH*100,1);         //显示设置值
                if(distance<30)                                 //传感器有信号
                {         
                        relay_w=0;
                        if(distance<20)                                        //如果距离小于20c
                        {
                                if(distance<10)                                        //如果距离小于10c
                                {
                                        control=15;   //使舵机向正摆动
                                    servorTime=0;
                                    TR1=1;
                                    delay(15);
                                        //delay(200);
                                    TR1=0;
                                //        delay(20);
                                }
                                else
                                {
                                        control=12;   //使舵机向正摆动
                                    servorTime=0;
                                    TR1=1;
                                    delay(15);
                                        //delay(200);
                                    TR1=0;
                                //        delay(20);
                                }
                        }
                        else
                        {
                                  control=9;   //使舵机向正摆动
                            servorTime=0;
                            TR1=1;
                            delay(15);
                                //delay(200);
                            TR1=0;
                                //delay(20);
                        }

                //        relay_w=0;                         //加热继电器打开
                        flag_js_bj=1;                 //计时报警标志位置1
                        flag_js_gb=0;                 //计时关闭标志位清零
                        EX0=1;                                 //打开外部中断

                }
                else                                         //没有信号
                {

                        control=5;   //使舵机向右摆动
                    servorTime=0;
                    TR1=1;
                    delay(10);
                    TR1=0;
                        flag_js_gb=1;                 //计时关闭标志位值1
                        flag_js_bj=0;                 //计时报警标志位清零
                }
}

void T0_time() interrupt 1          //T0函数
{
        TH0=0x3c;
        TL0=0xb0;                                  //重新赋初值
        m++;                                          //每50ms加一次
        if(m>=20)                                  //加到20次就是1秒
        {
                m=0;                                  //清零
                if(flag_js_gb==1)          //计时关闭标志位
                {
                        sec_gb++;                  //关闭计时秒变量++
                        if(sec_gb>=3)          //加到3秒
                        {
                                sec_gb=0;          //清零
                                sec_bj=0;
                                flag_js_bj=0; //清零
                                flag_bj=0;
                                relay_w=1;
                                relay=1;          //关闭两个继电器
                                EX0=0;                  //关闭外部中断
                        }        
                }
                if(flag_js_bj==1)          //计时报警标志位
                {
                        sec_bj++;                  //报警计时秒变量++
                        if(sec_bj>=15)          //加到60秒
                        {
                                sec_bj=0;
                                sec_gb=0;          //两个变量都清零
                                flag_js_gb=0; //关闭标志位清零
                                flag_bj=1;          //启动报警标志位
                        }
                }
                if(flag_bj==1)                  //报警标志位为1
                {
                        BUZZ=!BUZZ;                  //蜂鸣器取反闪烁报警
                }
                else                                  //没有进入报警
                {
                        BUZZ=1;                          //关闭蜂鸣器
                }
        }
}
void T1_int(void) interrupt 3{   //产生舵机所需要的脉冲
  TH1=0xff;
  TL1=0x9c;
  servorTime++;
  if(servorTime<=control)
   servorControl=1;
  else
   servorControl=0;
   if(servorTime>=200)
   servorTime=0;
}



最佳答案

查看完整内容

因为你的程序是一个缝合怪,所以不断出现沖突 你要先理清各个硬件的运行原理,才去结合他们
回复

使用道具 举报

ID:161164 发表于 2022-4-2 12:51 来自手机 | 显示全部楼层
liguohan 发表于 2022-4-2 19:04
所以使用舵机的时候其它的都会关闭是吗?
那这个没办法改了把

因为你的程序是一个缝合怪,所以不断出现沖突
你要先理清各个硬件的运行原理,才去结合他们
回复

使用道具 举报

ID:121859 发表于 2022-4-2 13:29 | 显示全部楼层
同级中断中,当一个中断响应后,另一个中断是不能被响应的。除非其级别更高。
回复

使用道具 举报

ID:515826 发表于 2022-4-2 13:58 | 显示全部楼层
zhxiufan 发表于 2022-4-2 13:29
同级中断中,当一个中断响应后,另一个中断是不能被响应的。除非其级别更高。

T0的优先级不是比T1更高码?
回复

使用道具 举报

ID:515826 发表于 2022-4-2 14:00 | 显示全部楼层
还有一个外部中断是霍尔传感器的 我没写进去
回复

使用道具 举报

ID:161164 发表于 2022-4-2 14:58 | 显示全部楼层
你如何知道定时器0没冇进中断?
回复

使用道具 举报

ID:515826 发表于 2022-4-2 15:01 | 显示全部楼层
lkc8210 发表于 2022-4-2 14:58
你如何知道定时器0没冇进中断?

定时器0的中断里面有延时三秒关闭继电器不能用
但是蜂鸣器可以报警
不知道是怎么回事
回复

使用道具 举报

ID:515826 发表于 2022-4-2 15:14 | 显示全部楼层
lkc8210 发表于 2022-4-2 14:58
你如何知道定时器0没冇进中断?

定时器0的中断可以用但是为什么在if(distance<30)里面控制继电器就不行了呢? 关闭的时候延时三秒是不行的 只要把控制舵机的定时器1的中断屏蔽就可以了 弄不懂啊 在if里面打开的时候继电器是咔嚓一下的
回复

使用道具 举报

ID:161164 发表于 2022-4-2 15:33 来自手机 | 显示全部楼层
liguohan 发表于 2022-4-2 15:14
定时器0的中断可以用但是为什么在if(distance

但你的代码一艺只在使用定时器1,没用过定时器0
回复

使用道具 举报

ID:515826 发表于 2022-4-2 15:39 | 显示全部楼层
lkc8210 发表于 2022-4-2 15:33
但你的代码一艺只在使用定时器1,没用过定时器0

有啊 我在进while循环之前就打开了TR0=1
回复

使用道具 举报

ID:161164 发表于 2022-4-2 17:09 来自手机 | 显示全部楼层
liguohan 发表于 2022-4-2 15:39
有啊 我在进while循环之前就打开了TR0=1

看漏了
回复

使用道具 举报

ID:515826 发表于 2022-4-2 17:12 | 显示全部楼层
lkc8210 发表于 2022-4-2 15:33
但你的代码一艺只在使用定时器1,没用过定时器0

这两个中断在关闭的时候都要时候怎么办?
回复

使用道具 举报

ID:1015233 发表于 2022-4-2 17:34 | 显示全部楼层
个人建议把中断里面内容少写一些,把一些写到主函数里面,中断里面内容太多会导致中断出现一些奇怪的问题。定时器初始化没问题,定时方式少了个TCON
回复

使用道具 举报

ID:161164 发表于 2022-4-2 18:31 来自手机 | 显示全部楼层
liguohan 发表于 2022-4-2 17:12
这两个中断在关闭的时候都要时候怎么办?

舵机的PWM讯号是连续不可停止的
回复

使用道具 举报

ID:515826 发表于 2022-4-2 19:04 | 显示全部楼层
lkc8210 发表于 2022-4-2 18:31
舵机的PWM讯号是连续不可停止的

所以使用舵机的时候其它的都会关闭是吗?
那这个没办法改了把
回复

使用道具 举报

ID:515826 发表于 2022-4-2 19:09 | 显示全部楼层
lkc8210 发表于 2022-4-2 18:31
舵机的PWM讯号是连续不可停止的

使用舵机的时候,继电器会自动关闭是为什么?我有一次不知道怎么弄得 用舵机的时候继电器没关
回复

使用道具 举报

ID:515826 发表于 2022-4-3 10:40 | 显示全部楼层
lkc8210 发表于 2022-4-2 19:11
因为你的程序是一个缝合怪,所以不断出现沖突
你要先理清各个硬件的运行原理,才去结合他们

会不会是舵机工作时电压不够?并一个电容可以吗?还有办法解决吗?大佬求教
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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