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

📄 main.c

📁 这是运用c51单片机测试电压电流的完整工程项目文件
💻 C
📖 第 1 页 / 共 3 页
字号:
#include 	"mdefine.h"
#include	"IIC_Soft.h"
#include	"Key_Dispose.h"
#include	"Ziku.h"
#include	"Lcd19264.h"
#include	"PCF8563.h"
#include	"Ad2543.h"
#include	"Tlc5615.h"
#include	"24c64.h"
//#include	"PRINT_DATA.H"
extern uchar UiBuffer[];
extern uchar TmpBuf[];
extern uchar	TimeBuffer[];
extern uchar Serial_Number[];
extern uchar Rec24c64[];
extern uchar idata Char_No;

uchar  idata ch1[12]={0xd1,0xf5,0xbb,0xaf,0xd0,0xbf,0xb1,0xdc,0xc0,0xd7,0xc6,0xf7};//氧化锌避雷器
uchar idata ch2[8]={0xb2,0xe2,0xca,0xd4,0xbd,0xe1,0xb9,0xfb};//测试结果
uchar idata ch3[5]={0xb5,0xe7,0xd1,0xb9,0x3a};//电压
uchar idata ch4[5]={0xb5,0xe7,0xc1,0xf7,0x3a};//电流
uchar idata ch5[5]={0xcf,0xb5,0xcd,0xb3,0x3a};//系统
uchar idata ch6[7]={0xb2,0xe2,0xca,0xd4,0xd4,0xb1,0x3a};//测试员
uchar  idata dauTmpBuf[6] = {0,0,0x2e,0,0x6b,0x56};//前四个字节为电压三位数含一位小数,后三个字节为kV
uchar  idata daiTmpBuf[4] = {0,0,0xe6,0x41};//前二个字节为电流两位数,后二个字节为uA
uchar  idata datime[14]={ 0,8,0x8c,1,2,0x8d,2,8,0x8e,1,6,0x3a,2,8};//08年12月28日16:28
//函数声明区
void Input_Serial_Number();
void disiping();


#pragma disable
void daima() // 转换打印代码
{
	uchar i;
	for(i=0;i<2;i++)    //电压数字转换打印内码
		  dauTmpBuf[i]=UiBuffer[i]|0x30;
		  dauTmpBuf[3]=UiBuffer[2]|0x30;//电压小数点后一位

	for(i=5;i<7;i++)   //电流数字转换打印内码
	  	daiTmpBuf[i-5]=UiBuffer[i]|0x30;

	for(i=0;i<2;i++)   //时间年数字转换打印内码
	  	datime[i]=TimeBuffer[i]|0x30;

	for(i=2;i<4;i++)   //时间月数字转换打印内码
	  	datime[i+1]=TimeBuffer[i]|0x30;

	for(i=4;i<6;i++)   //时间日数字转换打印内码
	  	datime[i+2]=TimeBuffer[i]|0x30;

	for(i=6;i<8;i++)   //时间时数字转换打印内码
	  	datime[i+3]=TimeBuffer[i]|0x30;

	for(i=8;i<10;i++)   //时间分数字转换打印内码
	  	datime[i+4]=TimeBuffer[i]|0x30;
}

/*************串口发送子函数***********/
sprint(unsigned char a)
{
		while(BUSY);
		SBUF=a;
		while(!TI);
		TI=0;
}

void dayin()
{
			int i;
			TH1  = 0xfd;//波特率9600
			TL1  = 0xfd;
			TMOD = 0x20 ;
			SCON = 0x40;//串行口方式1,10位数据,1位起始,8位数据,1位停止
		  TR1= 1;
			ES = 1;
			TI = 0;

	  	sprint(0x1b);sprint(0x40);//初始化打印机
	  	sprint(0x1b);sprint(0x63);sprint(0x00);//反向打印
	  	sprint(0x1b);sprint(0x6c);sprint(0x0);//设定左限,居中
	  	sprint(0x1c);sprint(0x26);sprint(0x00);//选择汉字

			//打印“氧化锌避雷器”
  		for(i=0;i<12;i++)  //打印氧化锌避雷器
			sprint(ch1[i]);
			sprint(0x0d); //回车

			//打印“测试结果”
			sprint(0x1b);sprint(0x6c);sprint(0x03);//设定左限,居中
			for(i=0;i<8;i++)
			sprint(ch2[i]);
			sprint(0x0d); //回车

			sprint(0x1b);sprint(0x6c);sprint(0x00);//设定左限,居左
			for(i=0;i<12;i++)
			sprint(0x2a);//打印“*********”
			sprint(0x0d); //回车


	  	//打印“电压:”
	  	for(i=0;i<5;i++)  //打印“电压”
			sprint(ch3[i]);

			//打印电压数值
			for(i=0;i<6;i++) //打印电压数值
			sprint(dauTmpBuf[i]);
			sprint(0x0d); //回车

			//打印“电流:”
	  	for(i=0;i<5;i++)  //打印“电流”
			sprint(ch4[i]);

			//打印电流数值
			for(i=0;i<4;i++) //打印电流数值
			sprint(daiTmpBuf[i]);
			sprint(0x0d); //回车

			//打印“**********”
			for(i=0;i<12;i++)
			sprint(0x2a);//打印“*************”
			sprint(0x0d); //回车

			//打印“系统:”
	  	for(i=0;i<5;i++)  //打印“系统:”
			sprint(ch5[i]);
			sprint(0x0d); //回车

			//打印“测试员:”
			for(i=0;i<7;i++) //打印“测试员:”
			sprint(ch6[i]);
			sprint(0x0d); //回车

			sprint(0x1b);sprint(0x36);//选择字符集1
			sprint(0x1b);sprint(0x6c);sprint(0x02);//设定左限,居右
			for(i=0;i<14;i++) //打印时间
			sprint(datime[i]);
			sprint(0x0d); //回车
}

/**************************************
  名称:main
  功能:主函数
  输入参数:无
  输出参数:无
*************************************/
void Print_Data()
{
  daima();
  dayin();
}
































void Time_Dispose_Read()
{
	PCF8563_Read();
	TimeBuffer[9]	=		TmpBuf[0]		& 0x0F;
	TimeBuffer[8]	=		(TmpBuf[0]  & 0xF0) >> 4;
	TimeBuffer[7]			=		TmpBuf[1] 	& 0x0F;
	TimeBuffer[6]		=		(TmpBuf[1]  & 0xF0) >> 4;
	TimeBuffer[5]			=		TmpBuf[2] 	&	0x0F;
	TimeBuffer[4]			=		(TmpBuf[2]  & 0xF0) >> 4;
	TimeBuffer[3]		=		TmpBuf[3]  	& 0x0F;
	TimeBuffer[2]		=		(TmpBuf[3]  & 0xF0) >> 4;
	TimeBuffer[1]			=		TmpBuf[4]		& 0x0F;
	TimeBuffer[0]	  =   (TmpBuf[4]  & 0xF0) >> 4;
}
//刷新时间
#pragma disable
void Real_Display_Time()									//实时显示时间
{
	  Time_Dispose_Read();                  //读PCF8563万年历时间
	  dxz(0,96,2,0);
	  dxz(0,102,0,0);

	  dxz(0,108,TimeBuffer[0],0);         		//显示年月日
		dxz(0,114,TimeBuffer[1],0);
		dxz(0,120,10,0);
		dxz(0,126,TimeBuffer[2],0);
		dxz(0,132,TimeBuffer[3],0);
		dxz(0,138,10,0);
		dxz(0,144,TimeBuffer[4],0);
		dxz(0,150,TimeBuffer[5],0);

		dxz(0,162,TimeBuffer[6],0);          		//显示时分
		dxz(0,168,TimeBuffer[7],0);
		dxz(0,174,11,0);
		dxz(0,180,TimeBuffer[8],0);
		dxz(0,186,TimeBuffer[9],0);
}
//读取电池电量
#pragma disable
void Battery()
{
		uchar idata BattCount = 0;
	if((batt2==0)&& (batt1==0) )
		BattCount=2;													//1/3格

	if((batt2==0)&& (batt1==1) )
		BattCount=1;													//1/2格
	if((batt2==1)&& (batt1==1) )
		BattCount=0;													//满格
	if((batt2==1)&& (batt1==0) )
		BattCount=0;												//满格



	dtx(1,176,BattCount,0);          		//显示电池电量
/*	if(BattCount==2)
		{
			lcd_init();
			lcd_init();
			lcd_init();
			Tlc5615(daCount);
			start=1;
			Real_Display_Time();           //显示实时时间
                        dtx(1,176,BattCount,0);          		//显示电池电量
			dh(2,40,55,0);//请启用备用电源
			dh(2,56,60,0);
			dh(2,72,61,0);
			dh(2,88,62,0);
			dh(2,104,63,0);
			dh(2,120,18,0);
			dh(2,136,64,0);

			dh(4,40,56,0);//重新开机
			dh(4,56,57,0);
			dh(4,72,58,0);
			dh(4,88,59,0);
			dh(4,104,47,0);

			while(1);

		}
               */
}
//主菜单上下键处理程序
#pragma disable

void Menu_Move()
{
	lcd_init();            //清屏
	 Real_Display_Time();           //显示实时时间
	 Battery();        						//显示电池电量
	if ( KeyCount	==	0 )
		{
			dh(2,52,10,1);//反白显示,测试
			dh(2,68,32,1);
			dh(2,84,32,1);
			dh(2,100,32,1);
			dh(2,108,32,1);
			dh(2,124,11,1);

			dh(6,52,28,0); //时钟设置
			dh(6,68,32,0);
			dh(6,76,29,0);
			dh(6,92,32,0);
			dh(6,100,30,0);
			dh(6,116,32,0);
			dh(6,124,31,0);

			dh(4,52,24,0); //历史数据
			dh(4,68,32,0);
			dh(4,76,25,0);
			dh(4,92,32,0);
			dh(4,100,26,0);
			dh(4,116,32,0);
			dh(4,124,27,0);
		}
	if ( KeyCount	==	1 )
		{
			dh(4,52,24,1);   //反显历史数据
			dh(4,68,32,1);
			dh(4,76,25,1);
			dh(4,92,32,1);
			dh(4,100,26,1);
			dh(4,116,32,1);
			dh(4,124,27,1);

			dh(2,52,10,0); // 测试
			dh(2,68,32,0);
			dh(2,84,32,0);
			dh(2,100,32,0);
			dh(2,108,32,0);
			dh(2,124,11,0);

			dh(6,52,28,0);   //时钟设置
			dh(6,68,32,0);
			dh(6,76,29,0);
			dh(6,92,32,0);
			dh(6,100,30,0);
			dh(6,116,32,0);
			dh(6,124,31,0);

		}
	if ( KeyCount	==	2 )
		{
			dh(6,52,28,1);   //反显时钟设置
			dh(6,68,32,1);
			dh(6,76,29,1);
			dh(6,92,32,1);
			dh(6,100,30,1);
			dh(6,116,32,1);
			dh(6,124,31,1);

			dh(4,52,24,0);  //历史数据
			dh(4,68,32,0);
			dh(4,76,25,0);
			dh(4,92,32,0);
			dh(4,100,26,0);
			dh(4,116,32,0);
			dh(4,124,27,0);


			dh(2,52,10,0);  // 测试
			dh(2,68,32,0);
			dh(2,84,32,0);
			dh(2,100,32,0);
			dh(2,108,32,0);
			dh(2,124,11,0);
		}
}

#pragma disable
void	Time_Dispose_Set()    //将年、月、日、时、分各位数字显示缓存区的数合并,并保存
{
	TmpBuf[0]  =  (TimeBuffer[8]<<4) | TimeBuffer[9];   		 //分=十位分*10+个位分
	TmpBuf[1]  =  (TimeBuffer[6]<<4) | TimeBuffer[7];        //时=十位时*10+个位时
	TmpBuf[2]  =  (TimeBuffer[4]<<4) | TimeBuffer[5];        //日=十位日*10+个位日
	TmpBuf[3]  =  (TimeBuffer[2]<<4) | TimeBuffer[3];        //月=十位月*10+个位月
	TmpBuf[4]  =  (TimeBuffer[0]<<4) | TimeBuffer[1];        //年=十位年*10+个位年
	PCF8563_SetTime();                										 //数字送器件8563内部寄存器
}


//外部中断1处理程序
uchar mod_1000( uint* ulTmp)   /*分离出千位数并返回,保留余下的部分*/
{
		uint ult1;
		ult1 = *ulTmp / 1000;
		*ulTmp = *ulTmp % 1000;
		return ult1;
}
uchar mod_100( uint* ulTmp)   /*分离出百位数并返回,保留余下的部分*/
{
		uint ult1;
		ult1 = *ulTmp / 100;
		*ulTmp = *ulTmp % 100;
		return ult1;
}
uchar mod_10( uint* ulTmp)     /*分离出十位数并返回,保留余下的部分*/
{
		uint ult1;
		ult1 = *ulTmp / 10;
		*ulTmp = *ulTmp % 10;
		return ult1;
}
void div_u_shuzi(uint ucTmp)		//分离电压数字
{
	uint uctmp;
	uctmp		=	ucTmp;
	UiBuffer[0]	=	mod_100(&uctmp);
	UiBuffer[1]	=	mod_10(&uctmp);
	UiBuffer[2]	=	uctmp;

}
void div_i_shuzi(uint ucTmp)		//分离电流数字
{
	uint uctmp;
	uctmp		=	ucTmp;
	UiBuffer[3]	=	mod_1000(&uctmp);
	UiBuffer[4]	=	mod_100(&uctmp);
	UiBuffer[5]	=	mod_10(&uctmp);
	UiBuffer[6]	=	uctmp;

}


void Shipin_U_dispose()        //处理电压读数 显示
{

	uiDianya	=	(uint)(Read2543(0) * 0.119604);
  uiDianya	=	(uint)(Read2543(0) * 0.119604);
  Rec24c64[6]	=	uiDianya/256;
  Rec24c64[7]	=	uiDianya%256;
	div_u_shuzi(uiDianya);
}

void Shipin_I_dispose()        //处理电流读数 显示
{
   uiDianliu	=	(uint)(Read2543(1) * 0.396555);
   uiDianliu	=	(uint)(Read2543(1) * 0.396555);
   Rec24c64[1]	=	uiDianliu;
		div_i_shuzi(uiDianliu);
}

//试品异常处理程序
void shipin_error1()
{
	lcd_init();
	dh(1,60,11,0);//试品错误!
	dh(1,76,44,0);
	dh(1,92,45,0);
	dh(1,108,46,0);
	dh(1,124,47,0);
}

//试品异常处理程序
void shipin_error2()
{
	dh(4,60,48,0);  //高压无回路!
	dh(4,76,49,0);
	dh(4,92,50,0);
	dh(4,108,51,0);

⌨️ 快捷键说明

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