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

📄 gf.c

📁 光发射机的数据采集及显示程序
💻 C
字号:
#include<AT89X51.H>
#include<absacc.h>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define _RDY_  0x06
#define _BUSY_ 0x15
#define _OK_   0x00
#define _SUCC_ 0x0f
#define _ERR_  0xf0
#define  BN     28
void lcd1 (void);
void lcd2 (void);
void lcd12 (void);
void lcd21 (void);
void lcd3 (void);
void lcd4 (void);
void chaiji (void);
void delay (void);
void delay1s(void); 
uchar code table1[16]=
{0x4b,0x58,0x2d,0x37,0x35,0x30,0x32,0x42,0x20,0x4b,0x45,0x59,0x20,0x4f,0x46,0x46};
uchar code table2[16]=
{0x20,0x50,0x6c,0x65,0x61,0x73,0x65,0x20,0x77,0x61,0x69,0x74,0xa5,0xa5,0xa5,0x20};
uchar code table3[16]=
{0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x20,0x74,0x65,0x73,0x74,0x20,0x4f,0x4b,0x20};
uchar code table[9][16]={
{0x20,0x32,0x34,0x56,0x20,0x72,0x65,0x61,0x64,0x73,0x20,0x20,0x20,0x20,0x20,0x56},
{0x20,0x2d,0x35,0x56,0x20,0x72,0x65,0x61,0x64,0x73,0x20,0x20,0x20,0x20,0x20,0x56},
{0x20,0x2b,0x35,0x56,0x20,0x72,0x65,0x61,0x64,0x73,0x20,0x20,0x20,0x20,0x20,0x56},
{0x20,0x20,0x54,0x65,0x6d,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xdf,0x43,0x20},
{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,0x50,0x6f,0x77,0x65,0x72,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x57,0x20},
{0x53,0x2f,0x4e,0x3a,0x32,0x30,0x30,0x36,0x31,0x32,0x32,0x42,0x30,0x32,0x32,0x20},
{0x31,0x33,0x31,0x30,0x54,0x72,0x61,0x6e,0x73,0x69,0x6d,0x69,0x74,0x74,0x65,0x72}};
uchar code table4[5][16]={
{0x20,0x32,0x34,0x56,0x20,0x72,0x65,0x61,0x64,0x73,0x20,0x20,0x20,0x20,0x20,0x56},
{0x20,0x2d,0x35,0x56,0x20,0x72,0x65,0x61,0x64,0x73,0x20,0x20,0x20,0x20,0x20,0x56},
{0x20,0x2b,0x35,0x56,0x20,0x72,0x65,0x61,0x64,0x73,0x20,0x20,0x20,0x20,0x20,0x56},
{0x53,0x2f,0x4e,0x3a,0x32,0x30,0x30,0x36,0x31,0x32,0x32,0x42,0x30,0x32,0x32,0x20},
{0x31,0x33,0x31,0x30,0x54,0x72,0x61,0x6e,0x73,0x69,0x6d,0x69,0x74,0x74,0x65,0x72}};
 char s=4;
 bit ck=0;
 bit cj=0;
 uchar idata b[28];
 uchar idata cd[28];
//初始化显示器子函数
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-7502B KEY OFF"子函数
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++;}


}

//第二行显示“system test OK”子函数
void lcd2_1(void){
 uchar i;
 uchar code *p=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=*p;
 P3_4=1;												
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
  p++;}


}


//显示器第二行显示“Please wait..." 子函数
void lcd21 (void){
uchar j;
uchar code *bb=table2;
 P1=0xc0;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
 
 for(j=0;j<16;j++){
 P1=*bb;
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
  bb++;}
 bb=table2;
                   }

/*延时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++)
  {;}
  }
  }
 }
/*延时10毫秒子函数*/
 void delay(void){
 uchar i,j;
 for(i=0;i<100;i++)
    for(j=0;j<100;j++)
	    ; 
                 }
/*可变延时10ms子函数 */
 void delay10ms(uchar count){
  uchar i,j,k;
   for(k=0;k<count;k++)
     for(i=0;i<100;i++)
        for(j=0;j<100;j++)
	        ; 
                             }


/*显示器第一行8e开始的2位显示”ON"的子函数*/
 void lcd3(void){
 P1=0x8e;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;

 P1=0x4e;
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
 
 P1=0x20;
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
           }

/*显示器第一行8e开始的2位显示"OFF" 的子函数*/
 void lcd4(void){
 char i;
 P1=0x8e;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
 
for(i=0;i<2;i++){
 P1=0x46;
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
 	   } 
             }

 /*5变量的显示子函*/
void lcd112(void) {
 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=*(*(table4+s)+j);
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
                   }
 if(s<=2){				   	
 P1=0xcb;
 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=cd[i];
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
                       }
		  }			  }



/*9变量显示器第二行开始显示数据的子函数*/
 void lcd12(void) {
 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=*(*(table+s)+j);
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
                   }
if(s<=6){
 if(s>=3) P1=0xc9;				   	
 else P1=0xcb;
 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=cd[i];
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
                       } 
		 }
 }

 /*显示方行子函数*/
 void lcd1_2(void){
 char i;
 P1=0xc0;
 P3_4=0;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
 
for(i=0;i<16;i++){
 P1=0x14;
 P3_4=1;
 P3_5=0;
 P3_6=0;
 P3_6=0;
 P3_6=1;
 delay10ms(20);
 	   } 
             }


   	 
/*采集和数据处理子函数*/			   
void chaiji(void){
 while(1){
 uchar k;
 if(ck==1)  lcd12();
 else{
 P3_2=1;
 if(P3_2==0)delay();
 if(P3_2==0){
 lcd3();
 P2_0=0;
 P2_2=0;
 lcd1_2();
 P2_1=0;
 ck=1;
 cj=0;
 s=8;
            }
		}
 if(cj==1) lcd112(); 
  else{
 P3_2=1;
 if(P3_2==1)delay();
 if(P3_2==1){
 lcd4();
 P2_1=1;
 delay();
 delay();
 delay();
 delay();
 delay();
 delay();
 delay();
 delay();
 delay();
 delay();
 P2_0=1;
 P2_2=1;
 ck=0; 
 cj=1; 
 s=4;          
            }
			 }
//采集的数据存入b数组中
 for(k=0;k<28;k+=4){
 P0=0xff;
 while(!P0_4);
 ACC=P0;
 b[k]= ACC&0x0f;
 P0=0xff;
 while(!P0_5);
 ACC=P0;
 b[k+1]= ACC&0x0f;
 P0=0xff;
 while(!P0_6);
 ACC=P0;
 b[k+2]= ACC&0x0f;
 P0=0xff;
 while(!P0_7);
 ACC=P0;
 b[k+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();
//数据处理后存入cd数组中
 if(s==0) {cd[0]=b[1]+0x30;cd[1]=b[2]+0x30;cd[2]=0x2e;cd[3]=b[3]+0x30;}
 if(s==1) {cd[4]=0x2d;cd[5]=b[5]+0x30;cd[7]=b[6]+0x30;cd[6]=0x2e;}
 if(s==2) {cd[8]=0x2b;cd[9]=b[9]+0x30;cd[10]=0x2e;cd[11]=b[10]+0x30;}
 if(s==3) {cd[12]=0x32;cd[13]=0x35;cd[14]=0x2e;cd[15]=0x30;}
 if(s==4) {cd[16]=0x30;cd[17]=0x2e;cd[18]=b[17]+0x30;cd[19]=b[18]+0x30;}
 if(s==5) {cd[20]=b[21]+0x30;cd[21]=b[22]+0x30;cd[22]=0x2e;cd[23]=b[23]+0x30;}
 if(s==6) {ACC=0xff;ACC=ACC&b[24];if((!ACC_0)&&(!ACC_3))cd[24]=0x31; else cd[24]=0x30; cd[25]=b[25]+0x30;cd[27]=b[26]+0x30;cd[26]=0x2e;}
 } 
 }

/*中断服务子函数用于显示器显示数据*/
void sevice_int1() interrupt 2 using 1 
{
  s--;
 if(s<0&P3_2==0) s=8 ;
 if(s<0&P3_2==1) s=4 ;
 
 if(s==0) {cd[0]=b[1]+0x30;cd[1]=b[2]+0x30;cd[2]=0x2e;cd[3]=b[3]+0x30;}
 if(s==1) {cd[4]=0x2d;cd[5]=b[5]+0x30;cd[7]=b[6]+0x30;cd[6]=0x2e;}
 if(s==2) {cd[8]=0x2b;cd[9]=b[9]+0x30;cd[10]=0x2e;cd[11]=b[10]+0x30;}
 if(s==3) {cd[12]=0x32;cd[13]=0x35;cd[14]=0x2e;cd[15]=0x30;}
 if(s==4) {cd[16]=0x30;cd[17]=0x2e;cd[18]=b[17]+0x30;cd[19]=b[18]+0x30;}
 if(s==5) {cd[20]=b[21]+0x30;cd[21]=b[22]+0x30;cd[22]=0x2e;cd[23]=b[23]+0x30;}
 if(s==6) {ACC=0xff;ACC=ACC&b[24];if((!ACC_0)&&(!ACC_3))cd[24]=0x31; else cd[24]=0x30; cd[25]=b[25]+0x30;cd[27]=b[26]+0x30;cd[26]=0x2e;}
  if(P3_2==0) lcd12();
        else lcd112();

 }
   


//初始化串口
void int_serial()
{
 TMOD=0x20;     //定时器T1使用工作方式2
 TH1=250;       //设置初值
 TL1=250;       
 TR1=1;         //开始计时
 PCON=0x80;     //SMOD=1
 SCON=0x50;     //工作方式1,波特率9600 bit/s,允许接收
 }



/*发送数据*/
void send_data(uchar *buf)
{
 uchar ecc,i;
 ecc=BN;  //开始进行校验字节计算
/*发送数据*/
 for(i=0;i<BN;i++)
 {
  ecc=ecc^(*buf); //计算校验字节
  SBUF=*buf;      //发送数据
  buf++;
  while(!TI); 
  TI=0;
  }
  /*发送校验字节*/
  SBUF=ecc;  //发送校验字节
  while(!TI); 
  TI=0;
 }



/*串口中断*/
void ssio(void) interrupt 4 using 1   
{
/*如果接收到的不是握手信号_RDY_,则返回*/ 
 uchar tmp=_RDY_;
 RI=0;
 ES=0;
 if(SBUF!=tmp)
{ TI=0;    
  SBUF=_ERR_;
  while(!TI);
  TI=0;   ES=1;return;}

 TI=0;    //发送_OK_信号表示可以发送数据
 SBUF=_OK_;
 while(!TI);
 TI=0;
/*发送数据并接收校验信息,如果接收的信号为0x0f,表示主机接收成功,否则将重新发送该组数据*/
tmp=_ERR_;
while(tmp!=_SUCC_)
{
 send_data(b);
 RI=0;
 while(!RI);
 tmp=SBUF;
 RI=0;
 }
 ES=1;
 }


void main(void){

 IT1=1;	                     /*外部中断1设置为边沿触发方式*/
 EX1=1;	                     /*外部中断允许位开*/	                     /*中断总允许位开*/
 lcd1();
 lcd21();
 int_serial();
 ES=1; 
 EA=1;                        //开串口中断
 P2=0x1f;	                  /*开机蜂鸣器响一下*/
 delay10ms(10);
 P2_5=1;
 delay1s();
 lcd2();
 lcd2_1();
 chaiji();
}


   
         

     

     

⌨️ 快捷键说明

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