久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2180|回復: 12
收起左側(cè)

這個單片機超聲波程序,別的占用一個定時器怎么解決?為什么定時器0的中斷進不...

[復制鏈接]
回帖獎勵 10 黑幣 回復本帖可獲得 1 黑幣獎勵! 每人限 10 次
ID:515826 發(fā)表于 2022-4-1 16:01 | 顯示全部樓層 |閱讀模式
#include<reg51.h>        //包含頭文件
#include"18b20.h"        //包含溫度讀取文件
#include<stdio.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

//--定義使用的IO--//
#define GPIO_DIG P0                 //定義GPIO_DIG代替P0

sbit servorControl =P1^6;  //舵機的控制引腳
sbit Trig=P1^7;            //控制端
sbit Echo=P3^3;          //接收端

sbit K1=P3^4;
sbit K2=P3^5;
sbit K3=P3^6;                         //按鍵定義
sbit HE=P3^2;                         //霍爾傳感器
sbit BUZZ=P1^2;                         //蜂鳴器
sbit relay=P1^4;                 //吹風繼電器
sbit relay_w=P1^3;                 //加熱繼電器


//--定義全局變量
unsigned char code DIG_CODE[17]={
0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,
0xdf,0xd7,0x77,0x7c,0x39,0x5e,0x79,0x8b};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
unsigned char DisplayData[8];
//用來存放要顯示的8位數(shù)的值
//--聲明全局變量--//

uchar control=5;
uchar servorTime=0;

unsigned char key_num;
unsigned char flag_d;
unsigned int count_HE;
unsigned int flag_HE;
unsigned char sec_bj=0,sec_gb=0,m=0;
int TH;
bit flag_js_gb=0;
bit flag_js_bj=0;
bit flag_bj=0;
//--聲明全局函數(shù)--//
void LcdDisplay(int,unsigned char);
void DigDisplay();
void delay(unsigned int xms)         //延時函數(shù)
{
  unsigned int i;
  unsigned char j;
  for(i=0;i<xms;i++)
  for(j=0;j<110;j++);
}

void Delay_us(unsigned char t)
{
        while(--t);
}         //大約延時t*2+5us         超聲波模塊用

void keyscan()                                   //按鍵函數(shù)
{
        if(K1==0)                                   //設(shè)置按鍵按下
        {
                delay(20);                           //延時去抖
                if(K1==0)                           //再次判斷按鍵按下
                {
                        key_num=!key_num;  //設(shè)置變量取反,也就是按一下設(shè)置鍵進入設(shè)置,再按一下就退出設(shè)置狀態(tài)
                        while(K1==0)           //按鍵是否松開,沒有松開就執(zhí)行下面的程序,松開后跳出
                        {
                                if(key_num==1)                        //設(shè)置狀態(tài)
                                LcdDisplay(TH*100,1);        //顯示上限值
                                else
                                LcdDisplay(tvalue,0);        //否則顯示正常值
                        }
                }
        }
        if(K2==0&&key_num==1)                          //設(shè)置狀態(tài)時加按鍵按下
        {
                delay(20);                                          //延時去抖
                if(K2==0&&key_num==1)                  //設(shè)置狀態(tài)時按鍵按下
                {
                        if(TH<98)                                  //上限如果小于98,就讓變量加,也就是最大可以加到99
                        TH++;                                          //上限加
                        else                                          //否則
                        TH=20;                                          //上限值賦值20
                        while(K2==0) LcdDisplay(TH*100,1);           //按鍵松開后顯示設(shè)置值
                }
        }
        if(K3==0&&key_num==1)                                         //注釋同加按鍵
        {
                delay(20);
                if(K3==0)
                {
                        if(TH>1)                //大于1就減
                        TH--;
                        else
                        TH=99;
                        while(K3==0)LcdDisplay(TH*100,1);
                }
        }
}
/*******************************************************************************
* 函 數(shù) 名         : main
* 函數(shù)功能                   : 主函數(shù)
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/

void main()
{

        unsigned int time,distance;        
        uchar a=0,b=0,c=0,d=0,i=0;

        TH=30;                  //上電初始值30
        EX0=0;                  //關(guān)閉外部中斷
        IT0=1;                  //下降沿有效
        EA=1;                  //打開中斷系統(tǒng)總開關(guān)
        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循環(huán)
        {

                Trig=1;
                Delay_us(5);
                Trig=0;
                while(Echo==0);                                
                a=TL0;
                b=TH0;
                while(Echo);
                c=TL0;
                d=TH0;
                time=(d-b)*256+(c-a);
                distance=(int)(time*0.017);                           //計算路程 單位為cm

                read_wendu();                         //讀溫度
                keyscan();                                 //按鍵掃描
                if(key_num==0)                         //判斷狀態(tài),是否是設(shè)置狀態(tài)
                LcdDisplay(tvalue,0);         //顯示正常值
                else
                LcdDisplay(TH*100,1);         //顯示設(shè)置值
                if(distance<=30)                                 //紅外傳感器有信號
                {

                        relay_w=0;                         //加熱繼電器打開
                        flag_js_bj=1;                 //計時報警標志位置1
                        flag_js_gb=0;                 //計時關(guān)閉標志位清零
                        EX0=1;                                 //關(guān)閉外部中斷

                        if(distance<=20)                                        //如果距離小于30cm 蜂鳴器響
                        {
                                if(distance<=10)                                        //如果距離小于30cm 蜂鳴器響
                                {
                                        control=15;   //使舵機向正擺動
                                    servorTime=0;
                                    TR1=1;
                                    delay(200);
                                    TR1=0;
                                }
                                else
                                {
                                        control=12;   //使舵機向正擺動
                                    servorTime=0;
                                    TR1=1;
                                    delay(200);                                
                                    TR1=0;
                                }
                        }
                        else
                        {
                                  control=9;   //使舵機向正擺動
                            servorTime=0;
                            TR1=1;
                            delay(200);                        
                            TR1=0;
                        }

                }
                else                                         //沒有信號
                {
                        flag_js_gb=1;                 //計時關(guān)閉標志位值1
                        flag_js_bj=0;                 //計時報警標志位清零

                        control=5;   //使舵機向右擺動
                    servorTime=0;
                    TR1=1;
                    delay(200);               
                    TR1=0;
                        delay(200);                        
                }


                if(flag_d&&flag_HE==1)         //溫度是否小于設(shè)置值
                {
                        relay=0;                         //打開加熱繼電器
                        count_HE=0;
                        flag_HE=0;
                }
                else
                {
                        count_HE++;                          //霍爾的狀態(tài)計數(shù)變量,計到一定時間(此值不精確,就是一個短延時的作用)關(guān)閉繼電器
                        if(count_HE>10&&relay==0||flag_d==0)  //計到時間或者溫度達到設(shè)置值
                        relay=1;                                         //關(guān)閉繼電器
                }
        }
}

/*******************************************************************************
* 函 數(shù) 名         : LcdDisplay()
* 函數(shù)功能                   : LCD顯示讀取到的溫度
* 輸    入         : v
* 輸    出         : 無
*******************************************************************************/

void LcdDisplay(int temp,unsigned char flag)          //lcd顯示
{
           float tp;  
        unsigned char i,k;
        unsigned int j;
        if(temp< 0&&flag==0)                                //當溫度值為負數(shù)
          {
                DisplayData[1] = 0x80;
                //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
                temp=temp-1;
                temp=~temp;
                tp=temp;
                temp=tp*0.0625*100+0.5;        
                flag_d=1;                  //負溫度值時肯定需要加熱,所以變量為1
                //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
                //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
                //算由?.5,還是在小數(shù)點后面。

          }
         else if(flag==0)
          {                        
               
                tp=temp;
                temp=tp*0.0625*100+0.5;        
            DisplayData[1] = DIG_CODE[temp / 10000];
                if(temp/10000==0)
                DisplayData[1]=0x00;
                if(temp<TH*100)         //溫度值小于設(shè)置值
                flag_d=1;                 //變量置1
                else                         //大于等于設(shè)置值時
                flag_d=0;                 //為0
        }
        if(flag==1)
        DisplayData[1] = DIG_CODE[15];
        DisplayData[2] = DIG_CODE[temp % 10000 / 1000];
        if(temp<1000)
        DisplayData[2]=0x00;
        DisplayData[3] = DIG_CODE[temp % 1000 / 100] | 0x20;
        DisplayData[4] = DIG_CODE[temp % 100 / 10];
        DisplayData[5] = DIG_CODE[temp % 10];
         for(k=0;k<8;k++)
        for(i=0;i<4;i++)
        {
                switch(i)         //位選,選擇點亮的數(shù)碼管,
                {
                        case(0):
                                  P2=0xef; break;//顯示第0位
                        case(1):
                                  P2=0xdf; break;//顯示第1位
                        case(2):
                                  P2=0xbf; break;//顯示第2位
                        case(3):
                                  P2=0x7f; break;//顯示第3位
                }
                GPIO_DIG=DisplayData[i+1];//發(fā)送段碼
                j=50;                                                 //掃描間隔時間設(shè)定
                while(j--);        
                GPIO_DIG=0x00;//消隱
        }
}
void waibu() interrupt 0          //外部中斷服務函數(shù),也就是霍爾元件檢測到信號就會有外部中斷
{
        if(flag_d)                                  //溫度是否小于下限,小于就進入
                {
                relay=0;                          //啟動吹風繼電器
                count_HE=0;                          //霍爾計數(shù)變量清零
                flag_HE=0;                          //霍爾標志位清零
                }
}
void T0_time() interrupt 1          //T0函數(shù)
{
        TH0=0x3c;
        TL0=0xb0;                                  //重新賦初值
        m++;                                  //每50ms加一次
        if(m>=1)                                  //加到20次就是1秒
        {        
                m=0;                                  //清零
                if(flag_js_gb==1)          //計時關(guān)閉標志位
                {
                        sec_gb++;                  //關(guān)閉計時秒變量++
                        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)閉兩個繼電器
                                EX0=0;                  //關(guān)閉外部中斷
                        }        
                }
                if(flag_js_bj==1)          //計時報警標志位
                {
                        sec_bj++;                  //報警計時秒變量++
                        if(sec_bj>=5)          //加到60秒
                        {
                                sec_bj=0;
                                sec_gb=0;          //兩個變量都清零
                                flag_js_gb=0; //關(guān)閉標志位清零
                                flag_bj=1;          //啟動報警標志位
                        }
                }
                if(flag_bj==1)                  //報警標志位為1
                {
                        BUZZ=!BUZZ;                  //蜂鳴器取反閃爍報警
                }
                else                                  //沒有進入報警
                {
                        BUZZ=1;                          //關(guān)閉蜂鳴器
                }
        }
}
void T1_int(void) interrupt 3{   //產(chǎn)生舵機所需要的脈沖
  TH1=0xff;
  TL1=0x9c;
  servorTime++;
  if(servorTime<=control)
   servorControl=1;
  else
   servorControl=0;
   if(servorTime>=200)
   servorTime=0;
}

回復

使用道具 舉報

ID:515826 發(fā)表于 2022-4-1 16:04 | 顯示全部樓層
超聲波模塊計算距離的時候用到定時器0,但是程序還要一個定時器來進中斷怎么辦?定時器1給舵機用了
回復

使用道具 舉報

ID:515826 發(fā)表于 2022-4-1 16:07 | 顯示全部樓層
為什么定時器0的中斷進不去,可是如果縮短定時器1的中斷的時間舵機就不能啟動怎么辦?
回復

使用道具 舉報

ID:515826 發(fā)表于 2022-4-1 16:40 | 顯示全部樓層
進定時器0中斷里的關(guān)閉標志位的那個延時三秒不行咋搞?
回復

使用道具 舉報

ID:121859 發(fā)表于 2022-4-1 17:51 | 顯示全部樓層
超聲波測距用一個定時器就可以了。使用過程中如果定時器不夠用,也可以分時使用的方法來實現(xiàn)。
回復

使用道具 舉報

ID:515826 發(fā)表于 2022-4-1 18:11 | 顯示全部樓層
zhxiufan 發(fā)表于 2022-4-1 17:51
超聲波測距用一個定時器就可以了。使用過程中如果定時器不夠用,也可以分時使用的方法來實現(xiàn)。

這個分時使用要怎么寫 通過控制TR0實現(xiàn)碼?
回復

使用道具 舉報

ID:161164 發(fā)表于 2022-4-1 18:18 來自觸屏版 | 顯示全部樓層
liguohan 發(fā)表于 2022-4-1 16:04
超聲波模塊計算距離的時候用到定時器0,但是程序還要一個定時器來進中斷怎么辦?定時器1給舵機用了

那個中斷是用來干什么滴?
回復

使用道具 舉報

ID:515826 發(fā)表于 2022-4-1 18:33 | 顯示全部樓層
lkc8210 發(fā)表于 2022-4-1 18:18
那個中斷是用來干什么滴?

就是計時超過一分鐘蜂鳴器響,還有超聲波關(guān)閉后兩個繼電器延時三秒后關(guān)閉
回復

使用道具 舉報

ID:161164 發(fā)表于 2022-4-2 09:38 來自觸屏版 | 顯示全部樓層
liguohan 發(fā)表于 2022-4-1 18:33
就是計時超過一分鐘蜂鳴器響,還有超聲波關(guān)閉后兩個繼電器延時三秒后關(guān)閉

可以用定時器1的中斷啊~
每次進入中斷就是100us
進入10000次就是一秒
然后用這個一秒又可以得出三秒和一分鐘
回復

使用道具 舉報

ID:507641 發(fā)表于 2022-4-2 09:57 | 顯示全部樓層
你定時器1沒開啟
回復

使用道具 舉報

ID:515826 發(fā)表于 2022-4-2 10:52 | 顯示全部樓層
lkc8210 發(fā)表于 2022-4-2 09:38
可以用定時器1的中斷啊~
每次進入中斷就是100us
進入10000次就是一秒

定時器1已經(jīng)給舵機用了
為什么舵機在用定時器1的時候定時器0好像不能用了,屏蔽1的時候0就好了
回復

使用道具 舉報

ID:515826 發(fā)表于 2022-4-2 10:54 | 顯示全部樓層

開了 在后面用舵機的時候開了
回復

使用道具 舉報

ID:515826 發(fā)表于 2022-4-2 11:00 | 顯示全部樓層
lkc8210 發(fā)表于 2022-4-2 09:38
可以用定時器1的中斷啊~
每次進入中斷就是100us
進入10000次就是一秒

有說是定時器初始化的時候1把0的參數(shù)破壞了,也有說是方式?jīng)]設(shè)置好,咋弄啊幫我看一下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产情侣在线看 | 中文字幕第十页 | 97影院在线午夜 | 免费在线观看一区二区三区 | 精品美女在线观看 | 色欧美综合 | 国产精品久久久久久久久久久久冷 | 美女张开腿露出尿口 | 欧美精品在线一区二区三区 | 91精品久久久久久久久中文字幕 | 亚洲综合二区 | 国产精品福利一区二区三区 | 欧美亚洲国产日韩 | 国产乱码精品一区二区三区中文 | 婷婷久久五月天 | 日本涩涩视频 | 亚洲国产一区视频 | 国产一区二区三区精品久久久 | 秋霞精品| 美女天天操 | 欧美日韩黄色一级片 | 欧美一区二区在线观看视频 | 欧美日韩不卡合集视频 | 超碰天天| 国产高清一区 | 99re | 嫩草懂你的影院入口 | 99影视 | 成人精品久久日伦片大全免费 | 国产精品网址 | 涩涩视频在线看 | 91av视频在线免费观看 | 91资源在线观看 | 精品在线视频播放 | 欧美精品一区二区在线观看 | 毛片入口| 亚洲视频免费观看 | 国产美女视频黄a视频免费 国产精品福利视频 | 欧美一区二区三区大片 | 在线一区视频 | av激情在线 |