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

📄 text1.c

📁 用c语言编程完成温度检测与液晶显示显示功能。
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define outdat  P2

sbit DQ0=P1^0;   //定义变量DQ0与P1^0相同,即温度传感器数据总线DQ0与单片机P1.0连接
sbit DQ1=P1^1;

sbit cs2= P3^1;
sbit rw = P3^3;
sbit rs= P3^4;
sbit cs1= P3^2;
sbit e= P3^0;


/***********************************************************************************************/
/*                       字形码                                                                */
/***********************************************************************************************/
char code  wen[32]={0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00,
                    0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00};
char code  du[32]={0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,
                    0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00};
char code  zhuang[32]={0x04,0x02,0x01,0xFF,0x40,0x20,0x18,0x07,0x00,0x00,0x03,0x0C,0x30,0x60,0x20,0x00,
                    0x08,0x30,0x00,0xFF,0x20,0x20,0x20,0x20,0xFF,0x20,0xE1,0x26,0x2C,0x20,0x20,0x00};
char code  tai[32]={0x00,0x60,0x39,0x01,0x00,0x3C,0x40,0x42,0x4C,0x40,0x40,0x70,0x04,0x09,0x31,0x00,
                    0x00,0x04,0x04,0x04,0x84,0x44,0x34,0x4F,0x94,0x24,0x44,0x84,0x84,0x04,0x00,0x00};
char code  xu[32]={0x80,0x60,0x1F,0x00,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x03,0x01,0x00,
                    0x00,0x00,0xFC,0x04,0x04,0x14,0x14,0x35,0x56,0x94,0x54,0x34,0x14,0x04,0x04,0x00};
char code  hao[32]={0x00,0x00,0x00,0x02,0x07,0x02,0x02,0x22,0x42,0x82,0x42,0x3E,0x00,0x00,0x00,0x00,
                    0x40,0x40,0x40,0x5F,0xD1,0x51,0x51,0x51,0x51,0x51,0x51,0x5F,0x40,0x40,0x40,0x00};


char code  no[16]={0x00,0x7E,0x04,0x08,0x10,0x20,0x7E,0x00,0x00,0x7E,0x42,0x42,0x42,0x42,0x7E,0x00};
char code  on[16]={0x00,0x7E,0x42,0x42,0x42,0x42,0x7E,0x00,0x00,0x7E,0x04,0x08,0x10,0x20,0x7E,0x00};
char code  off[16]={0x00,0x7E,0x42,0x42,0x7E,0x00,0x7E,0x12,0x12,0x12,0x00,0x7E,0x12,0x12,0x12,0x00};


/*********************************************************************************/
/*                                十个数字                                       */
/*********************************************************************************/
char code  z[10][8]={0x00,0xFE,0x82,0x82,0x82,0xFE,0x00,0x00
                     ,0x00,0x00,0x44,0x7E,0x40,0x00,0x00,0x00
                     ,0x00,0xF2,0x92,0x92,0x92,0x9E,0x00,0x00
                     ,0x00,0x92,0x92,0x92,0x92,0xFE,0x00,0x00
                     ,0x00,0x30,0x28,0xA4,0xFE,0xA0,0x00,0x00
                     ,0x00,0x9E,0x92,0x92,0x92,0xF2,0x00,0x00
                     ,0x00,0xFE,0x92,0x92,0x92,0xF2,0x00,0x00
                     ,0x00,0x00,0x02,0x02,0xF2,0x1E,0x00,0x00
                     ,0x00,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00
                     ,0x00,0x9E,0x92,0x92,0x92,0xFE,0x00,0x00};


/****************************************************************/
/*                      LCD显示程序                             */
/****************************************************************/

void busy(uchar cs)	 
{
	outdat=0x00;    //释放总线,以读取状态字
	if(cs)	  //片2测忙
	{
	   rs=0;
	   rw=1;
	   cs1=0;
	   cs2=1;
	   e=1;
	   while((outdat&0x80)==0x80); //buzy=1时,再读,等待至busy=0
	   e=0;
	}
	else
	{		 //片1测忙
	   rs=0;
	   rw=1;
	   cs2=0;
	   cs1=1;
	   e=1;
	   while((outdat&0x80)==0x80);
	   e=0;
	}
}
void  com_w(uchar com,uchar cs)  //写指令

{
	 busy(cs);
         outdat=com;
         rw=0;
         e=1;
         e=0;
}
void   data_w(uchar dat, uchar cs)  //写数据
{
	 busy(cs);		
	 rs=1;
	 rw=0;
	 outdat=dat;
	 e=1;
	 e=0;
}

void lcd_init() 
	{
	unsigned int i,j;
	com_w(0x3e+1,0);//显示开关
	com_w(0xc0+0,0);//修改显示起始行
        //com_w(0xb8+0,0);//修改页地址
        //com_w(0x40+0,0);//修改列地址
	com_w(0x3e+1,1);
	com_w(0xc0+0,1);
	//com_w(0xb8+0,1);
	//com_w(0x40+0,1);

	 for(i=0;i<8;i++)     //lcd初始设置,所有点清零
          {
            com_w(0xb8+i,0);
            com_w(0x40+0,0);
	        for(j=0;j<64;j++)
                  data_w(0x00,0) ;
           }

          for(i=0;i<8;i++)
          {
            com_w(0xb8+i,1);
            com_w(0x40+0,1);
	        for(j=0;j<64;j++)
                  data_w(0x00,1) ;
           }
}

void hz16x16(uchar hang ,uchar lie,char hz[32])   //汉字显示程序
  {
    unsigned char i;
	if(lie<4)
		{
		com_w(0xb8+2*hang+1,0);            //汉字1hang为2页,即点16行
		com_w(0x40+16*lie,0);              //汉字1lie为点16列
		for(i=0;i<16;i++)
                data_w(hz[i],0) ;
                com_w(0xb8+2*hang,0);
		com_w(0x40+16*lie,0);
                for(i=16;i<32;i++)
                data_w(hz[i],0) ;
		}
	else
		{
		com_w(0xb8+2*hang+1,1);
		com_w(0x40+16*(lie-4),1);
                for(i=0;i<16;i++)
                data_w(hz[i],1) ;
 		com_w(0xb8+2*hang,1);
		com_w(0x40+16*(lie-4),1);
                for(i=16;i<32;i++)
                data_w(hz[i],1) ;
		}
  }


void sz8x8(uchar hang,uchar lie ,uchar zihu[8])      //数字显示程序
{
      int i;
      if(lie<8)
       {
       com_w(0xb8+hang,0);
       com_w(0x40+8*lie,0);
       for(i=0;i<8;i++)
       data_w(zihu[i],0) ;
       }
      else
       {
       com_w(0xb8+hang,1);
       com_w(0x40+8*(lie-8),1);
       for(i=0;i<8;i++)
       data_w(zihu[i],1) ;
       }
}

void zf8x16(uchar hang,uchar lie ,uchar zihu[16])      //字符显示程序
{
      int i;
      if(lie<4)
       {
       com_w(0xb8+hang,0);
       com_w(0x40+16*lie,0);
       for(i=0;i<16;i++)
       data_w(zihu[i],0) ;
       }
      else
       {
       com_w(0xb8+hang,1);
       com_w(0x40+16*(lie-4),1);
       for(i=0;i<16;i++)
       data_w(zihu[i],1) ;
       }
}

/*****************************************************************/
/*                         延时程序                             */
/*****************************************************************/
 void delay100m()
 {
   uchar i,j,k;
     for(i=0;i<8;i++)
      {
   for(j=0;j<25;j++)
          {
           for(k=0;k<250;k++);
          }
      }
 }

void delay15()                        //delay time is 15us
{
 uchar i;
 for(i=0;i<5;i++);
}

void delay60()                       //delay time is 60us
{
 uchar i;
   for(i=0;i<20;i++);
}

/*****************************************************************/
/*                       温度测量程序                            */
/*****************************************************************/

void reset(uchar dqhao)  //初始化
{
     uchar i;
  // DQ=1;
     if(dqhao)
     DQ1=1;
     else
     DQ0=1;
   // DQ=0;
     if(dqhao)
     DQ1=0;
     else
     DQ0=0;
   for(i=0;i<9;i++)
       {
       delay60();                   //----540us----
       }
   //DQ=1;
     if(dqhao)
     DQ1=1;
     else
     DQ0=1;
   delay15();
   delay15();                  //----delay 30us-----
  // while(DQ);
    if(dqhao)
	    {
         while(DQ1);		   //无DS18B20存在时,等待	
         for(i=0;i<8;i++)
             delay60();
         }
     else    
         {
         while(DQ0);
         for(i=0;i<8;i++)
          delay60();
         }
 //DQ=1;             //over
     if(dqhao)
     DQ1=1;
     else
     DQ0=1;
}

void bit_w(uchar b,uchar dqhao)       //write bit data to DQ
{
// DQ=1;
     if(dqhao)
     DQ1=1;
     else
     DQ0=1;

  // DQ=0;
     if(dqhao)
     DQ1=0;
     else
     DQ0=0;
     _nop_ ;
     _nop_ ;
	 _nop_ ;
     _nop_ ;
     _nop_ ;
 // DQ=b;
     if(dqhao)
     DQ1=b;
     else
     DQ0=b;
     delay60();        //delay 60us
  // DQ=1;                 //over
     if(dqhao)
     DQ1=1;
     else
     DQ0=1;
     _nop_ ;
}

void byte_w(uchar byte,uchar dqhao)            //write byte data to DQ
{
    uchar i;
	uchar b;
      for(i=0;i<8;i++)
        {
         b=byte&0x01;
         bit_w(b,dqhao);
         byte=byte>>1;
		}
}

bit bit_r(uchar dqhao)                //从DQ读一位数据
{
     bit b;
    // DQ =1;
     if(dqhao)
     DQ1=1;
     else
     DQ0=1;
    // DQ=0;
     if(dqhao)
     DQ1=0;
     else
     DQ0=0;
     _nop_;
     _nop_;
     _nop_;
    // DQ=1;
     if(dqhao)
     DQ1=1;
     else
     DQ0=1;
     _nop_;
     _nop_;
	// b=DQ;
     if(dqhao)
     b=DQ1;
     else
     b=DQ0;
     delay60();
     // DQ=1;                //over
     if(dqhao)
     DQ1=1;
     else
     DQ0=1;
     _nop_;
     return b;
}


uchar byte_r(uchar dqhao)                     //read byte data from DQ
{
    uchar i,j;
    bit  b;
    j=0;
  for(i=0;i<8;i++)
  {
       b=bit_r(dqhao);
     if(b)
	  {
       j+=1;
      }
     j=_cror_(j,1);   //sycle right shift a bit
   }
 return j;

}
uchar  gettemp(uchar dqhao)
{
     uchar temp1,temp2;
     reset(dqhao)	 ;
     byte_w(0xcc,dqhao) ;    //跳过ROM
     byte_w(0x44,dqhao) ;    //温度变换
     delay100m()  ;
     reset(dqhao);
     byte_w(0xcc,dqhao) ;
     byte_w(0xBE) ;          //读暂存器
     temp2=byte_r(dqhao);
     temp1=byte_r(dqhao);
     delay100m();
     temp1=temp1<<4;
     temp1+=(temp2&0xf0)>>4;

     return temp1;

}


/******************************************************************/
/*               文字显示、温度数据显示与发送程序                 */
/******************************************************************/

void wenzi()        //文字显示
 {
   hz16x16(0,0,xu) ;
   hz16x16(0,1,hao) ;
   hz16x16(0,3,wen) ;
   hz16x16(0,4,du) ;
   hz16x16(0,6,zhuang) ;
   hz16x16(0,7,tai) ;

  }
void send(uchar dat)    //串口发送子程序
{
  ES=0;
  SBUF=dat;
  while(!TI);
  TI=0;
  ES=1;
}
void wendu(uchar dqhao)   //温度数据显示与发送程序
{

    uchar bai,shi,ge,dq,wenduodata;
    dq=dqhao;
    wenduodata=gettemp(dqhao);
    bai=wenduodata/100;
    shi=wenduodata%100/10;
    ge=(wenduodata%100)%10  ;
      zf8x16(dq+2,0,no);
      sz8x8(dq+2,2,z[dq]);
      sz8x8(dq+2,6,z[bai]);
      sz8x8(dq+2,7,z[shi]);
      sz8x8(dq+2,8,z[ge]);
	  
      send(0x30+dq);   //数字加上0x30转为相应字符ASCII码
      send(0x20);
      send(0x30+bai);
      send(0x30+shi);
      send(0x30+ge);
      send(0x20);
	  

      if(wenduodata==0)
      zf8x16(dq+2,6,off);
      else
      zf8x16(dq+2,6,on);
}


/*****************************************************************/
/*                          main程序                             */
/*****************************************************************/
 main()
{
     TMOD=0x20;
     TH1=0xfd;
     TL1=0xfd;
     TR1=1;
     SM0=0;
     SM1=1;
     REN=1;
     EA=1;
     ES=1;
	 
     lcd_init();

    // wenzi();
	 com_w(0xb8+0,1);//修改页地址
     com_w(0x40+0,1);//修改列地址

	 data_w(0x01,1);

    while(1)
    {
     wendu(0);
     wendu(1);
    }
}





⌨️ 快捷键说明

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