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

📄 1.c

📁 12232
💻 C
字号:
#include <reg51.H>
#include<intrins.h>
//-----------------------------------------------------------------------
#define uchar unsigned char 
#define uint unsigned int
#define DATAPORT P0         //data port !!!!!!!!!!
#define busy 0x80			   //用于检查写忙信号

//----------液晶端口-------                         
sbit  RS=P1^0;      //h data
sbit  RW=P1^1;
sbit  Elcm=P1^2;

//----------------------按键端口------------
sbit  P2_0=P2^0;
sbit  P2_1=P2^1;
sbit  P2_2=P2^2;
sbit  P2_3=P2^3;

sbit  P2_4=P2^4;	   //继电器端口
sbit  P3_2=P3^2;      //红外端口
sbit  DQ=P3^7;       //DS18B20

//-----------------A/D端口定义------------
sbit Ioclk=P2^6;
sbit dataout=P2^7;
sbit cs=P2^5; 
char Data;

bit ON_OFF;  

uchar Dis_Buff0[16],Dis_Buff1[16]; //显示缓存区
int temp1,temp2,deda,cnt,min,sec,hour,set=0,T=28;
//-----------------------外部函数----------------------------------------
void Init_Lcd12232F(void);
void Cls(unsigned char y);
void DispChar(unsigned char x,unsigned char y,char dataW);
void DispString(unsigned char x,unsigned char y,unsigned char *ptr);
void DispChinese(unsigned char x,unsigned char y,unsigned char *ptr);
void DispNumb(unsigned char x,unsigned char y,unsigned int n);//显示一组数字"1234"
//-----------------------------------------------------------------------
//-----------------------内部函数----------------------------------------
void delay5ms(void);
void delay(unsigned int n);
void WaitForEnable( void );
void LcdWrite_C( unsigned char CMD,unsigned char AttribC );
void LcdWrite_D( char dataW );
void Refresh(unsigned char y);
void set_adj(void);
void inc_key(void);
void dec_key(void);
void key(void);
void ji(void);
//-----------------------------------------------------------------------
//----------------------具体子函数---------------------------------------
// -----------------------------------------短延时
void Delay1us(int i)
{
    while(i--);
}
Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1;    //DQ复位
 Delay1us(8);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 Delay1us(80); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 Delay1us(14);
 x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 Delay1us(20);
}

/**读一个字节**/
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  Delay1us(4);
 }
 return(dat);
}

//写一个字节
WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  Delay1us(5);
  DQ = 1;
  dat>>=1;
 }
//delay(4);
}

//读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
temp1=b<<4;            //高8位中后三位数的值
temp1+=(a&0xf0)>>4;      //低8位中的高4位值加上高8位中后三位数的值   temp1室温整数值
temp2=a&0x0f;
temp2=temp2*0.0625*10;
}
void delay5ms(void)
{	unsigned int i = 5552;
	while(i--);
}
//*********************************************//
//       delay nearly n*0.05s ;;n=20->1s      //
//********************************************//
void delay(unsigned int n)
{	unsigned int i;
	for(;n>0;n--)
	{	for(i=0;i<10000; i++);  }
}
//****************************************************
/*=======================================================
正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
DB7: 0 LCD控制器空闲; 1 LCD控制器忙
========================================================*/
void WaitForEnable( void )
{	DATAPORT = 0xff;
	RS =0; RW = 1; _nop_(); Elcm = 1; _nop_(); _nop_();
	while( DATAPORT&busy );
	Elcm = 0;
} 
/*=======================================================
写控制command子程序: E=1 RS=0 RW=0 h read
=======================================================*/
void LcdWrite_C( unsigned char CMD,unsigned char AttribC ) 
{	if (AttribC) WaitForEnable(); // 检测忙信号?
	RS = 0; RW = 0; _nop_();
	DATAPORT =CMD; _nop_(); // 送控制字子程序
	Elcm = 1;_nop_();_nop_();Elcm = 0; // 操作允许脉冲信号 
}

/*=======================================================
当前位置写字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWrite_D( char dataW ) 
{	WaitForEnable(); // 检测忙信号
	RS = 1; RW = 0; _nop_();
	DATAPORT = dataW; _nop_();
	Elcm = 1; _nop_(); _nop_(); Elcm = 0; // 操作允许脉冲信号 
}
/*=======================================================
当前位置读字符子程序: E =1 RS=1 RW=1
=======================================================*/

unsigned char LcdRead_D(void) 
{	unsigned char dataR;
	WaitForEnable(); // 检测忙信号
	RS = 1; RW = 1; _nop_();
	DATAPORT=0xff;//把DATAPORT置为高电平,只有置为高电平才能正确读入数据
	Elcm = 1; _nop_(); _nop_();_nop_(); 
	dataR = DATAPORT; _nop_();
	Elcm = 0; // 操作允许脉冲信号
    return dataR;
}
	  
//****************************************************
void Init_Lcd12232F(void)
{	LcdWrite_C(0x30,0);  //功能设定,8位数据,基本指令方式
	delay5ms();
	LcdWrite_C(0x30,0); 
	delay5ms();
	LcdWrite_C(0x30,0); 
	delay5ms();
    LcdWrite_C(0x01,1);  //清除显示
    LcdWrite_C(0x02,1);  //地址归位
    LcdWrite_C(0x06,1);  //点设定
    LcdWrite_C(0x0c,1);  //0c整体显示开,0e游标开,0f游标位置反白允许
    LcdWrite_C(0x40,1);  //设定CGRAM地址
	delay(1);//for no warning
}
/*=======================================================
显示刷新
========================================================*/
void Refresh(unsigned char y)
{	unsigned char i,j,pos=0;//pos=0!!!
	if(y) pos|=0x10;
	pos|=0x80;
	for(i=0;i<8;i++)
	{	LcdWrite_C(pos,1);
   		for(j=0;j<2;j++)
		{	WaitForEnable();
	    	if(y==0) LcdWrite_D(Dis_Buff0[i*2+j]);
			else LcdWrite_D(Dis_Buff1[i*2+j]);
		}
		pos++;
	}
} 
/*=======================================================
按指定位置显示一个字符
=======================================================*/
void DispChar(unsigned char x,unsigned char y,unsigned char dataW) 
{	if(y==0) Dis_Buff0[x]=dataW;
	else Dis_Buff1[x]=dataW;
	Refresh(y);
} 
/*=======================================================
按指定位置显示一串字符
=======================================================*/
void DispString(unsigned char x,unsigned char y, unsigned char *ptr) 
{	unsigned char i,len=0;//len=0!!!!!!!!
	while (ptr[len]>31){len++;};//取得要显示的个数
	for(i=0;i<len;i++) DispChar(x+i,y,*ptr++);
}
/*=======================================================
按指定位置显示中文字符串(x必须偶对齐取值为0~7)
=======================================================*/
void DispChinese(unsigned char x,unsigned char y,unsigned char *ptr)
{	unsigned char i,len=0;//len=0!!!!!!!!
	while (ptr[len]>31){len++;};//取得要显示的个数
	for(i=0;i<len;i++)
	{	
	if(y==0) Dis_Buff0[x*2+i]=*ptr++;
		else Dis_Buff1[x*2+i]=*ptr++;
}
	Refresh(y);	 
}				 
/*=======================================================
按指定位置显示一个数字表(4位BCD码)
=======================================================*/
unsigned char code number[]="0123456789";//for dis table
void DispNumb(unsigned char x,unsigned  char y,int n)
{	unsigned char digi[4];
	unsigned char i;
	digi[0]=n/1000;n=n-digi[0]*1000;
	digi[1]=n/100;n=n-digi[1]*100;
	digi[2]=n/10;n=n-digi[2]*10;
	digi[3]=n;
	for(i=0;i<4;i++) DispChar(x+i,y,number[(digi[i])]);
}
/*=======================================================
清屏(y=0->上半屏;y=1->下半屏)
=======================================================*/
void Cls(unsigned char y)	
{	unsigned char i;
	for(i=0;i<16;i++)
	{	if(y==0) Dis_Buff0[i]=' ';
		else Dis_Buff1[i]=' ';
	}
	Refresh(y);
}
void init_timer(void)
{
	TMOD=0x21;
	TH0=-(50235/256);
	TL0=-(50235%256);
	TR0=1;
	ET0=1;
	
	TH1 = 0xFD; //11.0592M
	TL1 = 0xFD;
	PCON&=0x80;
	TR1 = 1;
	ET1 = 1;
	SCON = 0x40; //串口方式
	REN = 1; 
	PT1 = 0;
	PT0 = 1;
	EA = 1;
}

void time() interrupt 1 using 1//定时器T0中断子函数
{
	TH0=-(50235/256);
	TL0=-(50235%256);
	deda++;
	if(deda>=20){sec++;deda=0;}
	if(sec>=60){min++;sec=0;}
	if(min>=60){hour++;min=0;}
	if(hour>=24){hour=0;}
	

}
 
//  A/D转换程序
void change()
 {
 	uchar tmp,count,i;
	tmp=0;
	cs=1;
	Ioclk=0;
	cs=0;
	cs=0;
	for(count=0;count<8;count++)
		{Ioclk=1;
		if(dataout)
		tmp++;
		tmp=tmp<<1;
		Ioclk=0;
		}
		cs=1;
		Data=tmp;
		for(i=0;i<3;i++)
		   {;}
}

//--------串口--------
void delayms(uint t)
{
 uint i;
 while(t--)
 {
  /* 对于11.0592M时钟,约延时1ms */
  for (i=0;i<125;i++)
  {;}
 }
}  
//-----------------发送数据------------------------------------
void SendData(uchar Dat)
{
uchar i=0;
SBUF = Dat;
while (1)
  {
    if(TI)
      {
        TI=0;
        break;
   }
  } 
} 

//---------------调时调温函数-------
void key()
{  	
	P2_0=1;
	P2_1=1;
	P2_2=1;
	P2_3=1;		
   {	
	if(P2_0==0)
	{
	delay(3);
	if(P2_0==0)
		{
		hour++;
		if(hour>=24)
			hour=0;
		  }
	}
	if(P2_1==0)
	{ 
		delay(3);
		if(P2_1==0)
		{
		min++;
		if(min>=60)
		min=0;
		}
	}
	if(P2_2==0)
	{ 
		delay(3);
		if(P2_2==0)
		{
		T++;
		if(T>=35)
		T=20; 
		}
	}  
	}
	
	    DispChar(7,0,hour/10+0x30);
	    DispChar(8,0,hour%10+0x30);
	    DispChar(10,0,min/10+0x30);
        DispChar(11,0,min%10+0x30);	  
	    DispChar(13,0,sec/10+0x30);
	    DispChar(14,0,sec%10+0x30);
	 	DispChar(11,1,T/10+0x30);
	 	DispChar(12,1,T%10+0x30);
}
void ji()
{  	
	P2_0=1;
	P2_1=1;
	P2_2=1;
	P2_3=1;		
   {	
	if(P2_0==0)
	{
	delay(3);
	if(P2_0==0)
		{
		hour++;
		if(hour>=24)
			hour=0;
		  }
	}
	if(P2_1==0)
	{ 
		delay(3);
		if(P2_1==0)
		{
		min++;
		if(min>=60)
		min=0;
		}
	}
	if(P2_2==0)
	{ 
		delay(3);
		if(P2_2==0)
		{
		T++;
		if(T>=40)
		T=20; 
		}
	}  
	}
	
	    DispChar(7,0,hour/10+0x30);
	    DispChar(8,0,hour%10+0x30);
	    DispChar(10,0,min/10+0x30);
        DispChar(11,0,min%10+0x30);	  
	    DispChar(13,0,sec/10+0x30);
	    DispChar(14,0,sec%10+0x30);
	 	
}
//-------------------end LCD12232F.H-----------------------------------------	
void main(void)
{	int a,b,k;b=0;
	P2_4=0;
	Init_Lcd12232F();
	init_timer();
		delay(10);	
	 	   Cls(0);
		   Cls(1);
	DispChinese(0,0,"时间为:");   	
	DispString(9,0,":  :");
	while(1)
	{
		
		change();					 //接收A/D转换的数据函数
		//if((Data-b)>=5&&(b-Data)>=5)
		{  b=Data;			 
	    TR1 = 1;
         SendData(b);//发送函数
		 }
	
		 	P3_2=1;	   
		 ReadTemperature();
		if(P3_2==0&&temp1>=T)
		 { 
		     P2_4=1;
			 P2_3=1;
		     if(P2_3==0)
			 {
		        delay(3);
		         if(P2_3==0)
				  {
					   DispChinese(0,1,"温度设定为:  C ");
					    for(a=0;a<400;a++)
				 			key();				 
				 	 }
				}
		else
			{ 
			DispChinese(0,1,"目前温度是");	
	   		 for(a=0;a<1;a++)
				{
			 		ji();
				   ReadTemperature();
		 			k=temp1/10;
					a=temp1%10;
	 				b=temp2;
					DispChar(10,1,k+0x30);
					DispChar(11,1,a+0x30);
					DispString(12,1,". C");
					DispChar(13,1,b+0x30);
					delay(3);
				  }
			}
		}
		
		else
		{
		 	P2_4=0;
			P2_3=1;
			if(P2_3==0)			
				{
				delay(3);
				if(P2_3==0)
				  {	   DispChinese(0,1,"温度设定为:  C ");
				  for(a=0;a<400;a++)
				    	key();
				   }
				  }
				else
				{
				 DispChinese(0,1,"目前温度是");		
					for(a=0;a<1;a++)	
							 {
		 						ji();
								ReadTemperature();
		 						k=temp1/10;
								a=temp1%10;
	 							b=temp2;
								DispChar(10,1,k+0x30);
								DispChar(11,1,a+0x30);
								DispString(12,1,". C");
								DispChar(13,1,b+0x30);
								delay(3);
							 }
				}
			}
	}
}


 

⌨️ 快捷键说明

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