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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的汽車紅外測距程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:126590 發表于 2016-6-13 23:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<STC12.h>
#define uchar unsigned char
#define uint unsigned int
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
uchar code table[]="0123456789";
uchar code table1[]="D1=";
uchar code table3[]="D2=";
uchar code table2[]="set:";
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^5;
sbit wela=P2^3;
sbit key1=P2^1;
sbit key2=P2^0;
sbit key3=P1^6;
sbit key4=P1^7;
//sfr ADC_CONTR = 0xBC;
//sfr ADC_RES = 0xBD;
sfr ADC_LOW2 = 0xBE;
sfr PLASF = 0x9D;
int distance_danger=30;
int a=0;
int c=0;
int e=0;
int bai,shi,ge;
int AD_result=0;
int AD_result2=0;
int count=0;
int beep_count=0;
int aa=0;
int distance=0,distance2=0;
uchar num;
void delay(uint z)                         //延時
{
   uint x,y;
   for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}
void write_com(uchar com)           //液晶寫命令
{
   lcdrs=0;
   P0=com;
   delay(5);
   lcden=1;
   delay(5);
   lcden=0;
}
void write_data(uchar date)                  //液晶寫數據
{
   lcdrs=1;
   P0=date;
   delay(5);
   lcden=1;
   delay(5);
   lcden=0;
}
void init()                                   //1602液晶初始化
{
//    dula=0;
        wela=0;
        lcden=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}
void keyone()
{
        if(key1==0&&a==0)
        {
                distance_danger++;
                a=1;
        }
        else if(key1==1)
        {
                a=0;
        }
}
void keytwo()
{
        if(key2==0&&c==0)
        {
                distance_danger--;
                c=1;
        }
        else if(key2==1)
        {
                c=0;
        }
}
void xianshi(int number, int adress)           //數值位運算與顯示
{                 
        write_com(0x80+adress);//84
        if (number>999||number<=0)
        {       
                bai=0;
                shi=0;
                ge=0;
                write_data(table[bai]);
                delay(5);
                write_data(table[shi]);
                delay(5);
                write_data(table[ge]);
                delay(5);
        }
        else if (number>99)
        {
                bai=number/100;
                shi=number%100/10;
                ge=number%100%10;
                write_data(table[bai]);
                delay(5);
                write_data(table[shi]);
                delay(5);
                write_data(table[ge]);
                delay(5);
        }
        else if (number>9)
        {
                bai=0;
                shi=number/10;
                ge=number%10;
                write_data(table[bai]);
                delay(5);
                write_data(table[shi]);
                delay(5);
                write_data(table[ge]);
                delay(5);
        }
        else
        {
                bai=0;
                shi=0;
                ge=number;
                write_data(table[bai]);
                delay(5);
                write_data(table[shi]);
                delay(5);
                write_data(table[ge]);
                delay(5);
        }
}
void InitADC()                 //ad轉換初始化
{
        PLASF = 0xff;
        ADC_RES = 0;
        //ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
        delay(2);
}
int AD_cal(int AD)
{
        float y;
        if(AD>=98&&AD<140)
        {
                y=-0.0045*AD*AD+0.715*AD+3.1;       
        }
        else//if(AD>=71&&AD<=98)
        {
                y=0.0344*AD*AD-6.554*AD+341.9;
        }
        if(y>50)
        {
        y=50;
        }
       
        return y;
}
int AD_caculate(char ch)     //         讀取ad
{
        int result=0;
        ADC_CONTR &= !ADC_FLAG;
        result=ADC_RES;
        //ch = 0;
        ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
        return result;
}
int pinjun(char ch)   //20ad轉換的平均值
{
        int i;
        float sum1=0;
        int he[30];
        for(i=0;i<20;i++)
        {
                he=AD_caculate(ch);
                sum1+=he;
        }
        sum1=sum1/20;
        return AD_caculate(ch);
} /**/
void beep_time(int x)        //蜂鳴器
{
        beep_count++;
        if(beep_count>x)
        {
                beep_count=0;
                dula=~dula;
                wela=~wela;
        }
}         
void beep_warning(int xg,int yg)
{
        if(yg<=distance_danger)
        {
                beep_time(yg*3);
//                deng=1;
        }
        else if(xg<=distance_danger)
        {
            beep_time(xg*3);
                //yin=~yin;
//                deng=1;
        }
        else
        {
       // P2=0x00;
                dula=0;//yin=1;deng=0;
                wela=1;       
        }
}          
void main()
{
init();
    write_com(0x80);
        write_data(1);       
   
        init();
        InitADC();
        //IE = 0xa0;
        delay(5);
        write_com(0x80+0x40);                                   //顯示"D1="
        for(aa=0;aa<3;aa++)
        {
                write_data(table1[aa]);       
                delay(5);  
        }
        delay(5);
        write_com(0x80+0x48);                                   //顯示"D2="
        for(aa=0;aa<3;aa++)
        {
                write_data(table3[aa]);       
                delay(5);  
        }
        write_com(0x80);                                                //顯示"set="
        for(aa=0;aa<4;aa++)
        {
                write_data(table2[aa]);
                delay(5);          
        }
        //a=0;
        c=0;
        e=0;
         //P2=0x00;
         dula=0;
//        yin=1;
//        deng=0;
        while(1)
        {
        //       
                //dula=0;
                count++;
                keyone();
                keytwo();
//                keytwo();
//                keythree();
                AD_result=pinjun(0);
                AD_result2=pinjun(1);
                distance=AD_cal(AD_result);//
                distance2=AD_cal(AD_result2);
                beep_warning(distance,distance2);
                if(count>10)
                {       
                        delay(5);
                        xianshi(distance_danger,0x04);
                        delay(5);
                        xianshi(distance,0x43);
                        delay(5);
                        xianshi(distance2,0x4b);
                        count=0;
                }
        }
/*
    init();
        write_com(0x80);
        for(num=0;num<11;num++)
        {
            write_data(table[num]);
                delay(5);
        }
        write_com(0x80+0x40);
        for(num=0;num<13;num++)
    {
            write_data(table1[num]);
                delay(5);
        }
        while(1)
        {
          beep=1;
          delay(500);
          beep=0;
          delay(500);
        } */
}

汽車紅外測距程序.docx

13.78 KB, 下載次數: 29, 下載積分: 黑幣 -5

51單片機控制紅外傳感器測距,通過LC1602顯示

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久里面有精品 | 国产精品视屏 | 亚洲精品一二区 | 久久精品视频免费观看 | 日韩一区中文字幕 | 欧美涩| 日韩aⅴ在线观看 | 久久久久无码国产精品一区 | 视频一区二区在线 | 性色av一区 | 99热精品国产| a在线观看免费 | 精品美女久久久 | 国产成人高清成人av片在线看 | 久久免费精彩视频 | 免费看a | 日韩第1页| 国产成人精品免费 | 伊人久久综合 | 国产乱一区二区三区视频 | 99久久99久久精品国产片果冰 | 一级毛片免费完整视频 | 久久亚洲春色中文字幕久久久 | 日本在线精品视频 | av一区二区三区四区 | 欧美在线一区二区三区 | 亚洲成人黄色 | av男人的天堂在线 | 久久精品国产清自在天天线 | 欧美一区二区在线播放 | 水蜜桃亚洲一二三四在线 | 欧美精品久久久久 | 亚洲精品在线观 | 欧美视频在线免费 | 国产激情视频在线观看 | 国产精品自在线 | 久久久久久亚洲精品 | 韩日在线 | 日本色高清 | 久久久久久看片 | 久久久久久国产免费视网址 |