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

📄 ds.c

📁 51单片机混合编程>>DS18B20使用
💻 C
字号:
#include<reg2051.h>
#include<absacc.h>
#define unchar unsigned char
unchar tim;
unchar code table[]={0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39,0X41,0X42,0X43,0X44,0X45,0X46};
unchar code tabl1[]={0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,0x7d , 0x07 , 0x7f  , 0x6f };
sbit e=P1^3;
sbit rs=P1^4;
sbit sck=P1^6;
sbit sda=P1^5;
sbit ress=P3^2;
sbit sclk=P3^3;
sbit io=P3^4;
void init_18b20();
void write_18b20(unchar datt);
void read_18b20();
void asm(unchar com);
void see();
void delay();
void time();
void lcd();
void lcd_com(unchar com);
void lcd_write(unchar write);
void m_18b20();
void ad_1();
void i2c_nop();
void i2c_start();
void i2c_stop();
void i2c_write(unchar wrtie);
void i2c_init();
unchar i2c_read_byte();
unchar i2c_read(unchar address);
void i2c_write_add_date(unchar add,date);
void i2c_respons();
unchar ds1302_read(unchar read);
void ds1302_see();
void ds1302_write(unchar com,date);
void main()
{	
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	TR0=1;
	ET0=1;
	EA=1;
	lcd_com(0x38);
	lcd_com(0x09);
	lcd_com(0x0c);
	lcd_com(0x01);
	DBYTE[0X63]=0xff;
	ds1302_write(0x8e,0x80);
	while(1)
	{

		
		if(tim==20)
			{
			//	ds1302_see();
				tim=0;
				EA=0;
				init_18b20();
				write_18b20(0xCC);				
		///		ad_1();
				write_18b20(0x44);
				delay();
				init_18b20();
				write_18b20(0xCC);
		//		ad_1();
				write_18b20(0xbe);
				read_18b20();
				see();
				EA=1;
			}
	}

}
void init_18b20()
{
	#pragma asm
		CLR		50H
		MOV		R7,#250
		CLR		P1.0
		DJNZ	R7,$
		SETB	P1.0
		MOV		R7,#6
		DJNZ	R7,$
		JB		P1.0,$
		MOV		R7,#200
		DJNZ	R7,$
		MOV		R5,#60
		DJNZ	R5,$
	#pragma	endasm			
			
}
void write_18b20(unchar datt)
{
		DBYTE[0X51]=datt;
		#pragma asm
			MOV		R6,#8
			MOV		A,51H
	  DEL:	RRC		A
	  		LCALL	WRITE
			DJNZ	R6,DEL
			MOV		R5,#60
			DJNZ	R5,$
			RET

	WRITE:	MOV		R7,#28
			CLR		P1.0
			NOP
			NOP
			NOP
			NOP
			NOP
			MOV		P1.0,C
			DJNZ	R7,$
			SETB	P1.0
			RET

		#pragma endasm	
}
void m_18b20()
{
	#pragma asm
		MOV		R5,#8
LOOP3:	LCALL	 DD
		RRC		A
		DJNZ	R5,LOOP3
		RET
DD:		MOV		R7,#23
		MOV		R6,#8
		CLR		P1.0
		NOP
		NOP
		NOP
		NOP
		NOP
		SETB	P1.0
		DJNZ	R6,$
		MOV		C,P1.0
		DJNZ	R7,$
		RET

	#pragma endasm
}
void read_18b20()
{
		#pragma asm
		MOV		R5,#8
LOOP:	LCALL	DEL1
		RRC		A
		DJNZ	R5,LOOP
		MOV		60H,A
		MOV		R5,#60
		DJNZ	R5,$
		
		MOV		R5,#8
LOOP1:	LCALL	DEL1
		RRC		A
		DJNZ	R5,LOOP1
		MOV		61H,A
		MOV		R5,#60
		DJNZ	R5,$
		RET

DEL1:	MOV		R7,#23
		MOV		R6,#8
		CLR		P1.0
		NOP
		NOP
		NOP
		NOP
		NOP
		SETB	P1.0
		DJNZ	R6,$
		MOV		C,P1.0
		DJNZ	R7,$
		RET
		#pragma endasm


}
void asm(unchar com)
{
DBYTE[0X66]=com;
	#pragma asm
		 CK		EQU		P1.1
		DATE	EQU		P1.2
		SETB	CK
		MOV		R7,#8
		MOV		A,66H
SS:		RLC	    A
		MOV		DATE,C
		CLR		CK
		SETB	CK
		DJNZ	R7,SS
	#pragma endasm
}
void delay()
{
	unchar x,y;
	for(x=100;x>0;x--)
		for(y=6;y>0;y--);
}
void see()
{
	unchar shi,ge;
	DBYTE[0X65]=DBYTE[0X60];
	if(DBYTE[0X63]!=DBYTE[0X60])
		{
		DBYTE[0X63]=DBYTE[0X60];
		if(DBYTE[0X61]==0XFF)
			{
				DBYTE[0X60]=256-DBYTE[0X60];
				DBYTE[0X60]=DBYTE[0X60]/2;
				shi=DBYTE[0X60]/10;
				ge=DBYTE[0X60]%10;
				lcd_com(0x01);
				time();
				time();
				time();
				time();
				time();
				time();
				asm(tabl1[ge]);
				asm(tabl1[shi]);
				//lcd_write('-');
				//lcd_write(table[shi]);
				//lcd_write(table[ge]);
				//lcd_write(0xdf);
				//lcd_write('C');
			}
		else{
			lcd_com(0x01);
			time();
			time();
			time();
			time();
			time();
			time();
			lcd_write('+');
			if(DBYTE[0X65]>=200)
				{	
				DBYTE[0X60]=DBYTE[0X60]/2;
				DBYTE[0X60]=DBYTE[0X60]-100;
				shi=DBYTE[0X60]/10;
				ge=DBYTE[0X60]%10;
			/*	lcd_write('1');
				lcd_write(table[shi]);
				lcd_write(table[ge]);
				lcd_write(0xdf);
				lcd_write('C');	 */
				asm(tabl1[ge]);
				asm(tabl1[shi]);
				}
			else{
				DBYTE[0X60]=DBYTE[0X60]/2;
				DBYTE[0X65]=DBYTE[0X60];
				shi=DBYTE[0X60]/10;
				ge=DBYTE[0X60]%10;
			/*	lcd_write(table[shi]);
				lcd_write(table[ge]);
				lcd_write(0xdf);
				lcd_write('C');	 */
				asm(tabl1[ge]);
				asm(tabl1[shi]);
				}
			}
			}
}
void time()
{
	unchar x1;
	for(x1=100;x1>0;x1--);
}
void lcd_com(unchar com)
{
	rs=0;
	e=0;
	asm(com);
	time();
	e=1;
	time();
	e=0;
	time();

}
void lcd_write(unchar write)
{
	rs=1;
	e=0;
	asm(write);
	time();
	e=1;
	time();
	e=0;
	time();
}
void time_0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	tim++;	
}
void ad_1()
{
	write_18b20(0x11);
	write_18b20(0x11);
	write_18b20(0x11);
	write_18b20(0x11);
	write_18b20(0x11);
	write_18b20(0x11);
	write_18b20(0x11);
	write_18b20(0x11);
}
void i2c_nop()
{
	#pragma	asm
		MOV		R3,#6
		DJNZ	R3,$
	#pragma endasm
}
void i2c_start()
{
	sda=1;
	i2c_nop();
	sck=1;
	i2c_nop();
	sda=0;
	i2c_nop();
}
void i2c_stop()
{
	sda=0;
	i2c_nop();
	sck=1;
	i2c_nop();
	sda=1;
	i2c_nop();

}
void i2c_write(unchar write)
{
		DBYTE[0X70]=write;
			#pragma asm
			MOV		R6,#8
			
	DEL5:	RLC		A
			CLR		P1.6	//SCK
			LCALL	TP
			MOV		P1.5,C
			LCALL	TP
			SETB	P1.6
			LCALL	TP
			CLR		P1.6
			DJNZ	R6,DEL5
			RET
			
			
TP:			NOP
			NOP
			NOP
			NOP
			NOP
			RET
			#pragma endasm
		
}
void i2c_init()
{
	sck=1;
	sda=1;
	i2c_nop();
}
unchar i2c_read_byte()
{
	unchar i;
	sck=0;
	i2c_nop();
	sda=1;
	i2c_nop();
	for(i=0;i<8;i++)
		{
			sck=1;
			i2c_nop();
			DBYTE[0X71]=(DBYTE[0X71]<<1)|sda;
			sck=0;
			i2c_nop();

		}
	return	DBYTE[0X71];
	
}
void i2c_respons()
{
	unchar i;
	sck=1;
	i2c_nop();
	while((sda==1)&&(i<200))i++;
	sck=0;
	i2c_nop();
		
}
void i2c_add_write(unchar add,date)
{
		i2c_start();
		i2c_write(0xa0);
		i2c_respons();
		i2c_write(add);
		i2c_respons();
		i2c_write(date);
		i2c_respons();
		i2c_stop();	
}
unchar i2c_read(unchar address)
{
	i2c_start();
	i2c_write(0xa0);
	i2c_respons();
	i2c_write(address);
	i2c_respons();
	i2c_start();
	i2c_write(0xa1);
	i2c_respons();
	DBYTE[0X72]=i2c_read_byte();
	i2c_stop();
	return DBYTE[0X72];	
}
unchar ds1302_read(unchar read)
{
		DBYTE[0X73]=read;
		ress=1;
		#pragma asm
			MOV		R6,#8
			MOV		A,73H
EEL0:		CLR		P3.3
			LCALL	EEL
			RRC		A
			MOV		P3.2,C
			SETB	P3.3
			LCALL	EEL
			DJNZ	R6,EEL0
			MOV		R6,#8
EEL1:		CLR		P3.3
			LCALL	EEL
			MOV		C,P3.2
			RLC		A
			SETB	P3.3
			LCALL	EEL
			DJNZ	R6,EEL1
			MOV		74H,A
			RET

EEL:		MOV		R5,#20
			DJNZ	R5,$
			RET
		#pragma endasm
		return DBYTE[0X74];	
}
void ds1302_write(unchar com,date)
{
			DBYTE[0X74]=com;
			DBYTE[0X75]=date;
			ress=1;
			#pragma asm
			MOV		R6,#8
			MOV		A,74H
AEL0:		CLR		P3.3
			LCALL	AEL
			RRC		A
			MOV		P3.2,C
			SETB	P3.3
			LCALL	AEL
			DJNZ	R6,AEL0

			MOV		R6,#8
			MOV		A,75H
AEL1:		CLR		P3.3
			LCALL	AEL
			RRC		A
			MOV		P3.2,C
			SETB	P3.3
			LCALL	AEL
			DJNZ	R6,AEL1
			RET

AEL:		MOV		R5,#20
			DJNZ	R5,$
			RET	
			#pragma endasm
				
}
void ds1302_see()
{
	unchar shi,ge,temp;
		temp=ds1302_read(0x81);
		shi=temp/10;
		ge=temp%10;
		lcd_com(0x80+0x04);
		lcd_write(table[shi]);
		lcd_write(table[ge]);

}

⌨️ 快捷键说明

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