您的当前位置:首页正文

18b20源程序,led灯亮,蜂鸣器发声等

2022-02-22 来源:客趣旅游网
#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit dula=P2^6;

sbit wela=P2^7;

sbit ds=P2^2 ;

sbit beep=P2^3;

uint temp; float tt; uint warn_11=270; uint warn_12=250;

uint warn_h1=300; //定义整型的温度数据

//定义浮点型的温度数据

//定义温度下限 是温度值乘以10后的结果

// 定义温度上限制;

uint warn_h2=320; //定义温度上限值;

sbit led0=P1^0; //控制发光二极管;

sbit led1=P1^1; //控制发光二极管;

sbit led2=P1^2; sbit led3=P1^3; uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07, 0x7f,0x6f};

uchar code table1[]={

0xbf,0x86,0xdb,0xcf,

0xe6,0xed,0xfd,0x87, 0xff,0xef};

//控制发光二极管;

//控制发光二极管;

//带小数点的0-9编码;

//不带小数点的0-9编码;

void delay(uint z) //延时函数

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void dsreset (void) {

uint i;

ds=0;

i=103;

while (i>0)i--;

ds=1;

//DS 18B20复位,初始化函数;

i=4;

while(i>0)i--;

}

bit tempreadbit(void) {

uint i;

bit dat;

ds=0;i++; ds=1;i++;i++;

dat=ds;

i=8;while(i>0)i--;

return (dat);

}

//读1位数据函数 ;

//i++起延时左右 ;

uchar tempread(void) //读一个字节数据函数;

{

uchar i,j,dat;

dat=0;

for(i=1;i<=8;i++)

{

j=tempreadbit();

dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里;

}

return (dat);

}

void tempwritebyte(uchar dat) //向DS18B20写一个字节函数

{

uint i;

uchar j;

bit testb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat>>=1;

if(testb) {

ds=0;

i++;i++;

ds=1;

i=8;while(i>0)i--;

//写1;

}

else

{

ds=0; //写0;i=8;while(i>0)i--;

ds=1;

i++;i++;

}

}

}

void tempchange(void) //DS18B20开始获取温度并转换;

{

dsreset();

delay(1);

tempwritebyte(0xcc); tempwritebyte(0x44); }

uint get_temp() {

uchar a,b;

dsreset();

delay(1);

tempwritebyte(0xcc); tempwritebyte(0xbe); //写跳过读ROM指令 ;

//写温度转换指令 ;

//读取寄存器中存储的温度数据;

a=tempread(); //读低八位 ;

b=tempread(); //读高八位 ;

temp=b;

temp<<=8;

temp=temp|a;

tt=temp*0.0625; //温度在寄存器中为12位,分辨率为0.0625;

temp=tt*10+0.5; //乘以10表示小数点后面只取一位,加0.5表示四舍五入;

tt=tt+0.05;

return temp; //temp是整型;

}

void display(uchar num,uchar dat) //数据显示程序;

{

uchar i; //num是第几个数码管,dat要显示的数字;

dula=0;

P0=table[dat]; dula=1;

dula=0;

wela=0;

i=0xff; i=i&(~((0x01)<<(num)));

P0=i;

wela=1;

wela=0;

delay(1);

}

void dis_temp(uint t) //编码赋给P0口;

//用i来存储位选数据,只有一位为0;

//显示温度数值函数t传递的是整形的温度值;

{

uchar i;

i=t/100; //除以100得到商为温度的十位;

display(0,i);

delay(1); //在第一个数码管上显示;

i=t%100/10; //100取余再除以10,为温度的个位;

display(1,i+10);

delay(1); //在第二个数码管上显示;

i=t%100%10 ; //100取余再用10取余,为温度的小数位;

display(2,i);

delay(1); //在第三个数码管上显示;

}

/*void dis_temp(uint temp1)

{

uchar shi,ge,wei;

shi=temp1/100;

ge=temp1%100/10;

wei=temp1%10;

P0=table[shi]; //十位

dula=1;

dula=0;

P0=0xff;

P0=0xfe;

wela=1;

wela=0;

delay(1);

P0=table1[ge]; dula=1;

dula=0;

P0=0xff;

P0=0xfd;

wela=1;

wela=0;

delay(1);

P0=table[wei]; dula=1;

dula=0;

P0=0xff;

P0=0xfb;

//个位

//小数点一位

wela=1;

wela=0;

delay(1);

P0=0x39; //摄氏度

dula=1;

dula=0;

P0=0xff;

P0=0xf7;

wela=1;

wela=0;

delay(1);

} */

void warn(uint s,uchar led) //蜂鸣器报警,灯闪烁;

{ uchar i; i=s;

beep=0; P1=~(led); while(i--)

{

dis_temp(get_temp()); }

beep=1; P1=0xff; i=s;

while (i--)

{

//s控制音调,led控制灯;

// 蜂鸣器响;

//控制相应的灯亮;

//用温度显示函数,起延时作用;//蜂鸣器不响;

//控制相应的灯灭;

dis_temp(get_temp()); //用温度显示函数,起延时作用;

}

}

void deal(uint t) //温度处理函数;

{

uchar i;

if((t>warn_12)&&(t{

warn(40,0x01); //第一个灯亮,蜂鸣器发出“滴”声;

}

else if(t<=warn_12) //小于25度;

{

warn(10,0x03); //第一个和第二个灯亮,蜂鸣器发出”滴“声 ;

}

else if((t=warn_h1)) //大于30度小于32度;

{

warn(40,0x04); } else if(t>=warn_12) {

warn(10,0x0c); } else

{

i=40;

while(i--)

//第三个灯亮蜂鸣器发出”滴“声 ;

//大于32度;

//第三个和第四个灯亮,蜂鸣器发出”滴“声 ;//在27度和30度之间是只是调用显示函数;

{

dis_temp(get_temp());

}

}

}

void init_com(void) {

TMOD=0x20;

PCON=0x00;

SCON=0X50;

TH1=0xfd; TL1=0xfd;

TR1=1;

//串口初始化函数;//波特率9600;

}

void comm(char*parr) {

do

{

SBUF=*parr++; while(!T1) ; T1=0; } while(*parr);

}

void main() {

//串口发送函数;

//发送数据;

//等待发送完成标志为1;

//标志清0;

//保持循环直到字符为'\\0' ;

//主函数;

uchar buff[4],i;

dula=0;

wela=0;

init_com();

while(1)

{

tempchange(); //温度转换函数;

for(i=10;i>0;i--)

{

dis_temp(get_temp()) ; //获取温度并显示;

}

deal(temp); //进行温度处理;

sprintf(buff,\"%f\ //将浮点型字符格式化为字符型;

for(i=10;i>0;i--)

{

dis_temp(get_temp()); }

comm(buff); for(i=10;i>0;i--)

{

dis_temp(get_temp()); }

}

}

//温度显示;

//串口发送数据;

//温度显示;

因篇幅问题不能全部显示,请点此查看更多更全内容