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

📄 text2.c

📁 通过DS18B20测量温度,通过LCD12864显示,注释清楚明确
💻 C
字号:
/****************************************************************************/
//头文件

#include <reg51.h>
#include <string.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define SLAVE 0x02                //从机地址

/****************************************************************************/
//引脚定义
sbit   DQ   =  P1^0;
sbit   ad  = P1^1;
sbit   SID   =  P1^3;	//数据
sbit   SCLK  =  P1^4;	//时钟
sbit   test  =  P1^2;
sbit   k1=P0^2;
sbit   k2=P0^7;
sbit   a     =P3^4;
sbit   b     =P3^5;
sbit   P15=P1^5;
/*****************************************************************************/


/****************************************************************************/
//定义全局变量
uchar data shidu1,shidu2;
uchar data temp_data[2]={0x00,0x00};
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
uint k=0;
int ot0;

/****************************************************************************/

/****************************************************************************/
//函数声明
void lcm_w_word(unsigned char *str) ;  //写字符  例:lcm_w_word("您好!");
void lcm_w_test(bit start,unsigned char ddata);  //(0,指令) (1,数据)
void lcm_w_byte(unsigned char bbyte);  //写一个字节给lcm
void delaynms(unsigned int di);  //延时
void lcm_init(void); //lcm初始化
void lcm_clr(void);  //清屏
read_temp();
ow_reset(void);
void delay(int t);
void write_byte(uchar val);
uchar read_byte(void);
work_temp();
//void Timer0() interrupt 1 using 0;
void int0();
void int1();
out();
/********************************************************/
void DelayM(unsigned int a);
void DelayM(unsigned int a){//延时函数 1MS/次	
		unsigned char i;
		while( --a != 0){		
			for(i = 0; i < 125; i++);  //一个 ; 表示空语句,CPU空转。
		}   				   //i 从0加到125,CPU大概就耗时1毫秒
}

/**********************************************************************/
//延迟函数 11us
void delay(int t)
{
for(;t>0;t--);
}



//18B20复位函数
ow_reset(void)
{
	char presence=1;
	while(presence)
	{
		while(presence)
			{
				DQ=1;_nop_();_nop_();
				DQ=0;
				delay(50);
				DQ=1;
				delay(6);
				presence=DQ;
			}
			delay(45);
			presence= ~DQ;
	 }
	 DQ=1;

}


 
//18B20写命令函数 向总线上写一个比特
void write_byte(uchar val)
{
	uchar i;
	for(i=8;i>0;i--)
	{
		DQ=1;_nop_();_nop_();
		DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
		DQ=val&0x01;
		delay(6);
		val=val/2;
	}
	DQ=1;
	delay(1);
}

//18B20读1比特函数,从总线上读取一个字节
uchar read_byte(void)
{
	uchar i;
	uchar value=0;
	for (i=8;i>0;i--)
	{
		DQ=1;_nop_();_nop_();
		value>>=1;
		DQ=0;
		_nop_();_nop_();_nop_();_nop_();
		DQ=1;_nop_();_nop_();_nop_();_nop_();
		if(DQ)value|=0x80;
		delay(6);
	}
	DQ=1;
	return(value);
}


//读取温度函数
read_temp()
{
	ow_reset();
	write_byte(0xCC);
	write_byte(0xBE);
	temp_data[0]=read_byte();
	temp_data[1]=read_byte();
	ow_reset();
	write_byte(0xCC);
	write_byte(0x44);
}
work_temp()
{
	uchar n=0;
	if (temp_data[1]>127)
	{
		temp_data[1]=(256-temp_data[1]);
		temp_data[0]=(256-temp_data[0]);
		n=1;
	}

	display[4]=temp_data[0]&0x0f;
	display[0]=ditab[display[4]];
	display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
	display[3]=display[4]/100;
	display[1]=display[4]%100;
	display[2]=display[1]/10;
	display[1]=display[1]%10;
	if(!display[3])
	{
		display[3]=0x00;
		if(!display[2])
			{
				display[2]=0x00;
			}
	}		  
	if(n)
	{
		display[3]=0x0a;
	}



}
/****************************************************************************/
//初始化LCM
void lcm_init(void)	 {
	delaynms(100); //启动等待,等LCM讲入工作状态
  	lcm_w_test(0,0x30);  //8 位介面,基本指令集
  	lcm_w_test(0,0x0c);  //显示打开,光标关,反白关
  	lcm_w_test(0,0x01);  //清屏,将DDRAM的地址计数器归零 
	delaynms(100); //启动等待,等LCM讲入工作状态
 
}
/******************************************************************************/
//写指令或数据  (0,指令) (1,数据)
void lcm_w_test(bit start, unsigned char ddata) {
	unsigned char start_data,Hdata,Ldata;
  	if(start==0) 
		start_data=0xf8;	 //0:写指令
    else    
    	start_data=0xfa;  //1:写数据
  
  	Hdata=ddata&0xf0;		  //取高四位
  	Ldata=(ddata<<4)&0xf0;  //取低四位
  	lcm_w_byte(start_data);	  //发送起始信号
  	delaynms(5); //延时是必须的
  	lcm_w_byte(Hdata);	      //发送高四位
  	delaynms(5);  //延时是必须的
  	lcm_w_byte(Ldata);		  //发送低四位
  	delaynms(5);  //延时是必须的
}

/******************************************************************************/
//发送一个字节(底层函数)
void lcm_w_byte(unsigned char bbyte) {
	unsigned char i;
 	for(i=0;i<8;i++){
   		SID=bbyte&0x80; //取出最高位
 		SCLK=1;
   		SCLK=0;
   		bbyte<<=1; //左移
   	}  
}

/******************************************************************************/
//延时(LCM占用)
void delaynms(unsigned int di) {
	unsigned int da,db;
 	for(da=0;da<di;da++);
   		for(db=0;db<10;db++);
}
	
/*****************************************************************************/
//清屏函数
void lcm_clr(void){
	lcm_w_test(0,0x01);
	delaynms(40); //启动等待,等LCM讲入工作状态

}

/*****************************************************************************/
//向LCM发送一个字符串,长度64字符之内。
//应用:lcm_w_word("您好!"); 
void lcm_w_word(unsigned char *str){
		while(*str != '\0'){
			lcm_w_test(1,*str++);
        }
		*str = 0;
}
void int0() interrupt 0 using 0
{	
	ot0=0;
	lcm_clr();//清屏
	while(ot0==!1)
	{
	lcm_w_word("  进入设置系统                    报警温度                      ");//显示欢迎字
   //----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺

//	lcm_w_word("                ");//显示欢迎字
//	lcm_w_word("                ");//显示欢迎字
//	lcm_w_word("                ");//显示欢迎字
	}

}
void int1() interrupt 2 using 1
{	
	lcm_clr();//清屏
	ot0=1;
	DelayM(500);
	
}
void ssio(void)interrupt 4 using 1
{   
   RI=0;
   
   lcm_w_test(1,0x30+SBUF);
   DelayM(1000);
  
                          //收到地址后翻转一次
}    


/******************************************************************************
void Timer0() interrupt 1 using 0
{
out();
k=0;
}
out()
{
lcm_w_word(1,0x30+(k%10));
lcm_w_word(1,0x30+(k%100));
lcm_w_word(1,0x30+(k%1000));
lcm_w_word(1,0x30+(k%10000));
}
/*****************************************************************************/
//---主程序---//

main() 

{
/*	lcm_init();//初始化液晶显示器
	lcm_w_word("调试串口中      ");
	DelayM(1000);
	P15=0x00;
    TMOD=0x20;          //T/C1定义为方式2
    TL1=0xfd;           //置初值
    TH1=0xfd;
    PCON=0x00;
    TR1=1;
    SCON=0xf0;          //串行口为方式3
    ES=1;EA=1;          //开串行口中断
	RI=1;
    while(1);
*/

	

	lcm_init();//初始化液晶显示器
	lcm_clr();//清屏
//	lcm_w_word("智能加湿器      ");
	ow_reset();
	write_byte(0xcc);
	write_byte(0x44);
	EX0=1;
	EX1=1;
	EA=1;
	IT0=1;
	IT1=1;
	PX0=0;
	PX1=1;

    ad=0;
	DelayM(10);
	ad=1;
while(1)
{


	read_temp();
	work_temp();
	lcm_w_word("作者王奇文  展钰");
	lcm_w_word("温度");
//	lcm_w_test(1,0x30+display[3]);
	lcm_w_test(1,0x30+display[2]);
//	lcm_w_test(1,0x30+display[1]);
	lcm_w_test(1,0x30+display[0]);
	lcm_w_word("度        ");

	lcm_w_word("智能温度显示器  ");





	
	DelayM(10);
//	ad=1;
	DelayM(1000);
	lcm_clr();



}



	//----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺

}				   

⌨️ 快捷键说明

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