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

📄 main.c

📁 此为一个详细的程序源代码 由单片机PIC16F873检测电平
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "U873.H"
#include "LCD.H"
#include "Dis.h"
#include "define.h"

void Show_Warn();
void Show_Liangcheng();
void Show_Time();		
void INI()
{	
	INTCON = 0;
	
	Zero = ReadEEPROM(E_Zero);
	if(Zero==0xff)
	{
		Zero = 0;
		WriteEEPROM(Zero,E_Zero);
	}
	Biaoding.Char[0] = ReadEEPROM(E_BiaodingL);
	Biaoding.Char[1] = ReadEEPROM(E_BiaodingH);
	if(Biaoding.Int ==0xffff)
	{
		Biaoding.Int = 490;			//默认1.2v	ETO:20ppm. 10ppm to warn
		WriteEEPROM(Biaoding.Char[0],E_BiaodingL);
		WriteEEPROM(Biaoding.Char[1],E_BiaodingH);
	}
	WarnPoint = ReadEEPROM(E_WarnPoint);
	
	Liangcheng = ReadEEPROM(E_Liangcheng);
	if(Liangcheng == 0xff)
		Liangcheng = 20;
	if(WarnPoint == 0xff)
		WarnPoint = (Liangcheng-Zero)>>1;	//ETO:默认10ppm
	Danwei = ReadEEPROM(E_Danwei);
	
	ShutFlag = 0;
	timeCount = 0;
	ini_time = INITime;							//
	ErrorFlag = 0;
	WarnFlag = 0;
	ADFlag = 0;
	ShowFlag=0;
	nongdu=0;
	PowerLowFlag = 0;
	MENU_Flag = 0;
	SonMenuFlag = 0;
	time_Menu_Flag=0;
	
	RBPU = 0;				//pull up on
	
	TRISB = 0B11100001;		//KeyIn, Contrl Output,YK Input.
	TRISA = 0b11011011;		//RA2,RA5 to Contrl.RA4 to test Power.AN0 for Input.
	TRISC = 0b00000000;		//Data Output.
	
	ADCON1 = 0x05;			//D-D-D-D-V-D-A-A
	
	PR2 = 199;				//TMR2
	T2CON = 0b01001101;		//8ms
	TMR2IE = 1;
	
	PEIE = 1;
	GIE = 1;	
	
	
}
void main()
{
	//char i=0;
	
	INI();
	
	DATA = 0x01;	//clear screen	
	Enable();
	DATA = 0x01;	//clear screen
	Enable();
	DATA = 0x38;	//
	Enable();
	DATA = 0x0f;	//0000 1 D C B 	D:开显示,C:显示光标,B:光标闪烁
	Enable();
	DATA = 0x06;	//00000 1 N S  N:地址指针加(1)/减(0)一 ||| S:S=1,整屏左移(N=1)/右移(N=0);S=0,屏幕不移动
	Enable();
			
	while(1)
	{
		ADi = Adresult_Vol.Int;
		if(ADi<Zero)
			ADi = Zero;
		//AD=500;		
		nongdu = Zero*10+(uint)((float)(ADi-Zero)/(float)(Biaoding.Int-Zero)*(float)Liangcheng*10.0);	//50.0 = 500
		
		ADi = Adresult_Power.Int;
		
		dianya =(uint)(Volage*1024.0/(float)ADi);		//3.7v = 370
		
		if(ini_time==0)
		{
			if(nongdu>Liangcheng*10)
			{
				if(!MENU_Flag)
					ErrorFlag = 1;
			}
			else if(nongdu>=WarnPoint*10)
			{	
				ErrorFlag = 0;
				WarnFlag = 1;
			}
			else
			{
				ErrorFlag = 0;
				WarnFlag = 0;
			}
				
			if(dianya<340)
			{
				PowerLowFlag = 1;
				if(dianya<330)
					goto xx;
			}
			else	
				PowerLowFlag = 0;
		}
		if(!Key_Menu)	
			KEYCOUNT=0;
		else
		{
			KEYCOUNT++;
			{
				if(KEYCOUNT>10)
				{
					KEYCOUNT=0;
					if(MENU_Flag)
					{
						MENU_Flag = 0;
						SonMenuFlag = 0;
						ShowFlag=0;
						UPDOWN = 0;
						Secret=0;
					}
					else		//shutdown 
					{
xx:						Ctrl_Bell_Off;
						Ctrl_Shake_Off;
						BL_LightOff;
						ShutFlag = 1;
						//TMR2IE=0;
						DATA=0x01;
						Enable();
						DATA=0x08;
						Enable();						
						while(1)
						{
							if(POWERIN)
							{
								delayI(5000);
								if(POWERIN)
								{
									DATA = 0x0f;
									Enable();
									PowerFlag=1;
								}
								else PowerFlag = 0;
							}
							else	
							{
								DATA = 0x08;
								Enable();
								PowerFlag = 0;
							}							
							
							if(Key_Menu)
							{
								delayI(50000);
								KEYCOUNT++;
							}
							else 
								KEYCOUNT=0;
							
							if(KEYCOUNT>2)
							{
								TRISB0=0;	//硬复位;
								RB0=0;
							}
								
						}
						
					}
				}
			}
			time_Return=0;
			time_Light_Count=0;
			delayI(12000);
			if(Key_Menu)
			{
				if(++ShowFlag>=5)
					ShowFlag=0;
				if(Secret==0)
					Secret=1;
				
				if(MENU_Flag)	
				{
					if(SonMenuFlag==0)
						SonMenuFlag=1;
					else
					{
						if(UPDOWN!=2)
							SonMenuFlag = 0;
						switch(UPDOWN)
						{
							case 1:
								WriteEEPROM(WarnPoint,E_WarnPoint);
								break;
							case 2:	//time	
								time_Menu_Flag++;
								if(time_Menu_Flag>6)
								{
									SonMenuFlag=0;
									time_Menu_Flag=0;
								}
								else
									SonMenuFlag=1;
								break;
							case 3:	//zeroPoint
								Zero = Adresult_Vol.Int;
								WriteEEPROM(Zero,E_Zero);
								break;
							case 4:	//biaoding	
													
								Biaoding.Int = Adresult_Vol.Int;
								if(Biaoding.Int<500)
									Biaoding.Int = 500;
								WriteEEPROM(Biaoding.Char[0],E_BiaodingL);
								WriteEEPROM(Biaoding.Char[1],E_BiaodingH);
								break;
							case 5:	//danwei
								WriteEEPROM(Danwei,E_Danwei);
								break;
							case 6:	//liangcheng
								WriteEEPROM(Liangcheng,E_Liangcheng);
								break;
								
						}
					}
				}
				
			}
		}
		if(Key_Up)
		{
			time_Return=0;
			time_Light_Count=0;
			delayI(12000);
			if(Key_Up)
			{
				if(Secret==1||Secret==3||Secret==5||Secret==6 )
					Secret++;
				else if(Secret!=9)
					Secret=0;
				if(MENU_Flag)	
				{
					if(!SonMenuFlag)
					{
						if(UPDOWN>1)
							UPDOWN--;
					}
					else	//子菜单
					{
						switch(UPDOWN)
						{
							case 1:
								if(WarnPoint<Liangcheng)
									WarnPoint++;
								break;
							case 2:	//time
									if(time_Menu_Flag==1)
									{
										Time_Year++;
									}
									else if(time_Menu_Flag==2)
									{
										Time_Month++;
										if(Time_Month>12)
											Time_Month=1;
									}
									else if(time_Menu_Flag==3)
									{
										Time_Day++;
										if(Time_Month==1||Time_Month==3||Time_Month==5||Time_Month==7||Time_Month==8||Time_Month==10||Time_Month==12)
										{
											if(Time_Day>31)
												Time_Day=1;
										}
										else if(Time_Month==4||Time_Month==6||Time_Month==9||Time_Month==11)
										{
											if(Time_Day>30)
												Time_Day=1;
										}
										else if(Time_Month==2)
										{	
											if(Time_Year%400==0||(Time_Year%4==0&&Time_Year%100!=0))
											{
												if(Time_Day>29)
													Time_Day=1;											
											}
											else
											{
												if(Time_Day>28)
													Time_Day=1;
											}
										}
										
										
									}
									else if(time_Menu_Flag==4)
									{
										Time_Hour++;
										if(Time_Hour>=24)
											Time_Hour=0;
									}
									else if(time_Menu_Flag==5)
									{
										Time_Min++;
										if(Time_Min>=60)
											Time_Min=0;
									}
									else if(time_Menu_Flag==6)
									{
										Time_Second++;
										if(Time_Second>=60)
											Time_Second=0;
									}
								break;
							
							case 5:	//danwei
								if(Danwei==DW_LEL)
									Danwei=DW_PPM;
								else if(Danwei==DW_PPM)
									Danwei=DW_VOL;
								else
									Danwei = DW_LEL;
								
								break;
							case 6:	//liangcheng
								Liangcheng++;
								break;
							default:
								break;	
						}
					}
				}
			}
		}
		if(Key_Down)
		{
			time_Return=0;
			time_Light_Count=0;
			delayI(12000);
			
			if(Key_Down)
			{
				if(Secret==2||Secret==4||Secret==7||Secret==8)
					Secret++;
				else if(Secret==9)	//进入菜单设置
				{
					MENU_Flag = 1;
					ErrorFlag = 0;
				}
				else Secret=0;
				
					if(MENU_Flag)	
				{
					if(!SonMenuFlag)
					{
						if(UPDOWN<6)
							UPDOWN++;
					}
					else	//子菜单
					{
						switch(UPDOWN)
						{
							case 1:
								if(WarnPoint>Zero)
									WarnPoint--;
								break;
							case 2:	//time	
								if(time_Menu_Flag==1)
								{
									Time_Year--;
									if(Time_Year<8)
										Time_Year=8;
								}
								else if(time_Menu_Flag==2)
								{
									Time_Month--;
									if(Time_Month==0)
										Time_Month=12;
								}
								else if(time_Menu_Flag==3)
								{
									Time_Day--;
									if(Time_Day==0)
									{
										if(Time_Month==1||Time_Month==3||Time_Month==5||Time_Month==7||Time_Month==8||Time_Month==10||Time_Month==12)
										{
												Time_Day=31;
										}
										else if(Time_Month==4||Time_Month==6||Time_Month==9||Time_Month==11)
										{
												Time_Day=30;
										}
										else if(Time_Month==2)
										{	
											if(Time_Year%400==0||(Time_Year%4==0&&Time_Year%100!=0))
											{
													Time_Day=29;											
											}
											else
											{
													Time_Day=28;
											}
										}
									}
								}
								if(time_Menu_Flag==4)
								{
										if(Time_Hour>0)
											Time_Hour--;
										else
											Time_Hour=23;
								}
								else if(time_Menu_Flag==5)
								{
										if(Time_Min>0)
											Time_Min--;
										else
											Time_Min=59;
								}
								else if(time_Menu_Flag==6)
								{		
										if(Time_Second>0)
											Time_Second--;
										else
											Time_Second=59;
								}
								break;
							case 5:	//danwei
								if(Danwei==DW_LEL)
									Danwei=DW_VOL;
								else if(Danwei==DW_VOL)
									Danwei=DW_PPM;
								else
									Danwei = DW_LEL;
								
								break;
							case 6:	//liangcheng
								if(Liangcheng>Zero)
									Liangcheng--;
								break;
							default:
								break;
								
						}
					}
				}
			
			}
		}
		if(POWERIN)
		{
			delayI(5000);
			if(POWERIN)
			{
				PowerFlag=1;
			}
			else PowerFlag = 0;
		}
		else	PowerFlag = 0;
	}
}

void interrupt INT()
{
	uchar i;
	if(TMR2IF)
	{
		TMR2IF = 0;
		
		if(ShutFlag)
		{
			if(++timeCount>=125)
			{
				timeCount=0;
				if(++Time_Second>=60)
				{
					Time_Second=0;
					if(++Time_Min>=60)
					{
						Time_Min = 0;
						if(++Time_Hour>=24)
							Time_Hour=0;
					}
				}
				if(PowerFlag)
					if(++PowerInCount>=5)
						PowerInCount=0;
			}
			if(PowerFlag)
			{
					DATA = 0x01;
					Enable();
					DATA = Addr_LCD_Top;
					Enable();
					for(i=0;i<8;i++)
					{
						WriteLCD(TOP_PowerInput[i]);
					}
					
					DATA = Addr_LCD_Bottom+2;
					Enable();
					for(i=0;i<PowerInCount;i++)
						WriteLCD('.');
					DATA = Addr_LCD_Bottom+8;
					Enable();
			}
			else
			{
				DATA = 0x01;
				Enable();
			}
		}
		else
		{
			if(++timeCount>=125)			//处理显示
			{
				timeCount = 0;
				if(ini_time!=0)				//初始化过程计数显示
				{	
					ini_time--;		
					ShowFlag=0;	
					DATA = Addr_LCD_Top;	//
					Enable();	
					for(i=0;i<8;i++)
					{
						Top[i] = TOP_INIT[i];
						WriteLCD(Top[i]);
					}
					for(i=0;i<8;i++)			
						Bottom[i]=' ';
					Bottom[3]=0x30+ini_time/10;
					Bottom[4]=0x30+ini_time%10;
						
					DATA = Addr_LCD_Bottom;

⌨️ 快捷键说明

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