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

📄 morepoint_telephone.c

📁 此为一个单片机多机通信的程序 有两个从机一个主机 从机1负责采集温度并上传给主机 从机2控制电机转动
💻 C
字号:
 #include "reg52.h"
 #include "absacc.h"
  
  #define uchar unsigned char
  #define display_single XBYTE[0x0000]
  #define display_point XBYTE[0x0100]
  
  sbit key_1=P1^0;
  sbit key_2=P1^1;
  sbit key_3=P1^2;
  sbit key_4=P1^3;

  uchar code single[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xf0,0xc6};
  uchar code single_point[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};
  uchar machine_text=0,machine_run=0,led_0=0,led_1=0,led_2=0,led_3=0,led_display=0;
  uchar tem_buff[2];


 void _nop()
   {int i;
     i=0;
	}


 void display(void)
   { 
     
	   display_single=single[led_0];
	   display_point=single_point[0];
	   _nop();
	   _nop();
       display_point=0xff;

       display_single=single[led_1];
	   display_point=single_point[1];
	   _nop();
	   _nop();
       display_point=0xff;
       
       display_single=single[led_2];
	   display_point=single_point[2];
	   _nop();
	   _nop();
       display_point=0xff;
       
       display_single=single[led_3];
	   display_point=single_point[3];
	   _nop();
	   _nop();
       display_point=0xff;
      
       display_single=single[0];
	   display_point=single_point[8];
	   _nop();
	   _nop();
       display_point=0xff;

       display_single=single[0];
	   display_point=single_point[8];
	   _nop();
	   _nop();
       display_point=0xff;
       
       display_single=single[0];
	   display_point=single_point[8];
	   _nop();
	   _nop();
       display_point=0xff;
       
       display_single=single[machine_text];
	   display_point=single_point[7];
	   _nop();
	   _nop();
       display_point=0xff;


   }  



    void time_again(int t)
 { 
   int i;
   while(t--)
     for(i=0;i<10;i++)
	        display();
}
  

  

   	void time_delay(int t)
 { 
   int i;
   while(t--)
     for(i=0;i<10;i++)
	        {
			   if((P1&0x0f)!=0x0f)
			        break;
                 display();
             }

 }
    
 void reset(void)
 {
    TB8=0;
    SBUF=0xff;
    while(TI!=1);TI=0;
 }
/***********************************************\
|发送地址子程序                                  |
|                                                |
\***********************************************/
 void setmessage(uchar address)
  {
    TB8=1;
    SBUF=address;
    while(TI!=1);TI=0;
    while(RI!=1);RI=0;
    if(SBUF!=address){reset();machine_text=0;machine_run=0;}
    else
       machine_text=address;
   }
 
/***********************************************\
|发送命令子程序                                  |
|                                                |
\***********************************************/
  void set_command(uchar commd)
  {
    TB8=0;
    SBUF=0x00;
    while(TI!=1);TI=0;
    while(RI!=1);RI=0;                //是否忙
    if((SBUF&0x01)!=0x01)
       {reset();
	    machine_run=0;
        machine_text=0;}  
      else  
        { TB8=0;
          SBUF=commd; 
		 while(TI!=1);TI=0;
          machine_run=commd;  } 
   } 
    

 void key_function(void)
   {
    
	if((P1&0x0f)!=0x0f)
    	{ 
	     time_again(20);
	       if(key_1==0)
           {
              if(machine_text==0)
		            setmessage(0x01);
                else 
			         {switch(machine_text)
 			           { case 1:
				           set_command(0x01);
						   if(machine_run==0x01)
						     {led_0=10;led_1=10;led_2=10;led_3=10;}
							   break; 
                        case 2: 
						   set_command(0x01);
                            if(machine_run==0x01)
							{
						       while(RI!=1);RI=0;
                                  tem_buff[0]=SBUF;
						       while(RI!=1);RI=0;
                                  tem_buff[1]=SBUF;
						        led_display=1;
                             }
							     break; 
					 	 default:
						    break;
						 }
                       }

			}
	       if(key_2==0)
	       {
		      if(machine_text==0)
		             setmessage(0x02);
                 else if(machine_text==1) 
				        { 
						    set_command(0x02); 
							if(machine_run==0x02){
						    led_0=11;led_1=11;led_2=11;led_3=11;  
							}
						 }
				  else if(machine_text==2) 
				        { 
						    set_command(0x02); 
							if(machine_run==0x02)
							{
						       while(RI!=1);RI=0;
                                  led_0=SBUF;
						       while(RI!=1);RI=0;
                                  led_1=SBUF;
                                while(RI!=1);RI=0;
                                  led_2=SBUF;
						       while(RI!=1);RI=0;
                                  led_3=SBUF;
						       
                             }
						}
			  }
	       if(key_3==0)
            {
               if(machine_text==0)
		             setmessage(3);
                  else {set_command(0x03);  
				        if(machine_run==0x03)
						 {led_0=0;led_1=0;led_2=0;led_3=0;   }
                     }
	        }
           if(key_4==0)
                 {
                   reset();
			       led_0=0;led_1=0;led_2=0;led_3=0; 
                   machine_text=0;
				   machine_run=0;
                  }
	     
          }

   while((P1&0x0f)!=0x0f)display();
     }

  void tmpchangebcd(void)
   { float a;
      uchar c,d,f,e;
     if(led_display==1)
     {
	  uchar temp2,temp1;
	  temp1=tem_buff[0];
	  temp2=tem_buff[1];
      c=temp2&0xf8;
      if(c)
      {temp1=~temp1+1;  
       temp2=~temp2;}
      d=temp1&0x0f;
      f=temp1>>4;
      e=temp2&0x07;
      e<<=4;
      f|=e;
      a=d*0.0625;
      led_0=(uchar)(a*10);
  	  led_1=f%10;
	  led_2=f%100/10;
	  led_3=f/100;
	 }
	led_display=0;
   }



  void main(void)
 {
  TMOD=0x20;
  TL1=0xfa;
  TH1=0xfa;
  PCON=0x00;
  TR1=1;
  SCON=0xd0;
  machine_text=0;
  machine_run=0;
  while(1)
   {
      key_function();
      time_delay(10);
      tmpchangebcd();
    }
  }
      

⌨️ 快捷键说明

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