基于18b20显示2位温度并显示上下限,超限报警,温度上下限均可调整,附带闪烁灯
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit ds=P2^2;
- sbit key1=P3^4;
- sbit key2=P3^5;
- sbit key3=P3^6;
- sbit dula=P2^6;
- sbit wela=P2^7;
- sbit beep=P2^3;
- bit key=0;
- sbit led=P1^2;
- uint get_temp();
- void send(uchar);
- uint temp,num,p,cycle,high,low,zd,xs,TL;
- uint l=19; //定义温度下限
- uint h=25; //定义温度上限
- uchar code table[]={0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0xbf,0x86,
- 0xdb,0xcf,0xe6,0xed,
- 0xfd,0x87,0xff,0xef};
- void delay(uint z) //延时函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void delay1(uint ms)
- {
- uchar j;
- while(ms--)
- for(j=110;j>0;j--);
- }
- /////中断/////////////////////
- void init()
- {
- TMOD|=0X10;
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- //按键扫描程序******************************************************
- void keyscan()
- {
- if(key3==0)
- delay1(5);
- if(key3==0)
- { while(!key3);
- key=!key;
- while(key3==0);
- }
- if(key==0)
- {
- if(key1==0)
- {
- delay1(5);
- if(key1==0)
- {
- //while(!key1) ;
- l++;
- delay(50);
- if(l==99)
- l=0;
- }
- }
- if(key2==0)
- {
- delay1(5);
- if(key2==0)
- {// while(!key2);
- if(l!=0)
- l--;
- delay(50);
- }
- }
- }
- if(key==1)
- {
- if(key1==0)
- {
- delay1(5);
- if(key1==0)
- {// while(!key1) ;
- h++;
- delay(50);
- if(h==99)
- h=0;
- }
- }
- if(key2==0)
- {
- delay1(5);
- if(key2==0)
- {//while(!key2);
- if(h!=0)
- h--;
- delay(50);
- }
- }
- }
- }
- //温度传感器********************************************************
- void dsreset()//ds18b20复位 初始化函数
- {
- uint i;
- ds=0;
- i=80;
- while(i>0)i--;
- ds=1;
- i=4;
- while(i>0)i--;
- }
- bit tempreadbit()
- {
- uint i;
- bit dat;
- ds=0;i++; //i++起延时作用
- ds=1;i++;i++;
- dat=ds;
- i=8;while(i>0)i--;
- return(dat);
- }
- uchar tempread()
- {
- 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=dat>>1;
- if(testb)//写一
- {
- ds=0;
- i++;i++;
- ds=1;
- i=8;
- while(i>0)i--;
- }
- else
- {
- ds=0;//写0
- i=8;while(i>0)i--;
- ds=1;
- i++;i++;
- }
- }
- }
- void tempchange() //DS18B20开始获取温度并转换
- {
- dsreset();
- delay(1);
- tempwritebyte(0xcc); //写跳过读ROM指令
- tempwritebyte(0x44); //写温度转换指令
- }
- uint get_temp()
- {
- uchar a,b;
- dsreset();
- delay(1);
- tempwritebyte(0xcc);
- tempwritebyte(0xbe);
- a=tempread(); //读低八位
- b=tempread(); //读高八位
- temp=b;
- temp<<=8;//两个字节组合为一个字
- temp=temp|a;
- temp=temp*0.0625; //温度在寄存器中为12位,分辨率位0.0625 度
- SBUF=temp;
- return temp;//temp是整型
- }
- //数码管显示**********************************************************************
- void display(uchar num,uchar dat)//数据显示程序
- { //num是第几个数码管,dat是要显示的数字
- uchar i;
- P0=0xff;
- wela=1; //消影
- wela=0;
- P0=table[dat];//编码赋给P0口
- dula=1;
- dula=0;
- wela=0;
- i=0xFF;
- i=i&(~((0x01)<<(num))) ;
- P0=i;
- wela=1;
- wela=0;
- delay(1);
- }
- //显示温度和阈值*************************************************
- void dis_temp() //显示温度数值函数t传递的是整型温度值
-
- {
- // tempchange();//温度转换函数
- switch(xs)
- {
- case 1:
- display(0,get_temp()%100/10);
- break;
- case 2:
- display(1,get_temp()%10);
- break;
- case 3:
- display(2,l%100/10);
- break;
- case 4:
- display(3,l%10);
- break;
- case 5:
- display(4,h%100/10);
- break;
- case 6:
- display(5,h%10);
- break;
-
- }
- xs++;
- if(xs>6)
- {
- xs=1;
- }
- }
- //报警**********************************************************
- void beep0()
- {
- if(temp<l)
- beep=0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
18b20.rar
(1.9 KB, 下载次数: 72)
|