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

📄 main.c

📁 用C8051F020做的一个船进水检测系统
💻 C
字号:
#include <reg52.h>
#include "absacc.h"
#include <math.h>
#include<intrins.h>
#define  mode 0x9b
#include "ziku.h"
#define uchar unsigned char
#define uint unsigned int
#define AP 0x2a
#define LENGTH 250  //波形区域宽度
#define WIDTH 200   //波形区域高度
sbit a0=P2^0;
xdata unsigned char PortA _at_ 0xc000;
xdata unsigned char PortB _at_ 0xc001;
xdata unsigned char PortC _at_ 0xc002;
xdata unsigned char CAddr _at_ 0xc003;
//sbit cs=P1^3;
sbit cs1=P2^5;
sbit cs2=P2^6;
sbit cs3=P2^7;
sbit rst=P1^4;
sbit wr=P3^6;
sbit rd=P3^7;
sbit alarm=P1^0;
/*****************************/
unsigned char bdata d[3];
uchar code sys[8]={0x30,0x87,0x07,0x27,0x7a,0xef,0x2a,0}; /*P1-P8*/
uchar code scr[10]={0,0,0xef,0x00,0x28,0xef,0x00,0x50,0,0}; /*P1-P10*/
uchar code arr[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar gprsflag=0;
uchar code at1[3]={'A','T',0X0D};
uchar code at2[10]={'A','T','+','C','M','G','F','=','1',0x0d};
uchar code at3[22]={'A','T','+','C','M','G','S','=','"','1','3',
                      '0','1','3','7','0','8','0','5','1','"',0x0d};
uchar code at4[14]={'w','a','t','e','r',' ','w','a','r','n','i','n','g','!'};
uchar yangda[3];
//函数定义
void outcode(uchar code_data);
void outdata(uchar data_data);
uchar indata(void);
void turnoff(void);
void turnon(void);
void initram(void);
void init(void);
void fixline(int y);
void fixline2(int x);
void WriteD(uchar x,uchar y);
void delay(uchar di);
void showchinese32(int addr,uchar *chin);
void drawtable();
void shownumber(int addr,uchar number);
void shownumber16(int addr,uchar number);
void warn0(uchar canghao[4],j);
void count(uchar canghao[],uchar*p);
void countgprs(uchar yangda[3],uchar canghao[],uchar*p);
void sendnum(void);
void xszc()	;
void warn3(uchar canghao[],uchar j);
void kaiji();
void outcode(uchar code_data)//输出指令代码
{//	cs=0;
    cs1=1;
	cs2=0;
	cs3=1;
	a0=1;	
	rd=1;
	P0=code_data;
	wr=0;
	wr=1;
	//cs=1;
	cs1=0;
	cs2=0;
	cs3=1;
}

void outdata(uchar data_data){//输出指令参数
	a0=0;
//	cs=0;
	cs1=1;
	cs2=0;
	cs3=1   ;
	P0=data_data;
	wr=0;
	wr=1;
	//cs=1;
	cs1=0;
	cs2=0;
	cs3=1;
}

uchar indata(void){//输出指令参数
	uchar data_data;
	a0=1;
//	cs=0;	
	cs1=1;
	cs2=0;
	cs3=1  ;
	P0=0xff;
	wr=1;
	rd=0;	
	data_data=P0;
	rd=1;
//	cs=1;
	cs1=0;
	cs2=0;
	cs3=1;
	return data_data;
}

void delay(uint di) //延时子程序
{ uint k;
	for(;di!=0;di--)
	{
		for(k=0;k<1000;k++);
	}
}

void WriteD(uchar x,uchar y)  //write a dot on the 1nd layer
{
	unsigned int address;
	uchar addh,addl;
	uchar m=0,n;
	address=0x01f9+x/8+y*AP;
	addh=address/256;
	addl=address%256;
	n=x%8;
	outcode(0x46);
	outdata(addl);
	outdata(addh);
	outcode(0x43);
	m=indata();
	m=m|arr[n];
	outcode(0x46);
	outdata(addl);
	outdata(addh);
	outcode(0x42);
	outdata(m);
}

void turnoff(void){
	outcode(0x58);//off screen
	outdata(0x00);
}

void turnon(void){
	outcode(0x59);//on screen
	outdata(0x55);
}

void initram(void){//显示存储器清零
	unsigned int i;
  	outcode(0x4c);
	outcode(0x46);
	outdata(0x00);
	outdata(0x00);
	outcode(0x42);//clear screen memory
	for(i=0;i<=0x7800;i++){outdata(0x00);}//32767
}

void init(void){//初始化程序
	int n;
	outcode(0x40); /*SYSTEM SET 指令代码*/
	for(n=0;n<8;n++)outdata(sys[n]); /*将参数P1-P8 写入*/
	outcode(0x44); /*SCROLL 指令代码*/
	for(n=0;n<10;n++)outdata(scr[n]); /*将参数P1-P10 写入*/
	outcode(0x5a); /*HDOT SCR——P1 清零复位*/                   
	outdata(0);
	outcode(0x5b); /*OVLAY—*/
	outdata(0x1c);
}

void fixline(int y)		//在第二层画水平直线 0-240)
{
	unsigned int address;
	uchar addh,addl;
    	uchar i;
	address=y;
	addh=address/256;
	addl=address%256;
	outcode(0x46);
	outdata(addl);
	outdata(addh);
	outcode(0x4c);
	outcode(0x42);
	outdata(0x1f);
	for(i=0;i<39;i++)outdata(0xff);
}

void fixline2(int x)	   //x(1-40)
{
	unsigned int address;
	uchar addh,addl;
    	uchar i;
	address=x;
	for(i=0;i<160;i++)
{	addh=address/256;
	addl=address%256;
	outcode(0x46);
	outdata(addl);
	outdata(addh);
	outcode(0x4c);
	outcode(0x42);
	outdata(0x18); 
 	 address+=42;
 
	}
}

void initall(void){	//初始化
	turnoff();
	init();
	turnon();	
	initram();
}

void showchinese32(int addr,uchar *chin)
//功能:在x,y位置处,显示字符码为chin
//x坐标寄存器(字节),y坐标寄存器(点行)
{ 
	int temp1; 

	uchar hi,lo,*temp2;
	uchar b,c=0;
	//d=y;
	temp2=chin;
	temp1=addr;
	outcode(0x4c);
	for(b=0;b<32;b++){
		//0x51f9,5218,2a18
		hi=temp1/256;
		lo=temp1%256;
		outcode(0x46);
		outdata(lo);
		outdata(hi);
		outcode(0x42);
		outdata(temp2[c++]);	
		outdata(temp2[c++]);	
		outdata(temp2[c++]);
		outdata(temp2[c++]);	
		temp1+=AP;//	d=d+1; 
	}
}


void shownumber(int addr,uchar number)
//功能:在x,y位置处,显示字符码为chin
//x坐标寄存器(字节),y坐标寄存器(点行)
{ 
	int temp1; 

	uchar hi,lo;
	uchar b;
	//d=y;
	temp1=addr;
	outcode(0x4c);
	for(b=0;b<16;b++){
		//0x51f9,5218,2a18
		hi=temp1/256;
		lo=temp1%256;
		outcode(0x46);
		outdata(lo);
		outdata(hi);
		outcode(0x42);
		outdata(num[16*number+b]);	
		
		temp1+=AP;//	d=d+1; 
	}
}

void shownumber16(int addr,uchar number16)
//功能:在x,y位置处,显示字符码为chin
//x坐标寄存器(字节),y坐标寄存器(点行)
{ 
	int temp1,c=0; 

	uchar hi,lo;
	uchar b;
	//d=y;
	c=64*number16;
	temp1=addr;
	outcode(0x4c);
	for(b=0;b<32;b++){
		//0x51f9,5218,2a18
		hi=temp1/256;
		lo=temp1%256;
		outcode(0x46);
		outdata(lo);
		outdata(hi);
		outcode(0x42);
		outdata(num16[c++]);	
		outdata(num16[c++]);
		temp1+=AP;//	d=d+1; 
	}
}


void drawtable()
{  uchar i; 
	for(i=0;i<9;i++)
	fixline2(2184+i*5);
	for(i=0;i<5;i++)
	fixline(2184+i*1680);
}
void warn3(uchar canghao[],uchar j)
{		uchar i,temp[2];
		initram();	    
		drawtable();
		showchinese32(345,shui);
		showchinese32(349,wei);
		showchinese32(353,yi);
		showchinese32(357,chang);
		showchinese32(361,cang);
		showchinese32(365,wei);
		for(i=0;i<j;i++)
        { temp[0]=(canghao[i]-1)/8;
		  temp[1]=(canghao[i]-1)%8;
		  shownumber16(2353+1680*temp[0]+temp[1]*5,temp[0]);
		   shownumber16(2355+1680*temp[0]+temp[1]*5,temp[1]);
		}
}

void xszc()				     //显示正常画面
{	    initram(); 
     	showchinese32(1852,chuan);
		showchinese32(1856,cang);
		showchinese32(1860,jin);
		showchinese32(1864,shui);
		showchinese32(1868,jian);
		showchinese32(1872,ce);
		showchinese32(1876,xi);
		showchinese32(1880,tong);
		showchinese32(3872,shui);
   	    showchinese32(3879,wei);
   		showchinese32(3886,zheng);
  		showchinese32(3893,chang);
		shownumber16(6441,10);
		shownumber16(6443,10);
		shownumber16(6445,10);
		shownumber16(6447,15);
		shownumber16(6449,13);
		shownumber16(6451,14);
		shownumber16(6453,8);
		shownumber16(6455,8);
		shownumber16(6457,15);
		shownumber16(6459,11);
		shownumber16(6461,12);
}

void warn0(uchar canghao[],j)
{uint addr;
     uchar i,temp;
 	 addr=2524;
	initram();  
    showchinese32(350,jing);
    showchinese32(358,gao);
  	 for (i=0;i<j;i++)
       {     temp=canghao[i]/10;
             shownumber16(addr,temp);
			 temp=canghao[i]%10;
		     shownumber16(addr+2,temp);
		     showchinese32(addr+4,hao);
			 showchinese32(addr+8,chuan);
			 showchinese32(addr+12,cang);
			 showchinese32(addr+16,shui);
			 showchinese32(addr+20,wei);
			 showchinese32(addr+24,yi);
			 showchinese32(addr+28,chang);
			 if(i==0)
		     addr+=1848;
			 else addr+=1680;
			 _nop_(); _nop_();
			 _nop_(); _nop_();
	   }
}
/********************************/
/*键盘扫描?*
/********************************/
uchar kbscan(void)
{uchar t,temp=0;
if((P1&0x0e)!=0x0e)
{delay(5);
if((P1&0x0e)!=0x0e)
{t=P1&0x0e;
switch (t)
{case 0x0c:temp=1;break;
 case 0x0a:temp=2;break;
 //case 0x06:temp=3;break;
 default  : break;
}
}
}
return(temp);
}
/***************************************************
 	           rs232
****************************************************/
/****RS232初始化***************/
void init232(void)
{	TMOD=0x21;
	PCON=0x80;
    TH0=100;
	TL0=50;
	TH1=250;
	TL1=250; //波特率为1200
 //当TH1=244时为2400,当TH1=250时为4800,
 //当TH1=253时为9600
	TR1=1;
	TR0=1;
	ET0=1;
	SCON=0x50;
}
/****RS232发送数据****/
void send232(uchar *p , uchar num)
{       
	uchar i;//,temp;,count=0;
    EA=0;//关中断防止进入中断服务程序
        
    for(i=0;i<num;i++)
   		 { SBUF= *(p+i) ;	//发送数据
     	  			
          while(TI!=1); 
           TI=0;
                  }
	       EA=1;
					
}
/*********************************************/
void send(uchar num)
{  EA=0;
   SBUF=num;
   while(TI==0);
   TI=0;
   EA=1;
}
   

/******************************************
        GPRS
******************************************/
void gprs(void) interrupt 1
{  
  TH0=10;
  TL0=100;
 switch(gprsflag++)
 {case 0: send232(at1,3);break;
  case 6: send232(at2,10);break;
  case 20:send232(at3,22);break;
  case 40:sendnum();gprsflag=0;EA=0; break;
  //case 70:gprsflag=0;break;
  default:break;
 }
 
}
/********************************************/
void sendnum(void)
{uchar i, k,canghao[24],j,temp[2],t;
  countgprs(yangda,canghao,&j); 
  send232(at4,14);
  for(i=0;i<j;i++)
  { temp[0]=canghao[i]/10;
    temp[1]=canghao[i]%10;
     for(k=0;k<2;k++)
	   if(temp[k]!=0)
	      {t=temp[k]+0x30;
		  send(t);
			}
	t=' ';
	send(t);
  }
  t=0x1a;
  send(t);

}
/***********************************************/
void kaiji()
{      
		initram();	
    	showchinese32(2026,huan);
		showchinese32(2031,ying);
		showchinese32(2036,shi);
		showchinese32(2041,yong);
		showchinese32(4039,qian);
		showchinese32(4043,jing2);
		showchinese32(4047,dian);
		showchinese32(4051,zi);
		showchinese32(4055,ji);
		showchinese32(4059,shu);  
        
		shownumber16(6441,10);
		shownumber16(6443,10);
		shownumber16(6445,10);
		shownumber16(6447,15);
		shownumber16(6449,13);
		shownumber16(6451,14);
		shownumber16(6453,8);
		shownumber16(6455,8);
		shownumber16(6457,15);
		shownumber16(6459,11);
		shownumber16(6461,12);
		delay(1000);
}
/**************************************************
                计算舱号
***********************************************/
void count(uchar canghao[],uchar*p)
{uchar k,i,j;
 j=0;
 for(k=0;k<3;k++)
	{for (i=0;i<8;i++) 
			{if ((d[k]>>i)&0x01)	
				 canghao[j++]=i+1+8*k;
			}
	 }
   *p=j;
  }
/*******************************************/
void countgprs(uchar yangda[3],uchar canghao[],uchar*p)
{uchar k,i,j;
 j=0;
 for(k=0;k<3;k++)
	{for (i=0;i<8;i++) 
			{if ((yangda[k]>>i)&0x01)	
				 canghao[j++]=i+1+8*k;
			}
	 }
   *p=j;
  }
/**********************************************/
void main()
{  uchar k,j=0,f[3]={0} ;
	uchar canghao[24]={0};
   bit alarmflag0=0,alarmflag1=0;
    init232();
    alarm=0;
   	initall();
	kaiji();
    CAddr=mode ;
  	xszc();
	while(1)
	{   d[0]=PortC;d[1]=PortA;d[2]=0xff; 
        d[0]=d[0]^0xff;d[1]=d[1]^0xff; d[2]=d[2]^0xff;
		if((d[0]==f[0])&&(d[1]==f[1])&&(d[2]==f[2]));
		else
		{	 
		   
		   f[0]=d[0];f[1]=d[1];f[2]=d[2];
		 	count(canghao,&j);
		
   		    if(j==0)	 xszc();
   		     else{
			 		if(j<5)	warn0(canghao,j);
   		  			else    warn3(canghao,j);
					yangda[0]=d[0];yangda[1]=d[1];yangda[2]=d[2];
					EA=1;
 		           }
  		 }
		 if(alarmflag1==0)
		   {
            if(j==0)  alarmflag0=0,alarm=0;
             if(j>0)  
   		 	  if(alarmflag0==0) alarm=1;
	    	}
   		 
    	k=kbscan();
		switch (k)
		{case 1:alarmflag1=alarmflag1^1;alarm=~alarm;delay(200);break;
	 	 case 2: alarmflag0=1; alarm=0;break;
  		 default : break;
    	 }
	}
}

⌨️ 快捷键说明

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