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

📄 0cong0011.c

📁 485通讯的下位机程序
💻 C
字号:
#include<AT89X51.H>
#include<absacc.h>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define BN 16
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;
bit ck=0;
bit cj=0;
uchar idata tbuf[16];
uchar idata cd[16];
uchar addr;


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

//延时1s子函数
void delay1s(void){
 uchar i,j,k;
 i=100;
 for(k=0;k<10;k++){
 while((i--)!=0){
  for(j=0;j<125;j++)
  {;}
  }
  }
 }


//数据的采集处理子函数
void chaiji(void){
while(1){
 uchar i;
 if(ck==0){
 P3_3=1;
 if(P3_3==0){
 delay();
 if(P3_3==0)
{ P2_1=0;
  P2_2=0;
  delay1s();
  P2_0=0;
  ck=1;
  cj=0;
 }
  }
             }
if(cj==0){			 
  P3_3=1;
 if(P3_3==1){
 delay();
 if(P3_3==1)         
 {
 P2_0=1;
 delay();
 delay();
 delay();
 delay();
 delay();
 delay();
 delay();
 delay();
 delay();
 delay();
 P2_2=1;
 P2_1=1;
 cj=1;
 ck=0;
  }
             }
			   }

  /*采集数据程序部分*/
 for(i=0;i<16;i+=4){
 P0=0xff;
 while(!P0_4);
 ACC=P0;
cd[i]=ACC&0x0f;
 P0=0xff;
 while(!P0_5);
 ACC=P0;
 cd[i+1]=ACC&0x0f;
 P0=0xff;
 while(!P0_6);
 ACC=P0;
 cd[i+2]=ACC&0x0f;
 while(!P0_7);
 ACC=P0;
 cd[i+3]=ACC&0x0f;
 delay();
 P2_6=1;
 delay();
 delay();	
 delay(); 
 P2_6=0;
 delay();
 }
 delay();
 P2_7=1;
 delay();
 delay();	
 delay();  
 P2_7=0;
 delay(); 
 tbuf[0]=0x30;tbuf[1]=0x2e;tbuf[2]=cd[1]+0x30;tbuf[3]=cd[2]+0x30;
 tbuf[4]=cd[5]+0x30;tbuf[5]=cd[6]+0x30;tbuf[6]=0x2e;tbuf[7]=cd[7]+0x30;
 tbuf[8]=0x32;tbuf[9]=0x34;tbuf[10]=0x2e;tbuf[11]=0x30;
  ACC=0xff;ACC=ACC&cd[12];if((!ACC_0)&&(!ACC_3)) tbuf[12]=0x31; else tbuf[12]=0x30; tbuf[13]=cd[13]+0x30;tbuf[14]=0x2e;tbuf[15]=cd[14]+0x30;

             }

}



//下位机向上位机发送数据子函数
 void str(void)           {
 uchar i;
 char p; 
 do{ p=0;P3_2=1;			 //发送数据及校验和(6)
     for(i=0;i<BN;i++){
         SBUF=tbuf[i];
         p+=tbuf[i];
         while(TI!=1);TI=0;
                       }
      SBUF=p;
      while(TI==0);TI=0;
      P3_2=0;
      while(RI==0);RI=0;
    }while(SBUF!=0);		//接收正确返回,否则重发(7)     
    SM2=1;
    ES=1;                    }

     

 //中断服务子函数用于和上位机的通信
 void ssio(void) interrupt 4 using 1   {
  uchar a;
  RI=0;
  ES=0;
  P1=0xff;
  addr=P1;
  if(SBUF!=addr){ES=1;return;}  //接收比较地址(1)
  SM2=0; 
  P3_2=1;
  TB8=1;
  SBUF=addr;				    //发从机地址(2)
  while(TI!=1);TI=0; 
  P3_2=0;
  while(RI!=1);RI=0;
  if(RB8==1){SM2=1;ES=1;return;}
  a=SBUF;						//接收命令0x02 (3)
  if(a==0x02){
    P3_2=1;SBUF=0x01;			//发送0x01 (5)
    while(TI!=1);TI=0; 
    TB8=0;str();  P3_2=0;   }
  else{ P3_2=1;SBUF=0x80;	  //如果命令错收发送复位信号(fu)
     while(TI!=1);TI=0; 
     SM2=1;ES=1;   P3_2=0;
       }
                                         }



void main(void){
 TMOD=0x20;              /*定时器T1:T1定时工作方式2*/
 TL1=0xfd;TH1=0xfd;      /*设定T1的初值*/
 TR1=1;                  //启动T1定时			 定时器
 PCON=0x00;              /*确定串口的波特率:SMOD=0*/
 SCON=0xf0;              /*串口工作在方式3,SM2=1,REN=1允许接收*/
 ES=1;                   /*开串口中断*/
 EA=1;                   /*开放CPU总中断*/
 P2=0x1f;
 P3_2=0;
 chaiji();
                 }





⌨️ 快捷键说明

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