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

📄 yy.c

📁 应用51平台实现热电偶测温
💻 C
字号:
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
#include <string.h> 
#include <math.h>
sbit RS=P1^2;
sbit RW=P1^3;
sbit E=P1^4;
sbit buz=P2^7;
unsigned char XPos;
unsigned char YPos;
#define dataport P0   //LCD数据端口

#define busy 0x80      //D7忙标志
#define nop() _nop_()
#define uchar unsigned char
unsigned int q1,q2,q3,q4,q5;q6;
char m[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};   
char code H[]={"H:"};
char code L[]={"L:"};
char code D[]={"C:"};
char code W[]={"T:"};
unsigned char b0=0x31,b1=0x30,b2=0x30,b3=0x30,b4=0x30,b5=0x30;    //b0--通道数,b1,b2,b3,b4,b5--上限温度值
unsigned char d0=0x30,d1=0x30,d2=0x30,d3=0x30,d4=0x30;            //d0,d1,b2,b3,b4--上限温度值
unsigned char Rkey=0,p=1; 

float CH1=0,CH2=0,CH3=0,CH4=0, CH5=0,CH6=0,	CH7=0,CH8=0;
float CL1=0,CL2=0,CL3=0,CL4=0, CL5=0,CL6=0,	CL7=0,CL8=0;

unsigned char Key();  
 

//////////////////////////////////////////////////////延时
void delay5Ms(void)
  {
    unsigned int i=5552;
	while(i--);
  }

 void delay(unsigned int y)
  { 
	while(y--);
  }

void delayP(unsigned int k)
 {
   while(k--)
    {
   Rkey=Key();
   if((Rkey==2)||(Rkey==1)||(Rkey==4))
   break;
	 }
  }
//*********************************************************
//读忙状态函数
//功能:先检测忙状态,D7=1,LCD忙
void checkbusy(void)
       {
	     dataport = 0xff; //P0口写1
		 RS=0;             //选择指令寄存器
		 RW=1;             //读模式
		 nop();
		 E=1;
		 nop();
	     nop();
		 while(dataport & busy);
         nop();
		 E=0;
		}

//写入IR寄存器命令函数
//功能:向LCD写入命令字符CMD
//若ac==1,检测忙信号
void writeIR( char CMD,char mang)
     { 
	   if(mang)
	   checkbusy();
	   RS=0;               //选择指令寄存器
	   RW=0;              //选择写模式	 
       nop();
	   dataport=CMD;       //将命令送数据端口
       nop();
	   E=1;                //使能LCD
	   nop();              //将D0-D7数据送入IR
	   nop();
	   E=0;                //禁止LCD
	  }

//写入DDR显示数据寄存器函数
//功能:在当前光标显示字符
void writeDDR(char c)     //void writeDDR(char c)
             {
			   checkbusy();
			   RS=1;        //选择数据寄存器
			   RW=0;
               nop();
			   dataport=c;   //将显示字符送给数据端口
			   nop();
			   E=1;          //写使能
			   nop();
	           nop();
			   E=0;
			  }

//LCD初始化
//功能:向LCD写不同的命令,
void LCDreset()
         {
		   writeIR(0x38,0); //writeIR(0x38,0);   //功能设置命令,8位接口,显示两行,
           delay5Ms();
		   writeIR(0x38,0); //writeIR(0x38,0);   //功能设置命令,8位接口,显示两行,
		   delay5Ms();
		   writeIR(0x38,0); //writeIR(0x38,0);   //功能设置命令,8位接口,显示两行,
		   delay5Ms();

		   writeIR(0x38,0);
           writeIR(0x38,1); //writeIR(0x38,1);     
           writeIR(0x08,1);//显示开关控制
		   writeIR(0x01,1);//清屏
		   writeIR(0x06,1);//输入方式设置,完成一个字符发送后。地址指针AC加1
		   writeIR(0x0c,1); //显示光标,
         }
 
//光标定位函数
void LCDPos(uchar XPos, uchar YPos)
   {
     uchar tmp;
	 XPos&=0x0f;
	 YPos&=0x01;
	 tmp=XPos;
	 if(YPos==1)
	 tmp+=0xc0;
	 else 
	 tmp+=0x80;
	 writeIR(tmp,0);
	}

//在指定的行列显示字符函数
void writechar( uchar XPos, uchar YPos,char c)
     {
	   LCDPos(XPos,YPos);
	   writeDDR(c);
	  }

//显示字符串函数
void  writestring(uchar XPos, uchar YPos, char s[])
              {
				    uchar p=0;
					while(p<2)
					{
					  writechar(XPos,YPos,s[p]);
					  p++;
					  XPos++;        
					 }
                }

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



void write(void) 
       {  
	       writechar(2,0,b1);         //上限温度值
           writechar(3,0,b2);
           writechar(4,0,b3);
		   writechar(5,0,b4);
           writechar(6,0,0x2e);
           writechar(7,0,b5);
		   writechar(10,0,d0);          //下限温度 
           writechar(11,0,d1);                
           writechar(12,0,d2);
           writechar(13,0,d3);
           writechar(14,0,0x2e);
		   writechar(15,0,d4);
           writechar(3,1,b0);         //通道数
	   }

//*******按键跳转程序*****
unsigned char Key()        
 {
   unsigned char key,i=0;
   key=P2;
   key=key&0x0f;          //读键值
    if(key!=0x0f)         //有键按下?进入键值判断
   {
      while(1)
    {
	 delay(10000);		   //延时
     key=P2;
	 key=key&0x0f;
     switch(key)
	  {
	    
	   case 0x0e:  while(1)			  //有键按下?
	              {   
	               key=P2;
	               key=key&0x0f;
				   if(key==0x0f)	////没有键按下就跳出
				   break;
			       }
	               i=1;break;    //加    P2.0口底电平
	   case 0x0b: while(1) 
	            {  key=P2;
	               key=key&0x0f;
				   if(key==0x0f)
                   break;
				 }
	               i=2;break;    //移	  P2.2口底电平
	   case 0x07:  while(1) 
	           {   key=P2;
	               key=key&0x0f;
				   if(key==0x0f)
                   break;
			    }
	               i=3;break;    //设定   P2.3口底电平
	   case 0x0d:  while(1) 
	           {   key=P2;
	               key=key&0x0f;
				   if(key==0x0f)
                   break;
			   }
	              i=4;break;    //确认/停止		  P2.1口底电平
	   default: i=0;break;
	   }
	   if(key==0x0f)
	   break;
    }
  }
	 return i;
 }

//所需跳转的位置数目共11位
void Rey(void)
 {
  if(Rkey==2)
    {
  p++;                       //p位置
  if(p==12)
  p=1;
	}
 }



//读按键按的次数
void ReadKey(void)
 {   
	  while(1)
      {
         Rkey=Key();   //读键值    ‘确定设定键按下	  
	     if(Rkey==3)
	     break;
          }
		 
	  while(1)
	  {	 
		  switch(p)		//移动到所在位置
          {         
	         case 1: while(1)
		          {    
				   write();      
				   delayP(8000);
				   if((Rkey==2)||(Rkey==4))
				   break;   				  
				   while(Rkey==1)
				  {
				   b0++;            //通道数
				   if(b0==0x39)
				   b0=0x31; 
				   break;  
				     }         
				  writechar(3,1,' '); 
                   delayP(8000);          
                   if((Rkey==2)||(Rkey==4))	  //有移位或确定键按下跳出本次循环
				    break;   				  
				   while(Rkey==1)
				  {
				   b0++;            //通道数
				   if(b0==0x39)
				   b0=0x31;
				   break;
				   }				   
                }
				  if(Rkey==2)
				  Rey();
				  break;


            case 2: while(1)
		          {
		            write();      
				   delayP(8000);
               if((Rkey==2)||(Rkey==4))
				    break; 
				while(Rkey==1)
				  {
				   b1++;            //上限千位
				   if(b1==0x32)
				   b1=0x30;
				   break;
				   }    
			   writechar(2,0,' ');    //上限温度值 
                   delayP(8000);
                   if((Rkey==2)||(Rkey==4))
				    break;   				  
				   while(Rkey==1)
				  {
				   b1++;            //通道数
				   if(b1==0x32)
				   b1=0x30;
				   break;
				   }
                   	   
                }
				  if(Rkey==2)
				  Rey();
                  break;

	        case 3: 
		           while(1)
		         {
		           write();      
				   delayP(8000);            
                   if((Rkey==2)||(Rkey==4))
				    break;	  
				  while(Rkey==1)
				     {
				   b2++;            //通道数
				   if(b2==0x3A)
				   b2=0x30;
				   break; 				   
				      }				   		      
				  writechar(3,0,' ');    //上限温度值
                   delayP(8000);          
                    if((Rkey==2)||(Rkey==4))
				    break; 		  				  
		          while(Rkey==1)
				   {
				   b2++;            //通道数
				   if(b2==0x3A)
				   b2=0x30;
				   break; 		   
		           }  
                 }
				  if(Rkey==2)
				  Rey();
                  break;
	      case 4:
		            while(1)
		        {
		            write();      
				   delayP(8000);           
                  if((Rkey==2)||(Rkey==4))
				    break; 
	         	   while(Rkey==1)
				     {
				    b3++;            //通道数
				    if(b3==0x3A)
				    b3=0x30;
				    break; 				   
				  	  }	    
				  writechar(4,0,' ');    //上限温度值
                   delayP(8000);    
                 if((Rkey==2)||(Rkey==4))
				    break;   				  
		  	     while(Rkey==1)
				    {
				    b3++;            //通道数
				    if(b3==0x3A)
				    b3=0x30;
				    break; 
				  	 }				   
                }
				  if(Rkey==2)
				  Rey();
                  break;
		  case 5:
		            while(1)
		       {
				    write();      
				   delayP(8000);           
                   if((Rkey==2)||(Rkey==4))
				    break;  
				  while(Rkey==1)
				    {
				    b4++;            
				    if(b4==0x3A)
				    b4=0x30;
				    break; 
				    }	    
				  writechar(5,0,' ');    //上限温度值
                   delayP(8000);        
                   if((Rkey==2)||(Rkey==4))
				    break;   				  
				   while(Rkey==1)
				    {
				    b4++;            
				    if(b4==0x3A)
				    b4=0x30;
				    break; 				   
				  	 }
                }
				  if(Rkey==2)
				  Rey();
                  break;

	   case 6:	 while(1)
		          {
		            write();      
				   delayP(8000);           
                   if((Rkey==2)||(Rkey==4))
				    break; 
				   while(Rkey==1)
				     {
				     b5++;            //通道数
				    if(b5==0x3A)
				    b5=0x30;
				    break; 		   
				  	  }	     
				 writechar(7,0,' ');    //上限温度

⌨️ 快捷键说明

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