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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2942|回復: 1
收起左側

超聲波水位控制程序(隨溫度變化)單片機源碼

[復制鏈接]
ID:334622 發表于 2018-5-21 09:03 | 顯示全部樓層 |閱讀模式
#include <reg52.h>                 
#define uchar unsigned char  
#define uint  unsigned int        
#include <intrins.h>

sbit c_send   = P3^3;                //超聲波
sbit c_recive = P3^2;        
sbit rs=P1^0;        
sbit rw=P1^1;        
sbit e =P1^2;        
uchar code table_num[]="0123456789abcdefg";
uchar flag_en = 1;

uint temperature ;
sbit beep = P1^6;   //蜂鳴器
bit flag_300ms ;
long distance;               
uint set_gh,set_gl;                  
bit flag_csb_juli;      
uint  flag_time0;   
uchar key_can;               
uchar menu_1;      
uchar a_a;
bit flag_lj_en;               
bit flag_lj_3_en;         
uchar key_time,key_value;     
bit key_500ms  ;
uint shuiwei;
uint sw_jz;   
uint code wendu_buchang1[46] = {                    
331,332,333,333,334,334,335,336,336,337,337,338,339,339,340,341,341,342,342,343,
343,344,345,345,346,346,347,348,348,349,349,350,351,351,352,352,353,354,354,355,
355,356,357,357,358,358        };
sbit dq   = P1^5;        //18b20
void delay_uint(uint q)
{
        while(q--);
}

void init_18b20()          //18b20初始化函數//
{
        bit q;
        dq = 1;                        
        delay_uint(1);           
        dq = 0;                        
        delay_uint(80);        
        dq = 1;                        
        delay_uint(10);               
        q = dq;                        
        delay_uint(20);               
        dq = 1;                                
}

void write_18b20(uchar dat)        /*寫18b20內的數據*/
{
        uchar i;
        for(i=0;i<8;i++)
        {                                         
                dq = 0;                        
                dq = dat & 0x01;
                delay_uint(5);        
                dq = 1;                        
                dat >>= 1;
        }        
}

uchar read_18b20()        /*讀取18b20內的數據*/
{
        uchar i,value;
        for(i=0;i<8;i++)
        {
                dq = 0;                        
                value >>= 1;        
                dq = 1;                        
                if(dq == 1)               
                        value |= 0x80;
                delay_uint(5);         
        }
        return value;               
}

/*讀取溫度的值 */
uint read_temp()
{
        uint value;
        uchar low;                           
        init_18b20();                  
        write_18b20(0xcc);           
        write_18b20(0x44);         
        delay_uint(50);                  
        init_18b20();                  
        write_18b20(0xcc);         
        write_18b20(0xbe);           
        EA = 0;
        low = read_18b20();           
        value = read_18b20();  
        EA = 1;
        value <<= 8;                  
        value |= low;                  
        value *= 0.0625;              
        return value;                  
}

/***********************1ms延時函數*****************************/
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}


/* 1602命令函數*/
void write_com(uchar com)
{
        e=0;
        rs=0;
        rw=0;
        P0=com;
        delay_uint(25);
        e=1;
        delay_uint(100);
        e=0;
}

/*1602寫數據函數*/
void write_data(uchar dat)
{
        e=0;
        rs=1;
        rw=0;
        P0=dat;
        delay_uint(25);
        e=1;
        delay_uint(100);
        e=0;        
}

/*改變液晶中某位的值*/
void write_string(uchar hang,uchar add,uchar *p)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        while(1)
        {
                if(*p == '\0')  break;
                write_data(*p);
                p++;
        }        
}

/*lcd1602上顯示兩位十進制數*/
void write_sfm2(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(0x30+date/10%10);
        write_data(0x30+date%10);        
}

/*lcd1602上顯示兩位十進制數*/
void write_sfm3(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(0x30+date/100%10);
        write_data('.');
        write_data(0x30+date/10%10);
        write_data(0x30+date%10);        
        write_data('m');
}

/*lcd1602上顯示特定的字符*/
void write_zifu(uchar hang,uchar add,uchar date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(date);        
}

/* init_1602()*/
void init_1602()      //1602初始化
{
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        delay_uint(1000);
        write_string(1,0," Gaodu:  . m      ");        
        write_string(2,0,"H:00.0m L:00.0m   ");
        write_sfm3(2,2,set_gh);         
        write_sfm3(2,10,set_gl);         
        write_zifu(1,15,0xdf);  
}

/********************獨立按鍵程序*****************/
uchar key_can;        

void key()        
{
        static uchar key_new;
        key_can = 20;                  
        P3 |= 0xf0;
        if((P3 & 0xf0) != 0xf0)        
        {
                delay_1ms(1);                     
                if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
                {                                       
                        key_new = 0;
                        switch(P3 & 0xf0)
                        {
                                case 0x70: key_can = 1; break;           
                                case 0xb0: key_can = 2; break;           
                                case 0xd0: key_can = 3; break;         
                        }
                }                        
                flag_lj_en = 1;        
        }
        else
        {
                if(key_new == 0)
                {
                        key_new = 1;
                        flag_lj_en = 0;        
                        flag_lj_3_en = 0;        
                        key_value = 0;        
                        key_time = 0;
                }
        }        
}

/****************按鍵處理顯示函數***************/
void key_with()
{
        if(menu_1 == 0)
        {
                if(key_can == 3)
                {
                        flag_en = 0;   
                        beep = 1;   
                }
                                       
        }
        if(key_can == 1)        
        {
                menu_1 ++;
                if(menu_1 > 1)
                {
                        menu_1 = 0;
                        init_1602() ;   
                }
                if(menu_1 == 3)  
                {
                        write_string(1,0,"  juli:  . m     ");        
                        write_string(2,0,"Jizhun:    m     ");
                }
        }
        if(menu_1 == 1)                        
        {
                if(key_can == 2)
                {
                        if(flag_lj_3_en == 0)
                                set_gh ++ ;        
                        else
                                set_gh += 10 ;        
                        if(set_gh > 500)
                                set_gh = 500;
                }
                if(key_can == 3)
                {
                        if(flag_lj_3_en == 0)
                                set_gh -- ;         
                        else
                                set_gh -= 10;        
                        if(set_gh <= set_gl)
                                set_gh = set_gl + 1;
                }
                write_sfm3(2,2,set_gh);         
                write_sfm3(2,10,set_gl);        
                write_com(0x80+0x40+2);  
                write_com(0x0f);         
        }        
        if(menu_1 == 2)               
        {
                if(key_can == 2)
                {
                        if(flag_lj_3_en == 0)
                                set_gl ++ ;               
                        else
                                set_gl += 10 ;               
                        if(set_gl > set_gh)
                                set_gl = set_gh - 1;
                }
                if(key_can == 3)
                {
                        if(flag_lj_3_en == 0)
                                set_gl -- ;        
                        else
                                set_gl -= 10;        
                        if(set_gl <= 10)
                                set_gl = 10 ;
                }
                write_sfm3(2,2,set_gh);         
                write_sfm3(2,10,set_gl);        
                write_com(0x80+0x40+10);  
                write_com(0x0f);         
        }        
        if(menu_1 == 3)
        {
                if(key_can == 2)
                        sw_jz = distance;
                if(key_can == 3)
                        sw_jz = distance;
                write_sfm3(2,8,sw_jz);         
                write_com(0x80+0x40+7);
        }
}  

/**************10us延時函數***************/
void delay()
{
        _nop_();                           
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();  
        _nop_();
        _nop_();  
        _nop_();
}


/*********************超聲波測距程序*****************************/
void send_wave()
{
        c_send = 1;                           
        delay();
        c_send = 0;         
        while(!c_recive);                 
        TR0=1;
        while(c_recive)                     
        {
                flag_time0 = TH0 * 256 + TL0;
                if((flag_time0 > 40000))     
                {
                        TR0 = 0;
                        flag_csb_juli = 2;
                        distance = 888;
                        break ;               
                }
                else
                {
                        flag_csb_juli = 1;        
                }
        }
        if(flag_csb_juli == 1)
        {        
                TR0=0;                                                
                distance = TH0;                                      
                distance = distance * 256 + TL0;
                if(temperature <= 45)
                        distance *= wendu_buchang1[temperature] / 2.0 * 0.0001;            
                else
                        distance *= 358 / 2.0 * 0.0001;            
                if(distance > 600)                                
                {        
                        distance = 888;                        
                }
        }  
}



/*********************定時器0、定時器1初始化******************/
void time_init()         
{
        EA  = 1;                  
        TMOD = 0X11;         
        ET0 = 0;                  
        TR0 = 1;                 
        ET1 = 0;                 
        TR1 = 1;                 
}


/**************報警函數***************/
void clock_h_l()
{
        static uchar value;
        if((shuiwei <= set_gl) || (shuiwei >= set_gh))
        {
                value ++;
                if(value >= 2)
                {
                        if(flag_en == 1)
                                beep = ~beep;           
                }
        }
        else
        {
                value = 0;
                beep = 1;        
                flag_en = 1;
        }        
}

/***************主函數*****************/
void main()
{
        init_1602();     
        time_init();
        while(1)
        {
                if(flag_300ms == 1)
                {
                        flag_300ms = 0;
                        clock_h_l();  
                        temperature = read_temp();        
                        if((beep == 1))
                                send_wave();
                        if(menu_1 == 0)
                        {
                                if(distance > 10 + sw_jz)  
                                {
                                        write_string(1,7,"--.-m");                        
                                }else
                                {
                                        if(sw_jz >= distance)
                                        {
                                                shuiwei = sw_jz - distance;         
                                        }else
                                                shuiwei = 0;        
                                        write_sfm3(1,7,shuiwei);                                       
                                }
                                write_sfm2(1,13,temperature);                        
                        }               
                        write_sfm3(1,8,distance);        
                }
                key();                                       
                if(key_can < 10)
                {
                        key_with();               
                }
        }
}         

/*********************定時器0中斷服務程序************************/
void time1_int() interrupt 3
{        
        static uchar value;
        TH0 = 0x3c;
        TL0 = 0xb0;   
        value ++;         
        if(value % 6 == 0)
        {
                flag_300ms = 1;         
                value = 0;
        }
        if(flag_lj_en == 1)         
        {
                key_time ++;
                if(key_time >= 10)
                {
                        key_time = 0;
                        key_500ms = 1;
                        key_value ++;
                        if(key_value > 3)
                        {
                                key_value = 10;
                                flag_lj_3_en = 1;
                        }                                                
                }
        }
}



陳海燕-超聲波(溫度).rar

49.12 KB, 下載次數: 25, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:104477 發表于 2018-6-27 00:42 來自手機 | 顯示全部樓層
沒有定義按鍵,按鍵定義在哪
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产小视频在线 | 成人免费观看网站 | 亚洲精品视频在线 | 国产欧美一区二区三区日本久久久 | 亚洲精品中文字幕 | 国产精品一区二区不卡 | 产真a观专区 | 欧美日韩国产一区二区 | 成人在线中文字幕 | 国产福利在线 | 亚洲电影一区二区三区 | 日韩av看片| 国产精品久久久久久久午夜 | 亚洲成人综合社区 | 最新国产精品精品视频 | 久久综合一区 | 国产美女视频黄a视频免费 国产精品福利视频 | 久久久久久久一区 | 免费观看毛片 | 无码一区二区三区视频 | 日韩一区二区在线观看 | 国产精品久久久久久久久久免费 | 高清av一区 | 久久国产精品一区二区三区 | 人人干人人舔 | 国产精品久久一区二区三区 | 国产线视频精品免费观看视频 | 91麻豆精品国产91久久久久久久久 | 中文字幕精品一区二区三区精品 | 一级黄色淫片 | 日本黄色大片免费看 | 欧美成人性生活 | 国产在线a | 91精品国产综合久久久久久丝袜 | 九七午夜剧场福利写真 | 在线午夜 | 欧美日韩不卡合集视频 | 一级片在线视频 | 欧美激情欧美激情在线五月 | 在线成人免费观看 | 日本久久精品 |