標(biāo)題: 為什么舵機(jī)使用單片機(jī)定時(shí)器1的時(shí)候定時(shí)器0進(jìn)不去了?定時(shí)器方式和初始化有問(wèn)題碼? [打印本頁(yè)]

作者: liguohan    時(shí)間: 2022-4-2 12:51
標(biāo)題: 為什么舵機(jī)使用單片機(jī)定時(shí)器1的時(shí)候定時(shí)器0進(jìn)不去了?定時(shí)器方式和初始化有問(wèn)題碼?
void main()
{

        unsigned int time,distance;        

        TH=30;                  //上電初始值30
        EX0=0;                  //關(guān)閉外部中斷
        IT0=1;                  //下降沿有效
        EA=1;                  //打開(kāi)中斷系統(tǒng)總開(kāi)關(guān)
        TMOD=0x11;          //定時(shí)器工作方式
        TH0=0x3c;
        TL0=0xb0;          //定時(shí)器0賦初值50ms
        TH1=0xff;
        TL1=0x9c;
        ET0=1;                  //T0中斷允許
        ET1=1;
        TR0=1;                  //開(kāi)啟T0計(jì)時(shí)
        servorTime=0;
        Trig=0;
        Echo=0;
        while(1)          //進(jìn)入while循環(huán)
        {

                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);                           //計(jì)算路程 單位為cm
                TH1=0xff;
                TL1=0x9c;

                read_wendu();                         //讀溫度
                keyscan();                                 //按鍵掃描
                if(key_num==0)                         //判斷狀態(tài),是否是設(shè)置狀態(tài)
                        LcdDisplay(tvalue,0);         //顯示正常值
                else
                        LcdDisplay(TH*100,1);         //顯示設(shè)置值
                if(distance<30)                                 //傳感器有信號(hào)
                {         
                        relay_w=0;
                        if(distance<20)                                        //如果距離小于20c
                        {
                                if(distance<10)                                        //如果距離小于10c
                                {
                                        control=15;   //使舵機(jī)向正擺動(dòng)
                                    servorTime=0;
                                    TR1=1;
                                    delay(15);
                                        //delay(200);
                                    TR1=0;
                                //        delay(20);
                                }
                                else
                                {
                                        control=12;   //使舵機(jī)向正擺動(dòng)
                                    servorTime=0;
                                    TR1=1;
                                    delay(15);
                                        //delay(200);
                                    TR1=0;
                                //        delay(20);
                                }
                        }
                        else
                        {
                                  control=9;   //使舵機(jī)向正擺動(dòng)
                            servorTime=0;
                            TR1=1;
                            delay(15);
                                //delay(200);
                            TR1=0;
                                //delay(20);
                        }

                //        relay_w=0;                         //加熱繼電器打開(kāi)
                        flag_js_bj=1;                 //計(jì)時(shí)報(bào)警標(biāo)志位置1
                        flag_js_gb=0;                 //計(jì)時(shí)關(guān)閉標(biāo)志位清零
                        EX0=1;                                 //打開(kāi)外部中斷

                }
                else                                         //沒(méi)有信號(hào)
                {

                        control=5;   //使舵機(jī)向右擺動(dòng)
                    servorTime=0;
                    TR1=1;
                    delay(10);
                    TR1=0;
                        flag_js_gb=1;                 //計(jì)時(shí)關(guān)閉標(biāo)志位值1
                        flag_js_bj=0;                 //計(jì)時(shí)報(bào)警標(biāo)志位清零
                }
}

void T0_time() interrupt 1          //T0函數(shù)
{
        TH0=0x3c;
        TL0=0xb0;                                  //重新賦初值
        m++;                                          //每50ms加一次
        if(m>=20)                                  //加到20次就是1秒
        {
                m=0;                                  //清零
                if(flag_js_gb==1)          //計(jì)時(shí)關(guān)閉標(biāo)志位
                {
                        sec_gb++;                  //關(guān)閉計(jì)時(shí)秒變量++
                        if(sec_gb>=3)          //加到3秒
                        {
                                sec_gb=0;          //清零
                                sec_bj=0;
                                flag_js_bj=0; //清零
                                flag_bj=0;
                                relay_w=1;
                                relay=1;          //關(guān)閉兩個(gè)繼電器
                                EX0=0;                  //關(guān)閉外部中斷
                        }        
                }
                if(flag_js_bj==1)          //計(jì)時(shí)報(bào)警標(biāo)志位
                {
                        sec_bj++;                  //報(bào)警計(jì)時(shí)秒變量++
                        if(sec_bj>=15)          //加到60秒
                        {
                                sec_bj=0;
                                sec_gb=0;          //兩個(gè)變量都清零
                                flag_js_gb=0; //關(guān)閉標(biāo)志位清零
                                flag_bj=1;          //啟動(dòng)報(bào)警標(biāo)志位
                        }
                }
                if(flag_bj==1)                  //報(bào)警標(biāo)志位為1
                {
                        BUZZ=!BUZZ;                  //蜂鳴器取反閃爍報(bào)警
                }
                else                                  //沒(méi)有進(jìn)入報(bào)警
                {
                        BUZZ=1;                          //關(guān)閉蜂鳴器
                }
        }
}
void T1_int(void) interrupt 3{   //產(chǎn)生舵機(jī)所需要的脈沖
  TH1=0xff;
  TL1=0x9c;
  servorTime++;
  if(servorTime<=control)
   servorControl=1;
  else
   servorControl=0;
   if(servorTime>=200)
   servorTime=0;
}




作者: lkc8210    時(shí)間: 2022-4-2 12:51
liguohan 發(fā)表于 2022-4-2 19:04
所以使用舵機(jī)的時(shí)候其它的都會(huì)關(guān)閉是嗎?
那這個(gè)沒(méi)辦法改了把

因?yàn)槟愕某绦蚴且粋(gè)縫合怪,所以不斷出現(xiàn)沖突
你要先理清各個(gè)硬件的運(yùn)行原理,才去結(jié)合他們
作者: zhxiufan    時(shí)間: 2022-4-2 13:29
同級(jí)中斷中,當(dāng)一個(gè)中斷響應(yīng)后,另一個(gè)中斷是不能被響應(yīng)的。除非其級(jí)別更高。
作者: liguohan    時(shí)間: 2022-4-2 13:58
zhxiufan 發(fā)表于 2022-4-2 13:29
同級(jí)中斷中,當(dāng)一個(gè)中斷響應(yīng)后,另一個(gè)中斷是不能被響應(yīng)的。除非其級(jí)別更高。

T0的優(yōu)先級(jí)不是比T1更高碼?

作者: liguohan    時(shí)間: 2022-4-2 14:00
還有一個(gè)外部中斷是霍爾傳感器的 我沒(méi)寫進(jìn)去
作者: lkc8210    時(shí)間: 2022-4-2 14:58
你如何知道定時(shí)器0沒(méi)冇進(jìn)中斷?
作者: liguohan    時(shí)間: 2022-4-2 15:01
lkc8210 發(fā)表于 2022-4-2 14:58
你如何知道定時(shí)器0沒(méi)冇進(jìn)中斷?

定時(shí)器0的中斷里面有延時(shí)三秒關(guān)閉繼電器不能用
但是蜂鳴器可以報(bào)警
不知道是怎么回事

作者: liguohan    時(shí)間: 2022-4-2 15:14
lkc8210 發(fā)表于 2022-4-2 14:58
你如何知道定時(shí)器0沒(méi)冇進(jìn)中斷?

定時(shí)器0的中斷可以用但是為什么在if(distance<30)里面控制繼電器就不行了呢? 關(guān)閉的時(shí)候延時(shí)三秒是不行的 只要把控制舵機(jī)的定時(shí)器1的中斷屏蔽就可以了 弄不懂啊 在if里面打開(kāi)的時(shí)候繼電器是咔嚓一下的
作者: lkc8210    時(shí)間: 2022-4-2 15:33
liguohan 發(fā)表于 2022-4-2 15:14
定時(shí)器0的中斷可以用但是為什么在if(distance

但你的代碼一藝只在使用定時(shí)器1,沒(méi)用過(guò)定時(shí)器0
作者: liguohan    時(shí)間: 2022-4-2 15:39
lkc8210 發(fā)表于 2022-4-2 15:33
但你的代碼一藝只在使用定時(shí)器1,沒(méi)用過(guò)定時(shí)器0

有啊 我在進(jìn)while循環(huán)之前就打開(kāi)了TR0=1
作者: lkc8210    時(shí)間: 2022-4-2 17:09
liguohan 發(fā)表于 2022-4-2 15:39
有啊 我在進(jìn)while循環(huán)之前就打開(kāi)了TR0=1

看漏了
作者: liguohan    時(shí)間: 2022-4-2 17:12
lkc8210 發(fā)表于 2022-4-2 15:33
但你的代碼一藝只在使用定時(shí)器1,沒(méi)用過(guò)定時(shí)器0

這兩個(gè)中斷在關(guān)閉的時(shí)候都要時(shí)候怎么辦?

作者: 嘿嘿嘿l    時(shí)間: 2022-4-2 17:34
個(gè)人建議把中斷里面內(nèi)容少寫一些,把一些寫到主函數(shù)里面,中斷里面內(nèi)容太多會(huì)導(dǎo)致中斷出現(xiàn)一些奇怪的問(wèn)題。定時(shí)器初始化沒(méi)問(wèn)題,定時(shí)方式少了個(gè)TCON
作者: lkc8210    時(shí)間: 2022-4-2 18:31
liguohan 發(fā)表于 2022-4-2 17:12
這兩個(gè)中斷在關(guān)閉的時(shí)候都要時(shí)候怎么辦?

舵機(jī)的PWM訊號(hào)是連續(xù)不可停止的
作者: liguohan    時(shí)間: 2022-4-2 19:04
lkc8210 發(fā)表于 2022-4-2 18:31
舵機(jī)的PWM訊號(hào)是連續(xù)不可停止的

所以使用舵機(jī)的時(shí)候其它的都會(huì)關(guān)閉是嗎?
那這個(gè)沒(méi)辦法改了把
作者: liguohan    時(shí)間: 2022-4-2 19:09
lkc8210 發(fā)表于 2022-4-2 18:31
舵機(jī)的PWM訊號(hào)是連續(xù)不可停止的

使用舵機(jī)的時(shí)候,繼電器會(huì)自動(dòng)關(guān)閉是為什么?我有一次不知道怎么弄得 用舵機(jī)的時(shí)候繼電器沒(méi)關(guān)
作者: liguohan    時(shí)間: 2022-4-3 10:40
lkc8210 發(fā)表于 2022-4-2 19:11
因?yàn)槟愕某绦蚴且粋(gè)縫合怪,所以不斷出現(xiàn)沖突
你要先理清各個(gè)硬件的運(yùn)行原理,才去結(jié)合他們

會(huì)不會(huì)是舵機(jī)工作時(shí)電壓不夠?并一個(gè)電容可以嗎?還有辦法解決嗎?大佬求教




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1