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

📄 0zhu0011.c

📁 485通讯的上位机程序
💻 C
字号:
#include<AT89X51.H>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define BN 16
uchar code table1[16]=
{0x4b,0x58,0x2d,0x37,0x35,0x30,0x32,0x4a,0x20,0x4d,0x6f,0x64,0x75,0x20,0x20,0x20};
uchar code table[4][16]={
{0x20,0x48,0x65,0x61,0x74,0x69,0x6e,0x67,0x20,0x20,0x20,0x20,0x20,0x41,0x20,0x20},
{0x20,0x20,0x42,0x69,0x61,0x73,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x41,0x20},
{0x20,0x20,0x54,0x65,0x6d,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xdf,0x43,0x20},
{0x20,0x20,0x50,0x6f,0x77,0x65,0x72,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x57,0x20}};
uchar code table2[16]=
{0x20,0x20,0x20,0x4e,0x4f,0x20,0x20,0x4d,0x6f,0x64,0x75,0x6c,0x65,0x20,0x20,0x20};
uchar code table3[16]=
{0x20,0x20,0x20,0x4f,0x76,0x65,0x72,0x20,0x20,0x54,0x69,0x6d,0x65,0x20,0x20,0x20};
uchar code table4[16]=
{0x20,0x20,0x50,0x72,0x65,0x73,0x73,0x20,0x4b,0x65,0x79,0x2e,0x2e,0x2e,0x20,0x20};
sbit ACC_0       = 0xE0;
sbit ACC_1       = 0xE1;
sbit ACC_2       = 0xE2;
sbit ACC_3       = 0xE3;
sbit ACC_4       = 0xE4;
sbit ACC_5       = 0xE5;
sbit ACC_6       = 0xE6;
sbit ACC_7       = 0xE7;
uchar (*pb)[16]=table;
uchar idata rbuf[16];
uchar data count=0,cancel_tag=0 ;
uchar bdata a=0x01;
uchar data b=1;
uchar data c=0;
uchar data y=0;
uchar data addr0;
sbit bflag=ACC^7;

//延时10ms子函数
void delay(void){
 uchar i,j;
 for(i=0;i<100;i++)
    for(j=0;j<100;j++)
	    ; 
                 }


//出错处理子函数
void err(void){
P3_7=1; SBUF=0xff;
while(!TI);TI=0;
              }

//超时控制中断服务子函数
void timer0_int() interrupt 1 using  1
{ count++;
  if(count<60)
  {TH0=0x4C;
   TL0=0x1A;
   return;
   }
   cancel_tag=1;
}



//485数据通信子函数
void master(uchar addr,uchar comand)   {
 uchar aa,i;
 char p;
 P3_7=1; TB8=1;
 SBUF=addr;		           //发从机地址(1)
 while(!TI);TI=0;
 P3_7=0;TR0=1;
 while(!RI)  {
 if(cancel_tag==1)
 {
  TR0=0;
  count=0;
  TH0=0x4C;
  TL0=0x1A;
  cancel_tag=0;
  c=1;
  return;
 }
                }
   RI=0;
  TR0=0;
  count=0;
  TH0=0x4C;
  TL0=0x1A;
  if(SBUF!=addr) err();	  //接收比较地址(2)
  else{ TB8=0;
        P3_7=1;
        SBUF=comand;	  //发送命令0x02 (3)
        while(TI!=1);TI=0;
        P3_7=0;
        while(RI!=1);RI=0;  
        aa=SBUF;
        if((aa&0x80)==0x80){TB8=1;err();} //如果命令未被接收发送复位信号(fu)
        else{ if((aa&0x01)==0x01)  {	   // 接收0x01 (5)
        while(1) {SM2=0;p=0;
                  P3_7=0;
                  for(i=0;i<BN;i++)	       //接收数据及校验和(6)
                    { while(RI!=1);RI=0;
                      rbuf[i]=SBUF;
                      p+=rbuf[i];  
                    }
                      while(RI==0);RI=0;
                      if(SBUF==p){
                        P3_7=1;SBUF=0x00;  //接收正确发送0x00 (7)
                        while(TI==0);TI=0;
                        break;   }
                      else{P3_7=1;SBUF=0xff;
                           while(TI==0);TI=0;
                           }
                   }
                  TB8=1; return;          } 

				  }
                                             }
											   }



//某一模块显示子函数(1~8)
void lcd3(void){
 P1=0x8e;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;

 P1=b+0x30;
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
        }

//显示器第二行固定部分和数据部分的显示"No Module"
 void lcd4(void){
 uint i;
 uchar code *p=table2;
 P1=0xc0;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
 for(i=0;i<16;i++){
 P1=*p;
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
 p++;}
 }



//第二行显示“Press Key ...”
void lcd6(void){
 uchar k;
 uchar code *p=table4;
 P1=0xc0;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;

 for(k=0;k<16;k++){
 P1=*p;
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
  p++;}
}



 //通讯函数
 void toxin (void)                 {

   P3_3=1;
 if(P3_3==0) delay();
 if(P3_3==0)          {
  delay();
  delay();
  P3_3=1;
 while(P3_3==0);
 lcd3();				     //某一模块显示(1~8)
 P0=0xff;
 addr0=P0;
 if((a&addr0)!=0)    
 {master(a,0x02);lcd6();}    //通讯和显示二行“Press Key ...”
 else lcd4(); 			     //显示器第二行显示"No Module"

 if(a==0x80) {a=0x01;b=1;}
 else        {a=a<<1;b++;}
                      }
 

   P2_0=1;
 if(P2_0==0) delay();
 if(P2_0==0)        {
  delay();
  delay();
  P2_0=1;
 while(P2_0==0);
  lcd3();				     //某一模块显示(1~8)
  P0=0xff;
  addr0=P0;
 if((a&addr0)!=0)
 {master(a,0x02); lcd6();}  //通讯和显示二行“Press Key ...”     
  else lcd4(); 			    //显示器第二行显示"No Module"
 if(a==0x01) {a=0x80;b=8;}
 else {a=a>>1;b--;}
                     }

                                     }


//VFD模块初始化子函数
void lcd1(void){
 P1=0x3b;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;

 P1=0x06;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;

 P1=0x0c;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;

 P1=0x01;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
}

//显示器第一行显示”KX-7502J Modu   " 子函数
void lcd2(void){
 uchar i;
 uchar code *p=table1;
 P1=0x80;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;

 for(i=0;i<16;i++){
 P1=*p;
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
  p++;}
}


//显示器第二行显示数据
void xianshi(uchar s){

 uchar i,j;
 P1=0xc0;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
 
 for(j=0;j<16;j++){
 P1=*(*(pb+s)+j);
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
                   }
 P1=0xc9;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
						 
 for(i=s*4;i<s*4+4;i++){
 P1=*(rbuf+i);
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
                        }
 
}


//超时显示“Over Time"子函数
 void lcd5(void){							  
 uchar i;
 uchar code *am=table3;
 P1=0xc0;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
 for(i=0;i<16;i++){
 P1=*am;
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
 am++;}
				 }

  
//显示器显示函数
 void xis()              {

   P3_2=1;
 if(P3_2==0) delay();
 if(P3_2==0){
   delay();
   delay();
   P3_2=1;
 while(P3_2==0);
 if(c==1){lcd5();c=0;}
   else xianshi(y);
 if(y==3) y=0;
   else y++;
            }

   P2_1=1;
 if(P2_1==0) delay();
 if(P2_1==0){
 delay();
 delay();
   P2_1=1;
  while(P2_1==0);
 if(c==1){lcd5();c=0;}
   else xianshi(y);
 if(y==0) y=3;
   else y--; }
 
                         }


void main()
{
 TMOD=0x21;		         /*定时器T1和T0初始化:T1定时工作方式2,T0定时工作方式1	*/
 TL1=0xfd;TH1=0xfd;      /*设定T1的初值*/
 TR1=1;				     /*启动T1定时*/
 PCON=0x00;		         /*确定串口的波特率:SMOD=0*/
 SCON=0xf0;			     /*串口工作在方式3,SM2=1,REN=1允许接收*/
 TH0=0x4C;			     /*设定T0的初值*/
 TL0=0x1A;
 TR0=0;				     /*关闭定时器T0*/
 ET0=1;				     /*允许T0溢出中断*/
 ES=0;			         /*关串口中断*/
 EA=1;				     /*开放CPU总中断*/
 lcd1();
 lcd2();
 while(1){
 toxin();
  xis();
   }
}




⌨️ 快捷键说明

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