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

📄 lesson7.c

📁 ds18b20通过51单片机数码管温度显示
💻 C
字号:
#include <AT89X52.h> 
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char	
#define flag1  F0    //18b20存在标志	
sbit io=P2^2;
sbit key1=P1^0;		//查看温度上下限
sbit key2=P1^1;		// 减1
sbit key3=P1^2;		// 加1 
sbit duan=P2^6;
sbit wei=P2^7;

uchar count;		//key1按下的次数
uchar code disp[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,
0xbf,0xff//显示"-",不显示
};		//        16,      17 
uchar code xiaoshu[16]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar a,b,h,l;//从ds18b20读出来的数据
uchar shi,ge,xiao,temp;
uchar delay1;	//作延时用
void delay(uint i); //延时11us *i
void deal_with();
void display();
void reset();
uchar read();	//读一个字节
void write(uchar dat);  //写一个字节到ds18b20
void set();	//改变温度上下限和精度
void copy();//复制温度上下限到ROM
void check(); //把当前温度与上下限比较
void main()
{ 
	while(1)
	{
		 reset();
		 while(flag1)
		 {
            beep();
			reset();
		 }
		 reset();
		 write(0xcc);// 跳过读序号列号的操作
		 write(0x44); // 启动温度转换
		 reset();
		 write(0xcc);// 跳过读序号列号的操作
		 write(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
		 a=read();	//温度低位
		 b=read();	//温度高位
		 h=read();	//温度上限	   
		 l=read();	//温度下限
				 
		 if(count==0)  //如果无键按下
		 		deal_with();
		 display();	
		 keyscan();
		 check();
	
	 }
}
void delay(uint i) //延时11us *i
{
	while(i--);
}
void deal_with()
{	
	
	b=b<<4;		//舍弃符号位 
	xiao=a;	
	a=a>>4;		//舍弃小数
	xiao=xiao&0x0f;//得到小数
	temp=b|a;	 //得到温度整数部分
	shi=temp/10;
	ge=temp%10;
}

void display()
{
	uchar d;
	duan=1;
	P0=disp[shi];
	duan=0;
	wei=1;
	P0=0x01;
	delay(100);
	P0=0;
	wei=0;

	duan=1;
	d=disp[ge];
	P0=d&0x7f;//显示小数点 
	duan=0;
	wei=1;
	P0=0x02;
	delay(100);
	P0=0;
	wei=0;

	duan=1;
	P0=disp[xiaoshu[xiao]];
	duan=0;
	wei=1;
	P0=0x04;
	delay(100);
	P0=0;
	wei=0;

	duan=1;
	P0=disp[12];//显示"C"
	duan=0;
	wei=1;
	P0=0x08;
	delay(100);
	P0=0;
	wei=0;
}

void reset()
{
	flag1=1;
	 io=1;
	 delay(8); //稍做延时
	 io=0;
	 delay(80);//延时大于480us
	 io=1;
	 delay(6);
	 flag1=io;//如果flag是0,则初始化成功
	 delay(20);
}


uchar read()	//读一个字节
{
	uchar k,dat=0;
	for(k=0;k<8;k++)
	{	
		io=0; 
		dat>>=1;
		io=1;
		if(io)
			dat=dat|0x80;
		delay(4);	
	}
	return dat;	
}

void write(uchar dat)  //写一个字节到ds18b20
{
	uchar j;
	for(j=0;j<8;j++)
	{
		io=0;
		dat=dat>>1;	 //把dat的最低位送到io口
		io=CY;
		delay(5);
		io=1;
		delay1=1;	//延时2us
	}
	delay(4);
}


void set()	//改变温度上下限和精度
{
	reset();
	write(0xcc);// 跳过读序号列号的操作
	write(0x4e);//把设定的温度值写入寄存器
	write(h);//温度上限
	write(l); //下限
	write(0x7f);//12位精度		
}
void copy()//复制温度上下限到ROM
{
	reset();
	write(0xcc);// 跳过读序号列号的操作
	write(0x48);//把温度上下限寄存器的内容写入到ROM
}
void check() //把当前温度与上下限比较
{
	if((temp>h)||(temp<l))
		beep();
			
}

⌨️ 快捷键说明

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