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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1537|回復: 0
打印 上一主題 下一主題
收起左側

單片機超聲波測距代碼

[復制鏈接]
跳轉到指定樓層
樓主
#include "reg52.H"//器件配置文件
#include"lcd.h"
//傳感器接口
sbit RX  = P3^2;
sbit TX  = P3^3;
sbit key  = P1^4;
char keymode=0;
int keycount=0;

//變量聲明
unsigned int  time=0;
unsigned int  timer=0;
unsigned char posit=0;
unsigned long S=0;

char Mode=0;
bit  flag=0;
bit flag_KEY=0;
unsigned char act[]={0xff,0xfa,0xf5,0xf9,0xf6};          //小車動作控制
unsigned char disbuff[4]           ={0,0,0,0};                 //數組用于存放距離信息
void Display();
//延時20ms(不精確)
void delay_ms(unsigned int m)
{
    unsigned int b,c;
    for(c=0;c<m;c++)
        for(b=0;b<120;b++);
}
void Key(void)
{
        key = 1;
        delay_ms(1);
        if(key==0)                  //檢測按鍵K1是否按下           開關
        {        
                        delay_ms(10);   //消除抖動 一般大約10ms
                        if(key==0)         //再次判斷按鍵是否按下
                        {
                                keymode++;
                                if(keymode == 2)keymode = 0;
                                
                        }
                        while(!key);         //檢測按鍵是否松開
        }
        if(keymode==1)
        {
                keycount++;
                if(keycount==8)
                {
                        keycount=0;
                        keymode=0;
                }
        }
}

void Conut(void)
{
        time=TH0*256+TL0;          //讀出T0的計時數值
        TH0=0;
        TL0=0;                                  //清空計時器
        S=(time*1.7)/100;     //算出來是CM
        //聲音的速度是340m/s,時間的單位是us,計算到秒需要將時間數據/1000000,
        //長度=速度*時間,340*time/1000000,長度數據單位是m轉換成cm需要乘以100得到340*time/10000,
        //小數點都向左移兩位得到3.4*time/100,因為超聲波是往返了,所以再除以2,得到距離數據(time*1.7)/100
        if(Mode==0)                          //非設置狀態時
        {
                if(S>=800) //超出測量范圍顯示“-”
                {        
                        disbuff[0]='o'-0x30;           //“-”
                        disbuff[1]='v'-0x30;           //“-”
                        disbuff[2]='e'-0x30;           //“-”
                        disbuff[3]='r'-0x30;           //“-”
                }
                else
                {
                        disbuff[0]=S%1000/100;                 //將距離數據拆成單個位賦值
                        disbuff[1]=S%100/10;
                        disbuff[2]='.'-0x30;
                        disbuff[3]=S%10;
                }
        }

}
void delay(unsigned int t)
{
        while(t--);
}
/**********************************************************************************************************/
//定時器0
void zd0() interrupt 1                  //T0中斷用來計數器溢出,超過測距范圍
{
        flag=1;                                                 //中斷溢出標志
}
/**********************************************************************************************************/
//定時器1
void zd3() interrupt 3                  //T1中斷用來掃描數碼管和計800MS啟動模塊
{
        
        char n=10;
        P1 = 0xff;delay(7);        
        TH1=0xf8;
        TL1=0x30;                                 //定時2ms
        timer++;                                //變量加
        if(timer>=400)                        //1次就是40ms
        {
                timer=0;
                TX=1;                                  //40MS  啟動一次模塊
                while(n--);
                TX=0;
                SBUF=S/256;//將接收到的數據放入到發送寄存器
                while(!TI);                         //等待發送數據完成
                TI=0;                                                 //清除發送完成標志位
                SBUF=S%256;//將接收到的數據放入到發送寄存器
                while(!TI);                         //等待發送數據完成
                TI=0;                                                 //清除發送完成標志位
        }
        P1 = act[keymode];                //掃描顯示
        
         
}
void UsartInit()
{
        SCON=0X50;                        //設置為工作方式1
        TMOD=0X20;                        //設置計數器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //計數器初始值設置,注意波特率是4800的
        TL1=0XF3;
        ES=1;                                                //打開接收中斷
        EA=1;                                                //打開總中斷
        TR1=1;                                        //打開計數器
}

/**********************************************************************************************************/
//主函數
void main(void)
{  
        TMOD=0x11;                   //設T0為方式1
        TH0=0;
        TL0=0;         
        TH1=0xf8;                   //2MS定時
        TL1=0x30;
        ET0=1;                                //允許T0中斷
        ET1=1;                           //允許T1中斷
        TR1=1;                           //開啟定時器
        EA=1;                                        //開啟總中斷
        UsartInit();                                //串口初始化 9600
        LcdInit();        
        while(1)
        {
                while(!RX);                //當上次接收完波后,RX引腳是低電平,取反就是1,此while成立,反復判斷RX狀態。當RX沒有接收到返回波時是高電平,取反就是0,此while不成立,跳出
                TR0=1;                        //開啟計數
                while(RX);                //當RX沒有接收到返回波,此while成立,程序停在這里一直判斷RX狀態。當RX接收到返回波,RX引腳變為低電平,此while不成立,跳出
                TR0=0;                        //停止計數
                Conut();                        //計算
                LcdWriteCom(0x80);
                LcdWritestr("distance:");                //液晶顯示距離
                LcdWriteData(disbuff[0]+0x30);
                LcdWriteData(disbuff[1]+0x30);
                LcdWriteData(disbuff[2]+0x30);
                LcdWriteData(disbuff[3]+0x30);
                LcdWritestr("cm");
                Key();
        
                 
        }
}

void Usart() interrupt 4
{
        RI = 0;//清除接收中斷標志位
}
            
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线免费av电影 | 欧美日韩亚洲视频 | 国产在线精品一区二区三区 | 91精品国产欧美一区二区 | 国产精品99精品久久免费 | 伊人精品 | 91久久看片 | 波多野结衣中文字幕一区二区三区 | 欧美888 | 国产精品日韩在线观看 | 国产免费观看一级国产 | 黄色网址免费看 | 亚洲视频精品在线 | 亚洲成人免费观看 | 91精品国产综合久久久久久丝袜 | 天堂中文资源在线 | 黄色三级毛片 | 国产亚洲一区二区三区 | 在线播放国产一区二区三区 | 色999视频 | 久久久久成人精品 | 日韩欧美一区二区在线播放 | 播放一级毛片 | 亚洲国产精品一区 | 婷婷色在线播放 | 精精国产视频 | 久久91精品久久久久久9鸭 | 国产一区二区不卡 | 久久久久久久一区 | 国产在线一区观看 | 国产精品久久久99 | 韩国欧洲一级毛片 | 亚洲天堂影院 | 成人久久18免费 | 国产精品一区一区三区 | 欧美精品一二区 | 日韩精品二区 | 色网在线观看 | 天天玩天天操天天干 | 欧美一区二区三区在线观看 | 日韩精品一区二区在线观看 |