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

📄 receive.c

📁 温度遥测系统程序,半双工的,已经调试成功了
💻 C
字号:
#include   <reg51.h>
#include   <intrins.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define lcd_bus P1
#define key_bus P0
sbit rt=P2^4;
sbit enable=P2^7;
sbit beep=P2^5;
// lcd
sbit rs=P2^0;
sbit rw=P2^1;
sbit e =P2^2;
uchar offset=0x80;
uchar   inte; //整数部分
uchar   dec;   //小数部分
uint   detemp;                    //年月摄氏度 
uchar state=0; 
uchar  TLL;
uchar  THH;  
uchar code hanzi[]={0x80,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,  
                    0xf,0x9,0xf,0x9,0xf,0x9,0x11,0,  
                   0x1C,0x14,0x1C,0x0,0x0,0x0,0x00,0x00,
           0x06,0x08,0x10,0x10,0x10,0x08,0x06,0x00};  
 uchar code str1[]="temperature  is:";
 uchar code str2[]="welcome";
 uchar code str3[]="1:temperature";
 uchar code str4[]="2:INPUT TL";
 uchar code str5[]="3:INPUT TH";
 uchar code str6[]="4:send";
 uchar code str7[]="sending";
 uchar  code key_table[16]={15,0,14,13,7,8,9,12,4,5,6,11,1,2,3,10};
 /*****************读按键***************/
uchar getkey()
{
    uchar keycode=0xff,temp,i;
    key_bus=0x0f;
    temp=key_bus&0x0f; 
    if(temp!=0x0f)              //有键按下
    {
        key_bus=0x7f;
        for(i=0;i<4;i++)
    	{
            temp=key_bus&0x0f;
            if(temp==0x07)
            {    
                keycode=i*4;
            	break;
    		}
            else if(temp==0x0b)
    		{
                keycode=i*4+1;
            	break;
    		}
            else if(temp==0x0d)
    		{
                keycode=i*4+2;
            	break;
    		}
            else if(temp==0x0e)
    		{
                keycode=i*4+3;
            	break;
    		}
            key_bus=(key_bus>>1)|0x80;
    	}

         while((key_bus&0x0f)!=0x0f)   //等待释放
    	 {
             key_bus=0x0f; 
    	 }
                            	                
     }
     return key_table[keycode];
}       


//////////////////////////////////////////
delay(uchar d)
{
        while(--d);
}


/**********判断忙标志,返回的是一个位BF**********/
bit lcd_busy(void)
{
        uchar bflag;     
        rs=0;
        rw=1;
        _nop_();
        e=1;
        _nop_();
        lcd_bus=0xff;
        bflag=lcd_bus;
        e=0;
        return(bit)(bflag&0x80);    //BF=1 busy   
}



/*********写命令,有两个参数,第一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1:判断;为 0:不判断****************/
void lcd_wrcmd(uchar cmd)
{
        while(lcd_busy());
        lcd_bus=cmd;
        rs=0;
        rw=0;
        _nop_();
        e=1;
        _nop_();
        _nop_();
        e=0; 
}


/************向液晶片写数据***************/
void lcd_wrdata( uchar lcddata)
{
        while(lcd_busy());
        lcd_bus=lcddata;
        rs=1;
        rw=0;
        _nop_();
        e=1;
        _nop_();
        _nop_();
        e=0;
}

/****************初始化***************/
void lcd_ini(void)
{
        lcd_wrcmd(0x38); 
        delay(100);
        lcd_wrcmd(0x0c);
        delay(100);
        lcd_wrcmd(0x06);
        delay(100);
        lcd_wrcmd(0x01);
        delay(100);
}

//////////////////////////////////////////////
//
//    生成汉字子模函数
//    当lcd_wrdata(0);显示第一个汉字
//    当lcd_wrdata(1);显示第二个汉字
//
//////////////////////////////////////////////
lcd_h()
{
    uchar i;
    lcd_wrcmd(0x40);
    for(i=0;i<32;i++) lcd_wrdata(hanzi[i]);
}


receivedata()  interrupt 4  //接收中断
{  uchar temp;     
  static bit flag_inte=0,flag_dec=0; //整数部分和小数部分的标志
   temp=SBUF;
	  if(flag_dec==1)
     {
	  dec=temp;              //接收小数部分
      flag_dec=0;           //  清除小数标志
     }
     if(flag_inte==1)
     {inte=temp;              //接收整数部分
      flag_inte=0;           //  清除整数标志
     }
     
   if(temp==0xfe) flag_dec=1;   //表示下面发送的是小数部分
   if(temp==0xff) flag_inte=1;  //表示下面发送的是整数部分
   


      RI=0;                  //清除中断标志
}

senddata(unsigned char dat)     //串口发送数据
{SBUF=dat;
 while(TI==0);
 TI=0;
}

serial_init()             //串口初始化
{


 SCON=0X50;         /* SCON: 串口方式1, 8位异步通信,接收使能*/ 
 TMOD=0x20;        /*波特率发生需用定时器1:TMOD: 定时器1, 8位自动重装 */ 
 PCON= 0x80;   //双倍时钟
 TH1=0xfd;         /* TH1:自动重装值,19200baud ,晶振11.0592MHz */ 
 TL1=0xfd; 
 TR1=1;           /* TR1:启动定时器1 */ 
 ES=1;
 EA=1;
}



void  tempdisplay(void)
{   
   uchar i,r=0,j,iii;
   uchar stra[3];
   uchar  xiaoshu[4];
   lcd_wrcmd(0x0f);
          lcd_wrcmd(0x81);
       for(j=0;j<16;j++)lcd_wrdata(str1[j]);
	  while(1)
      
       { if(inte<TLL||inte>=THH)
          beep=1;
		  else beep=0;
         detemp=dec*625;
         xiaoshu[0]=detemp/1000+'0';
         xiaoshu[1]=detemp%1000/100+'0';
         xiaoshu[2]=detemp%100/10+'0';
         xiaoshu[3]=detemp%10+'0';

        stra[0]=inte/100+'0';
        stra[1]=inte%100/10+'0';
       stra[2]=inte%10+'0';
       if(stra[0]=='0')
          r=1;
       lcd_wrcmd(0xc2+r);
       for(i=r;i<3;i++)
       lcd_wrdata(stra[i]);
        lcd_wrdata('.');
        for(i=0;i<4;i++)
        lcd_wrdata(xiaoshu[i]);
		delay(100);
	   lcd_wrdata(2);
       lcd_wrdata(0x43);
         for(i=0;i<4;i++)
       lcd_wrdata(' ');
	   iii=getkey();
	     if(iii==1)
		 enable=!enable;
	     if(iii==13)
          {
                 state=1;
                 lcd_wrcmd(0x0c);
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x80);
                 break;
           }
	  }

 }

welcome()
{
       
       uchar temp=0x12,w;
       lcd_wrcmd(0x0c);
       lcd_wrcmd(0x82); 
          
       for(w=0;w<strlen(str2);w++)
            lcd_wrdata(str2[w]);
       lcd_h();
       lcd_wrcmd(0xc4);
       lcd_wrdata('2'); lcd_wrdata('0');lcd_wrdata('0');lcd_wrdata('7');
       lcd_wrdata(0);
       lcd_wrdata('0');lcd_wrdata('8');
       lcd_wrdata(1);
       while(1)
       {                                                           
           temp=getkey();
           if(temp>=0&&temp<=15)    //按任意键跳转
           {
               state=1;  
               lcd_wrcmd(1);
               break;
           }
       }
}

menu()
{
     uchar i,ii,cnt=1;

     lcd_wrcmd(0x83);
     for(i=0;i<strlen(str3);i++)
         lcd_wrdata(str3[i]);
     lcd_wrcmd(0xc3);
     i=0;
     while(str4[i]!='\0')
     {
        lcd_wrdata(str4[i]);
        i++;
     }
     lcd_wrcmd(0x80);
     lcd_wrdata('-');
     lcd_wrdata('>');
    while(1)
     {
         ii=getkey();
		  ///////////////////////////翻屏///////////////////////////////
         if(ii==15)        
         {   cnt++;
		     if(cnt==5) cnt=1;
             if(cnt==1)
             {  //////////////////////
                 // ->  1: tempeture   
                   
                 //    2: INPUT  TL 
                 /////////////////////
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x83);           //tempeture 
                 for(i=0;i<strlen(str3);i++)
                     lcd_wrdata(str3[i]);        
                 lcd_wrcmd(0xc3);
                 for(i=0;i<strlen(str4);i++)
                     lcd_wrdata(str4[i]);   //INPUT  TL            
                 lcd_wrcmd(0x80);
                 lcd_wrdata('-');
                 lcd_wrdata('>'); 
             }
			 if(cnt==2)
             {  //////////////////////
                 //   1: tempeture   
                   
                 // -> 2: INPUT  TL 
                 /////////////////////
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x83);           //tempeture 
                 for(i=0;i<strlen(str3);i++)
                     lcd_wrdata(str3[i]);        
                 lcd_wrcmd(0xc3);
                 for(i=0;i<strlen(str4);i++)
                     lcd_wrdata(str4[i]);   //INPUT  TL            
                 lcd_wrcmd(0xc0);
                 lcd_wrdata('-');
                 lcd_wrdata('>'); 
             }
             if(cnt==3)
             {  //////////////////////
                 //     2: INPUT  TL   
                   
                 //  ->    3: INPUT  TH 
                 /////////////////////
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x83);           //INPUT  TL 
                 for(i=0;i<strlen(str4);i++)
                     lcd_wrdata(str4[i]);        
                 lcd_wrcmd(0xc3);
                 for(i=0;i<strlen(str5);i++)
                     lcd_wrdata(str5[i]);   //INPUT  TH            
                 lcd_wrcmd(0xc0);
                 lcd_wrdata('-');
                 lcd_wrdata('>'); 
               }
			   if(cnt==4)
             {  //////////////////////
                 //      3: INPUT  TH   
                   
                 //  ->  4:send 
                 /////////////////////
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x83);           //INPUT  TL 
                 for(i=0;i<strlen(str5);i++)
                     lcd_wrdata(str5[i]);        
                 lcd_wrcmd(0xc3);
                 for(i=0;i<strlen(str6);i++)
                     lcd_wrdata(str6[i]);   //INPUT  TH            
                 lcd_wrcmd(0xc0);
                 lcd_wrdata('-');
                 lcd_wrdata('>'); 
               }
			}

		 ////////////////////////////////////////////////////////////////
         else if(ii==14)		  //进入接收端各子菜单
         {
             if(cnt==1)			   //显示温度
             {
                 state=2;
                 lcd_wrcmd(1);
                 break;
              }
              else if(cnt==2)	   //输入接收端的下限温度值
              {
                  state=3;
                  lcd_wrcmd(1);
                  break;
              }
              else if(cnt==3)	   //输入接收端上限温度报警值
              {
                  state=4;
                  lcd_wrcmd(1);
                  break;
              }
			   else if(cnt==4)	   //输入接收端上限温度报警值
              {
                  state=5;
                  lcd_wrcmd(1);
                  break;
              }                    

		  }
		


      
   }


}

/********输入温度的下限值***************/
input_tl()
{  
    uchar i,j,n,cnt=0;
    uchar  TL[3];
    for(i=0;i<3;i++)   
      TL[i]=0;
    lcd_wrcmd(0x80);
    lcd_wrdata('T');
    lcd_wrdata('L');
    lcd_wrdata('=');
    while(1)
    {i=getkey();
           if(i<10)
           {        cnt++;
                 if(cnt<=3)
                 {   TL[cnt-1]=i;
                     lcd_wrcmd(0x83+cnt-1);
                     lcd_wrdata(0x30+i);
                     
                 }                   
                 else{
                     cnt=0;                                      
                     lcd_wrcmd(0x83);
                     for(j=0;j<=3;j++)
                         lcd_wrdata(' ');  
                          lcd_wrcmd(0x83);

                     }
           }

          else if(i==12)
            {
                 state=1;
                 lcd_wrcmd(0x0c);
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x80);
                 n=strlen(TL);
                 if(TL[2]>=0&&TL[2]<=9)
                 TLL=TL[0]*100+TL[1]*10+TL[2];
                
                 break;
            }

             
                 
       
  }
}


/****************输入温度的上限值***************/
input_th()
{  
    uchar i,j,n,cnt=0;
    uchar  TH[3];
    for(i=0;i<3;i++)   
     TH[i]=0;
    lcd_wrcmd(0x80);
    lcd_wrdata('T');
    lcd_wrdata('H');
    lcd_wrdata('=');
    while(1)
    {i=getkey();
           if(i<10)
           {        cnt++;
                 if(cnt<=3)
                 {   TH[cnt-1]=i;
                     lcd_wrcmd(0x83+cnt-1);
                     lcd_wrdata(0x30+i);
                     
                 }                   
                 else{
                     cnt=0;                                      
                     lcd_wrcmd(0x83);
                     for(j=0;j<=3;j++)
                         lcd_wrdata(' ');  
                          lcd_wrcmd(0x83);

                     }
           }

          else if(i==12)
            {
                 state=1;
                 lcd_wrcmd(0x0c);
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x80);
                 n=strlen(TH);
                 if(TH[2]>=0&&TH[2]<=9)
                 THH=TH[0]*100+TH[1]*10+TH[2];
                 break;
            }

             
     }
}
send_tlth()		   //发送上下限值

 { uchar i;
   uchar w;
  lcd_wrcmd(0x0c);
       lcd_wrcmd(0x82); 
          
       for(w=0;w<strlen(str7);w++)
            lcd_wrdata(str7[w]);
    while(1)
	{
	 i=getkey();
	senddata(0xfd);
	senddata(THH);
	senddata(0xfc);
	senddata(TLL);
	delay(110);
	if(i==13)
          {
                 state=1;
                 lcd_wrcmd(0x0c);
                 lcd_wrcmd(1);
                 lcd_wrcmd(0x80);
                 break;
           }
	}

 }


void main()                                                                               
{
     lcd_bus=0xff;
      lcd_ini();
      serial_init();
      lcd_h();
	  enable=0;
	   rt=1;
      while(1)
      {
	     if(state==0) welcome();
		    
		 else if(state==1) 
		 {EA=1;
		  ES=1;
		  menu();
		 }

		 else if(state==2) tempdisplay();

		 else if(state==3)  input_tl();

		 else if(state==4)  input_th();

		  else if(state==5)	 
		  {EA=0;
		   ES=0;
		  send_tlth();
		  }


       }


 }

⌨️ 快捷键说明

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