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

📄 newmain.c

📁 这是运用c51单片机测试电压电流的完整工程项目文件
💻 C
📖 第 1 页 / 共 4 页
字号:
//时钟设置
void settime()
{
	uchar key = 0;
	lcd_init() ; //清屏
	Dis_settime();//进入时钟设置
	do                              //等待返回键被按下
 	{key=namekey();}
 	while(key!=4);

 	program_1();
}


void Time_Dispose_Read()
{
	P8563_Read();
	minute1		=	P8563_Store[0]	& 0x0F;
	minute10	=	P8563_Store[0] & 0xF0;
	hour1		=	P8563_Store[1] & 0x0F;
	hour10		=	P8563_Store[1]	 & 0xF0;
	day10		=	P8563_Store[2]	 & 0xF0;
	day1		=	P8563_Store[2]  & 0x0F;
	month1		=	P8563_Store[3]  & 0x0F;
	month10		=	P8563_Store[3]  & 0xF0;
	year1		=	P8563_Store[4]	 & 0x0F;
	year10	    =   P8563_Store[4]  & 0xF0;
}
void	Time_Dispose_Set()    //将年、月、日、时、分各位数字显示缓存区的数合并,并保存
{
	P8563_Store[0]  =  minute10 * 10 + minute1;   //分=十位分*10+个位分
	P8563_Store[1]  =  hour10  *  10 + hour1;       //时=十位时*10+个位时
	P8563_Store[2]  =  day10   * 10  + day1;         //日=十位日*10+个位日
	P8563_Store[3]  =  month10 * 10 + month1;       //月=十位月*10+个位月
	P8563_Store[4]  =  year10  * 10 + year1;        //年=十位年*10+个位年
	P8563_settime();                //数字送器件8563内部寄存器
}



uchar  Yp[]={16,24,48,56,80,88,112,120,144,152};//时钟设置界面时间列号
uchar	  utime[10];
//uchar	 KeyPosition = 0;  //该数据值 保存着要修改的 数值信息,光标起始位置在0列


void time_mod()  //修改时间函数

{
	uchar	 KeyPosition = 0;  //该数据值 保存着要修改的 数值信息,光标起始位置在0列
	uchar keytmp,Keyc = 0;
	utime[0] = year10;
	utime[1] = year1;
	utime[2] = month10;
	utime[3] = month1;
	utime[4] = day10;
	utime[5] = day1;
	utime[6] = hour10;
	utime[7] = hour1;
	utime[8] = minute10;
	utime[9] = minute1;
	while (1)
	{
		keytmp = namekey();     //读键值
		switch ( keytmp)
		{
			case 1 :     //上键,减少数字
						switch ( KeyPosition )//光标起始位置
						{
							case 0:   //光标在年的十位
									if ( year10 == 9 )       //9+1=0
										year10 = 0;
									else
										year10++;
									df(4,Yp[0],year10,1);
									utime[0] = year10;
									break;
							case 1:   //光标在年的个位
									if ( year1 == 9 )
										year1 = 0;
									else
										year1++;

									df(4,Yp[1],year1,1);
									utime[1] = year1;
									break;
							case 2:  //光标在月的十位
									if ( month10 == 1 )   //月_十位=0,1
										month10 = 0;
									else
										month10++;

									df(4,Yp[2],month10,1);
									utime[2] = month10;
									break;
							case 3:   //光标在月的个位
									if ( month1 == 9 )
										month1 = 0;
									else
										month1++;
									df(4,Yp[3],month1,1);
									utime[3] = month1;
									break;
							case 4:    //光标在日的十位
									if ( day10 == 3 )  //日_十位=0,1,2,3
										day10 = 0;
									else
										day10++;

									df(4,Yp[4],day10,1);
									utime[4] = day10;
									break;
							case 5:    //光标在日的个位
									if ( day1 == 9 )
										day1 = 0;
									else
										day1++;
									df(4,Yp[5],day1,1);
									utime[5] = day1;
									break;
							case 6:    //光标在时的十位
									if ( hour10 == 2 )    //时_十位=0,1,2
										hour10 = 0;
									else
										hour10++;

									df(4,Yp[6],hour10,1);
									utime[6] = hour10;
									break;
							case 7:       //光标在时的个位
									if ( hour1 == 9 )
										hour1 = 0;
									else
										hour1++;

									df(4,Yp[7],hour1,1);
									utime[7] = hour1;
									break;
							case 8:     //光标在分的十位
									if ( minute10 == 5 )   //分_十位=0,1,2,3,4,5
										minute10 = 0;
									else
										minute10++;

									df(4,Yp[8],minute10,1);
									utime[8] = minute10;
									break;
							case 9:     //光标在分的个位
									if ( minute1 == 9 )
										minute1 = 0;
									else
										minute1++;

									df(4,Yp[9],minute1,1);
									utime[9] = minute1;
									break;
						}
						break;

			case 2 :    //下键,增加数字
						switch ( KeyPosition )
						{
							case 0:   //光标在年的十位
									if ( year10 == 0 )
										year10 = 9;
									else
										year10--;
									df(4,Yp[0],year10,1);
									utime[0] = year10;
									break;
							case 1:   //光标在年的个位
									if ( year1 == 0 )
										year1 = 9;
									else
										year1--;
                                    df(4,Yp[1],year1,1);
									utime[1] = year1;
									break;
							case 2:   //光标在月的十位
									if ( month10 == 0 )        //月_十位=0,1
										month10 = 1;
									else
										month10--;

									df(4,Yp[2],month10,1);
									utime[2] = month10;
									break;
							case 3:    //光标在月的个位
									if ( month1 == 0 )
										month1 = 9;
									else
										month1--;
									df(4,Yp[3],month1,1);
									utime[3] = month1;
									break;
							case 4:  //光标在日的十位
									if ( day10 == 0 )   //日_十位=0,1,2,3
										day10 = 3;
									else
										day10--;

									df(4,Yp[4],day10,1);
									utime[4] = day10;
									break;
							case 5:    //光标在日的个位
									if ( day1 == 0 )
										day1 = 9;
									else
										day1--;
									df(4,Yp[5],day1,1);
									utime[5] = day1;
									break;
							case 6:    //光标在时的十位
									if ( hour10 == 0 )    //时_十位=0,1,2
										hour10 = 2;
									else
										hour10--;

									df(4,Yp[6],hour10,1);
									utime[6] = hour10;
									break;
							case 7:    //光标在时的个位
									if ( hour1 == 0 )
										hour1 = 9;
									else
										hour1--;

									df(4,Yp[7],hour1,1);
									utime[7] = hour1;
									break;
							case 8:   //光标在分的十位
									if ( minute10 == 0 )   //分_十位=0,1,2,3,4,5
										minute10 = 5;
									else
										minute10--;

									df(4,Yp[8],minute10,1);
									utime[8] = minute10;
									break;
							case 9:    //光标在分的个位
									if ( minute1 == 0 )
										minute1 = 9;
									else
										minute1--;

									df(4,Yp[9],minute1,1);
									utime[9] = minute1;
									break;
						}
						break;

			case 3 :      //右移键
						if ( KeyPosition == 9)    //光标停留在分的个位
						{
							df(4,Yp[KeyPosition],utime[KeyPosition],0);  //将该位数字正显
							KeyPosition		=	0;   //该值复0,即将光标移到首位(年之十位)
							df(4,Yp[KeyPosition],utime[KeyPosition],1);//将首位数字反显
							break ;
						}
						else
							df(4,Yp[KeyPosition],utime[KeyPosition],0);  //将该位数字正显
						    KeyPosition++;
                            df(4,Yp[KeyPosition],utime[KeyPosition],1);  //将该位数字反显
                            break;
			case  4:	Time_Dispose_Set();    //返回键,确认已设置的时间,并返回主菜单
				        lcd_init();
				        program_1();     //返回主菜单
			            return;
		}
	}
}

//主菜单下按确定键处理程序
void program_7()
{
	switch(KeyCount)
	       {
        case 0: test(); break;//启动进入测试程序
        case 1: history(); break;//进入历史查询
        case 2:
				Dis_settime();  //进入时钟设置
				time_mod();      //修改时间函数
				break;
	       }

}

//主菜单读取键值1(上)、2(下)、7(确定键)
void key_chuli_1(uchar key)   //按键处理1,键值为3、4、5、6均不起作用
{
  switch(key)
         {
			 case 1: 	if( KeyCount > 0 )
							KeyCount--;
						else
							KeyCount = 2;
						program_1();   break;         //光标上移
			 case 2: if( KeyCount < 2 )
							KeyCount++;
						else
							KeyCount = 0;
						program_1();
						break;                            //光标下移
			 case 7:program_7();   break;          //确定
         }
}


//2543AD控制模块
//2543控制引脚宏定义
sbit   	AD_CLOCK	=	P1^1;   /*2543时钟*/
sbit  	AD_D_IN		=	P1^2;   /*2543输入*/
sbit  	AD_D_OUT	=	P1^3;   /*2543输出*/
sbit   	AD_CS		=	P1^4;   /*2543片选*/
//功能:延时模块    输入参数:n要延时的周期数

void   delayy(uchar   n)
{
  uchar   i;
  for(i=0;i<n;i++)
  {
		_nop_();
  }
}

/**************************************
      名称:read2543
      功能:TLC2543驱动模块
      输入参数:port通道号
      输出参数:ad转换值
 *************************************/
uint   read2543(uchar  port)
{
	uint ad=0,i;
	AD_CS = 1;
	AD_CS = 0;
	AD_CLOCK=0;
	port<<=4;
	for(i=0;i<12;i++)
	{
		if(AD_D_OUT) ad|=0x01;
  		AD_D_IN=(bit)(port&0x80);
  		AD_CLOCK=1;
  		delayy(3);
  		AD_CLOCK=0;
  		delayy(3);
  		port<<=1;
		ad<<=1;
  	}
	AD_CS=1;
	ad>>=1;
	return(ad);
}

//TLC5615 D/A 程序段
sbit DA_CS  = P1^7 ;
sbit DA_CLK = P1^6;
sbit DA_DIN = P1^5;
void tlc5615(uint daTmp)//tlc5615送数程序
{
	uchar i;

	DA_CLK=0;//时钟低
	DA_CS=0;//片选有效
	for (i=0;i<12;i++)
   {
    	if((daTmp&0x800)==0)//屏蔽低11位:00001000,00000000b
    		DA_DIN=0;
    	else
			DA_DIN=1;
		DA_CLK=1;//时钟高
    	daTmp=daTmp<<1;//左移一位
    	DA_CLK=0;//时钟低
    }
	DA_CS=1;
}


//外部中断0处理程序
void Int0_Interrupt_Dispose() 	interrupt 0
{
	lcd_init();
	dh(4,60,44,0);
	dh(4,76,45,0);
	dh(4,92,46,0);
	dh(4,108,47,0);
	df(4,124,32,0);
	while(1);
}


//外部中断1处理程序
sbit u75	=	P3^4;
uchar	ucDianya =0,ucDianliu=0;
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;
	Tmpbuf[0]	=	mod_100(&uctmp);
	Tmpbuf[1]	=	mod_10(&uctmp);
	Tmpbuf[2]	=	uctmp;

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

}
void Shipin_UI_dispose()        //处理电流电压读数 显示
{
	ucDianya	=	(uchar)(read2543(0) * 0.00732);
	div_u_shuzi(ucDianya);
	ucDianliu	=	(uchar)(read2543(0) * 0.244);
	div_i_shuzi(ucDianliu);

}
void Int1_Interrupt_Dispose() 	interrupt 2
{
	daFlag	=	1;     //da送数标志位
	u75		=	0;
	delay1ms(500);
	Shipin_UI_dispose();
	disiping();

}

//定时器0中断  实时显示时间  电池电量监测
void Time0_Interrupt_Dispose() 	interrupt 1
{
	uiTimeCout ++;
	if ( uiTimeCout == 5000 )
	{
		time();
		battery();
		uiTimeCout = 0;
	}
}



void dierping()         //主菜单
{

		battery();        //显示电池电量
	    time();           //显示实时时间

//反白显示,测试
		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(4,52,24,0);               //历史数据
		dh(4,76,25,0);
		dh(4,100,26,0);
		dh(4,124,27,0);

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

smkey:
  do                             //等待有键被按下
     {key=namekey();}
     while(!key);      //key=0,表示无键按下,继续扫描键盘
     key_chuli_1(key);           //有键被按下,转键盘处理1

     goto smkey;

}

void main()
 {
	uchar key = 0;
	uint uiTimeCout = 0;
/*
	EA  	= 	1;
	ET0 	= 	1;
	EX0		=	1;
	EX1		=	1;
	TMOD	=	0x02;
	TCON 	=	0x0F;
	TH0		=	0x47;
	TL0		=	0x47;
	TR0		=	1;
*/

 	lcd_init() ; //液晶屏初始化,清屏
   // Time_Dispose_Read();

 	diyiping();   //产品信息显示
  do                              //等待确定键被按下
 	{key=namekey();}
 	while(key!=7);

	lcd_init() ; //清屏
    dierping();   //主菜单


       while(1);
}

⌨️ 快捷键说明

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