找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4997|回复: 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 单片机教程网

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