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

📄 bmushang_1大.c

📁 蓄电池监测,懂的人一看就懂,实在不明白也没办法
💻 C
字号:
#include <STC89C58RD+.H>
#include <absacc.h>

//外设绝对地址
#define lcddat XBYTE[0xffe0]		//液晶数据口LCD
#define lcdrow XBYTE[0xffe1]		//液晶指定行地址口
#define lcdcol XBYTE[0xffe2]		//LCD指定列地址口
#define	lcdcon XBYTE[0xffe3]		//LCD指定config口

#define keyprt XBYTE[0xffe4]

#define data8251_1 XBYTE[0xffe8]
#define code8251_1 XBYTE[0xffe9]

#define data8251_2 XBYTE[0xffec]
#define code8251_2 XBYTE[0xffed]

//键值
#define keyup 8		//13		
#define keydwn 4	//14	
#define keylft 9	//9	
#define keyrgh 5	//10	
#define keytrue 2	//7	
#define keyesc 14	//4	
//数字和字母的ASCII
#define m0 0x10
#define m1 0x11
#define m2 0x12
#define m3 0x13
#define m4 0x14
#define m5 0x15
#define m6 0x16
#define m7 0x17
#define m8 0x18
#define m9 0x19
#define ma 0x21
#define mb 0x22
#define mc 0x23
#define md 0x24
#define me 0x25
#define mf 0x26
#define mg 0x27
#define mh 0x28
#define mi 0x29
#define mj 0x2a
#define mk 0x2b
#define ml 0x2c
#define mm 0x2d
#define mn 0x2e
#define mo 0x4f		//小写2f
#define mp 0x30
#define mq 0x31
#define mr 0x32
#define ms 0x33
#define mt 0x34
#define mu 0x35
#define mv 0x36
#define mw 0x37
#define mx 0x38
#define my 0x39
#define mz 0x3a
#define msub 0x0d
#define madd 0x0b
#define mpoint 0x0e
#define m 0x00
#define mlbra 0x08	//(
#define mrbra 0x09	//)
#define mdao 0x2f
//#define m^c     db 2,5,2,3ch,42h,42h,42h,66h    ;41
#define mslash 0x0f	// /
#define mstar 0x0a
#define mexclamation  0x01	//!
#define mcolon 	0x1a		//:
#define mquest	0x1f
#define m0not	0x80
#define m1not	0x81
#define m2not	0x82
#define m3not	0x83
#define m4not	0x84
#define m5not	0x85
#define m6not	0x86
#define m7not	0x87
#define m8not 	0x88
#define m9not	0x89

unsigned int lcdx;			//液晶显示的地址
//数据地址
unsigned char group;				//对应存储在EEPROM
unsigned char batmax[5];			//对应存储在EEPROM
unsigned char temmax[5];			//对应存储在EEPROM

//数据
xdata unsigned int dcdata[120];	//电池电压120个*2字节
xdata unsigned long	dctotal[2];	//电池总电压暂时分为2组的总电压
xdata unsigned int tdata[120];	//温度120个*2字节
xdata unsigned char tsign[120];	//温度符号
xdata unsigned int datai[5];	//电流1个*2字节
xdata unsigned char isign[5];	//电流符号
xdata unsigned char inputkg[5];
xdata unsigned char outputkg[5];
xdata unsigned char com1error[5];	//与各下位机通信错误次数
bit delayflag;//延时的标记
xdata unsigned char delaytime;//延时的时间
unsigned char jvhao_a,jvhao_b,jvhao_a1,jvhao_b1;//POWERCOM通讯板所采用的局号
xdata unsigned char jvhao_com;
xdata unsigned int jvhao_temp[5];

//各类告警值
xdata unsigned char analogalarm[120];	//模拟量告警的标志
										//1上限告警
										//2下限告警
										//0正常
										//1组0~47为单体电压、48总电压、49电流、50温度1、温度2
										//2组+60
xdata unsigned char oldanalogalarm[120];
xdata unsigned char alarmrecord[80];	//告警记录/可记录10条/掉电失去
xdata unsigned int dcsinglehighalarm;	//单体电池高告警
xdata unsigned int dcsinglelowalarm;	//单体电池低告警
xdata unsigned int dctotalhighalarm;	//总电压高告警
xdata unsigned int dctotallowalarm;		//总电压低告警
xdata unsigned int ihighalarm;			//电流高告警
xdata unsigned int thighalarm;			//温度高告警	

unsigned char jvhao;					//局号
xdata unsigned char shezhi[4];			//密码

xdata unsigned char wram[0x10];		// _at_ 0x1ff0在设置中暂存用

xdata unsigned char contrast;		//液晶对比度

//cpu脚
sbit a16=P1^0;		//=0选择628128的前64K		
sbit cs1=P1^1;	
sbit cs2=P1^2;		//CS1与CS2共同选择MAX5422(数字电位器),1302(时钟),9366(串行EEPROM),频率
sbit sclk=P1^3;
sbit out9366=P1^4;  //9366(串行EEPROM)输出
sbit comsel2=P1^5;	//COMSEL0,COMSEL1,COMSEL2作为89C58RD+通信口的扩展用
sbit comsel1=P1^6;	
sbit comsel0=P1^7;

//P3^0通信接受RXD
//P3^1通信发送TXD
sbit muldat=P3^2;	//对应MAX5422(数字电位器)输入,1302(时钟)输入与输出,9366(串行EEPROM)输入,频率
//P3^3第1块8251中断
sbit bell=P3^4;
sbit lamp=P3^5;
//P3^6写
//sbit WR=P3^6;
//P3^7读
//sbit RD=P3^7;

sbit backlight=P4^0;
sbit ds18b20data=P4^1;
//P4^2键盘中断
//P4^3第2块8251中断

//本机通信口COM:连放电仪
unsigned char xdata combuf[0xff],compos,comnum,sendbuf[120];
bit comsendflag;							//对POWERCOM_485发送命令时为1
//8251_1第1通信口COM1:连下位机
xdata unsigned char com1buf[0x210],com1pos,com1num;
xdata unsigned char com1No,com1backno;
xdata unsigned char com1command,com1backcommand;
xdata unsigned int com1backcontent1,com1backcontent2;
xdata unsigned char com1tim; 
bit enter1flag,send1flag;


//8251_2第2通信口COM2:连计算机
xdata unsigned char com2buf[0xff],com2pos,com2num,com2tim;
xdata unsigned char ;
bit enter2flag;								//收到字符置1
//时间
bit secondflag;			//1秒到的标志
unsigned char intervaltim;	//与下位机通信的间隔时间,与几台下位机有关

unsigned char timnum,tim_backlight,timkey,beltim,ttime;	//miao
unsigned char key;
bit readkey,key_backlight;
xdata unsigned char firststep;			//第7页(设置时间)显示时=0,第1阶段结束时,置1
bit secondstep;							//第7页第1阶段结束时=0,第2阶段结束时,置1

unsigned char lcdpg,oldpg,selcur,cursel,checip,errnum;

//18b20错误标志
bit error18b20;
//convert or read temperature
bit conv_rdt;

unsigned char time1302[8];	//16进制,从低到高:秒,分,时,日,月,星期,年,控制
unsigned char wd[2];	//wd[0]符号,wd[1]数据

unsigned char p2No;		//目前正测模拟量的编号No,
xdata unsigned char p26page;	//告警记录屏幕的页号

unsigned char xdata temp[40];		//设置用
unsigned char xdata ptemp;			//temp的第几个位置
xdata unsigned char temporary[11];	//除中断外,所有程序用的暂时的字节

// ------ Check the LCD Status for Read/Write one data.
void lcdsta(void)
{		unsigned char i,j;
		for(i=0;i<0x90;i++)
		{	j=lcdcon;
			j=(j & 0x03);
			if(j==3) break;
		}
}
//------ 液晶无参数命令
void pr0(unsigned char i)
{		lcdsta();
		lcdcon=i;
}
//------ 液晶1参数命令
void pr1(unsigned char i,j)
{		lcdsta();
		lcddat=i;
		lcdsta();
		lcdcon=j;
}		
//------ 液晶2参数命令
void pr2(unsigned int i,unsigned char j)
{		unsigned char k;
		lcdsta();
		k=(i & 0xff);
		lcddat=k;	//lcdax.hl.l;
		lcdsta();
		k=(i>>8);
		lcddat=k;	//lcdax.hl.h;
		lcdsta();
		lcdcon=j;	//lcdbh;
}
// ------ Check the LCD Status for Write No.x data.
void lcdtew(void)
{		unsigned char i,j;
		for(i=0;i<0xf0;i++)
		{	j=lcdcon;
			j=(j & 0x08);
			if(j!=0) break;
		}
}
// ------ Set the LCD Address(R/W,Text)
//Input: lcdx==the position of r/w.
//       lcdl (Col. No., 0-29)
//       lcdh (Row  No., 0-07)
void lcdtad(unsigned int addr)
{		unsigned int i;
		i=addr;
		i=i>>8;
		i=i*30;
		i=i+(addr & 0xff);
		i=i+0x0800;
		pr2(i,0x24);
}
// ------ Set the LCD Address(R/W,图形)
//input: lcdx==the position of r/w.
//       lcdh (Row  No., 0-07) 
//       lcdl (Col. No., 0-30)     
unsigned int lcdgad(unsigned int addr)
{		unsigned int x;	
		x=(addr>>8);
		x=x*240;
		x=x+(addr & 0xff);
		x=x+0x09e0;
		pr2(x,0x24);
		return(x);
}

unsigned char code cgram[]={
		0xc7,0xbb,0xb3,0xab,0x9b,0xbb,0xc7,0xff,		//0
		0xef,0xcf,0xef,0xef,0xef,0xef,0xc7,0xff,		//1
		0xc7,0xbb,0xfb,0xf7,0xef,0xdf,0x83,0xff,		//2
		0x83,0xf7,0xef,0xf7,0xfb,0xbb,0xc7,0xff,		//3
		0xf7,0xe7,0xd7,0xb7,0x83,0xf7,0xf7,0xff,		//4
		0x83,0xbf,0x87,0xfb,0xfb,0xbb,0xc7,0xff,	    //5
		0xe7,0xdf,0xbf,0x87,0xbb,0xbb,0xc7,0xff,		//6
		0x83,0xfb,0xf7,0xf7,0xef,0xef,0xef,0xff,		//7
		0xc7,0xbb,0xbb,0xc7,0xbb,0xbb,0xc7,0xff,		//8
		0xc7,0xbb,0xbb,0xc3,0xfb,0xf7,0xcf,0xff,		//9
		0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00,    	//叉
		0x00,0x02,0x04,0x44,0x28,0x28,0x10,0x00	};	    //钩 

// ----- Initialize LCD config
  //显示方式:逻辑“异或”合成;(B2,B1,B0) 000 or, 001 xor, 011 and;B3=0 CGROM, B3=1 CGRAM
void lcdini(void)
{	//unsigned char i;  //,j
	unsigned int x,y;
	for(x=0;x<480;x++)//LCD初始化成为白屏幕
	{	//由于行高位不能自动+1,所以
		if (x<256)	
		{	lcdcon=0;
			lcdrow=x;
		}
		else
		{	lcdcon=4;
			lcdrow=x-256;
		}
		lcdcol=0;
		for(y=0;y<640;y++)	lcddat=2;
	}
/*		pr0(0x81);              
  	//CGRAM偏置地址0
        pr2(0,0x22);
    //地址指针
    	pr2(0x0400,0x24);
//	for(i=0;i<96;i++) {
//		j=cgram[i];
//		pr1(j,0xc0);
//	}	
    //自动写    					
        pr0(0xb0);
    //cgram内10个阴0-9,每个8字节,另外加'叉'和'钩'
		for(i=0;i<96;i++) {	
			lcdsta();
			lcddat=cgram[i]; 
		}
	//自动写结束	
	    pr0(0xb2);

		pr0(0x81);              
  	//CGRAM偏置地址0
        pr2(0,0x22);
    //地址指针
    	pr2(0x0400,0x24);
    //自动写    					
        pr0(0xb0);
    //cgram内10个阴0-9,每个8字节,另外加'叉'和'钩'
		for(i=0;i<96;i++) {	
			lcdsta();
			lcddat=cgram[i]; 
		}
	//自动写结束	
	    pr0(0xb2);

    //文本区首地址
    	pr2(0x0800,0x40);
    //设置文本区宽度,大液晶16行,乘以30(每行)
		pr2(30,0x41);
    //图形区首地址
		 pr2(0x09e0,0x42);
    //图形区宽度(字节数/行)
		pr2(30,0x43);
    //光标形状8*8
        pr0(0xa7);
    //显示开关

⌨️ 快捷键说明

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