⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.txt

📁 带温度补偿的超声波测距(测温使用DS18B20)
💻 TXT
字号:

#include <REG2051.H>
#define k1 P3_4
#define csbout    P2_7                  //超声波发送
#define csbint    P2_0                  //超声波接收
#define csbc=0.034
#define bg  P3_3 
unsigned char csbds,opto,digit,buffer[3],xm1,xm2,xm0,key,jpjs;//显示标识
unsigned char convert[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0~9段码
unsigned int s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1;
bit cl;      
                             
void csbcj();
void delay(j);                              //延时函数
void scanLED();                              //显示函数
void timeToBuffer();                  //显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
void k4cl();
void offmsd();
void cal();

void main()                              //主函数
{
     EA=1;                                //开中断
     TMOD=0x11;                        //设定时器0为计数,设定时器1定时
     ET0=1;                              //定时器0中断允许 
     ET1=1;                              //定时器1中断允许 
     
     TH0=0x00;
     TL0=0x00;
     TH1=0x9E;
     TL1=0x57;
     
     csbds=0;
     csbint=1;
     csbout=1;
     cl=0;
     opto=0xff;
     jpjs=0;
     
     sj1=45;
     sj2=200;
     sj3=400;
     
     k4cl();
     TR1=1;                        
     while(1)
       {
           keyscan();
           if(jpjs<1)
           {
           	csbcj();
           	if(s>sj3)
           {
           buffer[2]=0x76;      
           buffer[1]=0x76;      
           buffer[0]=0x76;      
           }
           else if(s<sj1)
           {
           buffer[2]=0x40;      
           buffer[1]=0x40;      
           buffer[0]=0x40;
           }
           else timeToBuffer();      
           }
           else timeToBuffer();            //将值转换成LED段码
           offmsd();
             scanLED();                  //显示函数
           if(s<sj2)
           bg=0;
           bg=1;
     }
}


void scanLED()                       //显示功能模块
{
    digit=0x04;
    for( i=0; i<3; i++)        //3位数显示
    {
        P3=~digit&opto;        //依次显示各位数
        P1=buffer[i];        //显示数据送P1口
        delay(20);              //延时处理
        P1=0xff;             //P1口置高电平(关闭)
        if((P3&0x10)==0)      //判断3位是否显示完
           key=0;
        digit>>=1;             //循环右移1位
    }
}

void timeToBuffer()                //转换段码功能模块
{
     xm0=s/100;      
     xm1=(s-100*xm0)/10;
     xm2=s-100*xm0-10*xm1;
     buffer[2]=convert[xm2];      
     buffer[1]=convert[xm1];
     buffer[0]=convert[xm0];
}

void delay(i)                              
{
    while(--i);
}

void timer1int (void) interrupt 3  using 2 
{
     TH1=0x9E;
     TL1=0x57;
     csbds++;
     if(csbds>=40)
     {
           csbds=0;
           cl=1;
     }            
}

void csbcj()
{
     if(cl==1)
     {
           TR1=0;
           TH0=0x00;
           TL0=0x00;
           i=10;
           while(i--)
           {
                 csbout=!csbout;
           }
           TR0=1;                  
               i=mqs;                              //盲区
           while(i--)
           {
           }
           i=0;
           while(csbint)
           {
                 i++;
                 if(i>=2450)                  //上限值
                 csbint=0;
           }
           TR0=0;
           TH1=0x9E;
           TL1=0x57;
           t=TH0;
           t=t*256+TL0;
           s=t*csbc/2;
           TR1=1;
           cl=0;
     }
}

void keyscan()                        //健盘处理函数
{
     xx=0;
     if(k1!=1)                              // 判断开关是否按下
     {
           delay(400);                        //延时去抖动
           if(k1!=1)                              // 判断开关是否按下      
           {            
           while(!k1)
           {
                 delay(30);      
                 xx++;
           }
           if(xx>2000)            
           {
                 jpjs++;
                 if(jpjs>4)
                 jpjs=0;
           }
           xx=0;
           switch(jpjs)
           {
           case 1: k1cl();break;            
           case 2: k2cl();break;
           case 3: k3cl();break;
           case 4: k4cl();break;
           }
           }
     }
}
     


void k1cl()
{
	sj1=sj1+5;
	if(sj1>100)
	sj1=30;
	s=sj1;
}
void k2cl()
{
	sj2=sj2+5;
	if(sj2>500)
	sj2=40;
	s=sj2;
}

void k3cl()
{
	sj3=sj3+10;
	if(sj3>500)
	sj3=100;
	s=sj3;
}

void k4cl()
{
	sx1=sj1-1;
	sx1=sx1/csbc;
	mqs=sx1/4.5;
}

void offmsd()                                              
{
    if (buffer[0] == 0x3f)                            
    buffer[0] = 0x00;
}











//////////////////////////////////////////////////////////////////////////////////////////////
:ds18b20的完整程序(c51)(sparkstar)


//DS1820 C51 子程序
//这里以11.0592M晶体为例,不同的晶体速度可能需要调整延时的时间
//sbit DQ =P2^1;//根据实际情况定义端口 

typedef unsigned char byte;
typedef unsigned int word;

//延时
void delay1(word useconds)
{
for(;useconds>0;useconds--);
}

//复位
byte ow_reset(void)
{
byte presence;
DQ = 0; //pull DQ line low
delay1(29); // leave it low for 480us
DQ = 1; // allow line to return high
delay1(3); // wait for presence
presence = DQ; // get presence signal
delay1(25); // wait for end of timeslot
return(presence); // presence signal returned
} // 0=presence, 1 = no part

//从 1-wire 总线上读取一个字节
byte read_byte(void)
{
byte i;
byte value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0; // pull DQ low to start timeslot
DQ = 1; // then return high
delay1(1); //for (i=0; i<3; i++); 
if(DQ)value|=0x80;
delay1(6); // wait for rest of timeslot
}
return(value);
}

//向 1-WIRE 总线上写一个字节
void write_byte(char val)
{
byte i;
for (i=8; i>0; i--) // writes byte, one bit at a time
{
DQ = 0; // pull DQ low to start timeslot
DQ = val&0x01;
delay1(5); // hold value for remainder of timeslot
DQ = 1;
val=val/2;
}
delay1(5);
}

//读取温度
char Read_Temperature(void)
{
union{
byte c[2];
int x;
}temp;

ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
temp.c[1]=read_byte();
temp.c[0]=read_byte();
ow_reset();
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion
return temp.x/2;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -