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

📄 ceshi2.c

📁 单片机单片机单单片机单片机单片机单片机单片机单片机单片机单片机单片机单片机单片机单片机单片机单片机单片机单片机单片机单片机片机单片机单片机单片机
💻 C
字号:
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>

#define uchar unsigned char 
#define uint unsigned int 

sbit dula=P2^6;
sbit wela=P2^7;
sbit dq=P2^2;
sbit feng=P2^3;

uint c1_temper,c2_temper;
uint L_temper;
uint H_temper;

uchar code1[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar code2[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,
0xBf,0x86,0xDb,0xCf,0xE6, 0xEd,0xEd,0x87,0xFf,0xEf};

void delay_ms(uint z);
void delay_us();
void dq_reset();
void write_cmd(uchar z);
void get_firstid();
void get_seconedid();
void write_bit(uchar dd);
void deal_temper();
void deal_ds1();

void display_temper(uint wengdu);
void init();

uchar keyscanf();
uchar read_byte();
uint get_temper();
uchar read_bit();
uchar read_date();

/******************延迟****************/

void delay_ms(uint z)//毫秒级的延迟
{	
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);	
}

void delay_us()//延时微秒
{
	_nop_();
}

/*****************复位*************************/

void dq_reset()
{
	uchar t;
	uchar dd;
	dq=0;
	for(t=250;t>0;t--);
	dq=1;
	for(t=5;t>0;t--);
	dd=dq;
	for(t=150;t>0;t--);
	return;
}

/******************读位写位**********************/

uchar read_bit()
{
	uchar t;
	uchar dd;

	dq=0;
	delay_us();delay_us();
	dq=1;
	for(t=3;t>0;t--);
	dd=dq;//get the signal
	for(t=20;t>0;t--);
	return dd;
}

void write_bit(uchar dd)
{
	uchar t;

	if(dd==1)
	{
		dq=0;
		delay_us();
		dq=1;
		for(t=30;t>0;t--);	
	}	
	else
	{
		dq=0;
		for(t=30;t>0;t--);
		dq=1;
		delay_us();
		delay_us();
	}
}

/******************写命令写数据***********************/

void write_cmd(uchar z)//写命令
{
	uchar i;
	uchar temp;
	uchar cmd=z;

	for(i=0;i<8;i++)
	{
		temp=cmd&0x01;
		if(temp)
		{
			write_bit(1);
		}
		else
		{
			write_bit(0);	
		}
		cmd=_cror_(cmd,1);
	}	
	
}

/*****************温度******************************/

uchar read_byte()//读字节
{ 
	uchar i;
	uchar temp; 
	uchar dd;

	temp=0x00; 
	for(i=0;i<8;i++) 
	{ 
		temp=_cror_(temp,1); 
		dd=read_bit();
		if(dd==1) 
		{ 
			temp=temp|0x80; 
		} 
		else 
		{ 
			temp=temp|0x00; 
		} 
	} 
	return(temp); 
} 

uint get_temper()//get centigrad for the ram
{

	uchar LSB_temper;
	uchar MSB_temper;
	uint c_temper=0;
	float f_temper=0;
	
	dq_reset();
	write_cmd(0xcc);
	write_cmd(0xbe);//读存储器内的温度

	LSB_temper=read_byte();
	MSB_temper=read_byte();
	
	dq_reset();//复位
	
	c_temper=MSB_temper;
	c_temper=(c_temper<<8);
	c_temper=c_temper|LSB_temper;
	f_temper=c_temper*0.0625;
	c_temper=f_temper*10+0.5;
	
	return (c_temper);
}

/******************获取序列号************************/

void get_firstid()
{
	uchar t;
	uchar w=0;
	uchar d1,d2;
	uchar temp=0x00;
	
	dq_reset();
	write_cmd(0xf0);//搜索序列号命令

	for(t=0;t<64;t++)
	{
		d1=read_bit();
		d2=read_bit();
		if((t>0)&&(t%8==0))
		{	
		 	code1[w]=temp;
			temp=0x00;
			++w;
		}	
		temp=_cror_(temp,1);
		
		if( (d1==1) && (d2==0) )
		{
			temp=temp|0x80;
			write_bit(1);
		}
		else if( (d1==0) && (d2==1))
		{
			temp=temp|0x00;
			write_bit(0);
		}
		else if( (d1==0) && (d2==0) )
		{
			temp=temp|0x00;
			write_bit(0);
		}
	}
}

void get_seconedid()
{
	uchar t;
	uchar w=0;
	uchar d1,d2;
	uchar temp=0x00;
	
	dq_reset();
	write_cmd(0xf0);//搜索序列号命令
	
	for(t=0;t<64;t++)
	{
		d1=read_bit();
		d2=read_bit();
		if((t>0)&&(t%8==0))
		{	
		 	code2[w]=temp;
			temp=0x00;
			++w;
		}	
		temp=_cror_(temp,1);
		
		if( (d1==1) && (d2==0) )
		{
			temp=temp|0x80;
			write_bit(1);
		}
		else if( (d1==0) && (d2==1))
		{
			temp=temp|0x00;
			write_bit(0);
		}
		else if( (d1==0) && (d2==0) )
		{
			temp=temp|0x80;
			write_bit(1);
		}
	}
}

/*******************温度处理**************************/
void deal_temper()
{
	uchar key=0;
	while(1)
	{
		key=keyscanf();
		if(key!=0)
		{
			 deal_ds1();
		}
	}
}

void deal_ds1()
{
	uchar t;
	
	while(1)
	{
		dq_reset();
		write_cmd(0xcc);
		write_cmd(0x44);//温度转换
		c1_temper=get_temper();
		for(t=20;t>0;t--)
		{
			display_temper(c1_temper);
		}
	}
}

/*********************按键选择************************/

uchar keyscanf()
{	
	uchar temp;
	uchar ke=0;

	P3=0xf7;
	temp=P3;
	temp=temp&0xf0;
	while(temp!=0xf0)
	{
		switch(temp)
		{
			case 0xe0: ke=1;break;
			case 0xd0: ke=2;break;
			case 0xb0: ke=3;break;	
			case 0x70: ke=4;break;
		}
		temp=P3;
		temp=temp&0xf0;
		delay_ms(5);
	}
	return ke;
}

/******************温度显示***********************/

void display_temper(uint wengdu)//显示当前温度值
{
	uchar xx,yy,zz;
	uint temp;
	
	temp=wengdu;
	xx=temp/100;
	yy=temp%100/10;
	zz=temp%10;
	
	wela=1;
	P0=0xfe;
	wela=0;

	P0=0x00;
	dula=1;
	P0=table[xx];
	dula=0;
	delay_ms(2);
	
	P0=0xff;
	wela=1;
	P0=0xfd;
	wela=0;

	P0=0x00;
	dula=1;
	P0=(table[yy]+0x80);
	dula=0;
	delay_ms(2);
	
	P0=0xff;
	wela=1;
	P0=0xfb;
	wela=0;

	P0=0x00;
	dula=1;
	P0=table[zz];
	dula=0;
	delay_ms(1);
}

/****************初始化与主函数******************/

void init()//初始化
{
	L_temper=100;
	H_temper=320;
	
	dula=0;
	wela=0;
}

void main()
{
	init();
	while(1)
	{
		get_firstid();
		get_seconedid();
		delay_us();
		deal_temper();
	}
}

⌨️ 快捷键说明

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