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

📄 weight.c

📁 一个称重的单片机程序
💻 C
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////////////////////////
//FileName:		WeightSensor.c
//Function:		Get Data From AD, then filter the Data, last to display the Data.
//Version:      1.0V
//CopyRight:	Jtshi
//ModifyTime:	2004.10.6
////////////////////////////////////////////////////////////////////////////////////////////
#include <reg52.h>
#include <math.h>
#include <stdio.h>

//data type redefine
#ifndef WORD
#define WORD unsigned int
#endif

#ifndef BYTE
#define BYTE unsigned char
#endif

#ifndef DWORD
#define DWORD unsigned long
#endif

// X5045 related constant
#define WREN  		0x06
#define WRDI  		0x04
#define RSDR  		0x05
#define WRSR  		0x01
#define READ  		0x03
#define WRITE  		0x02
#define STATUS_REG 	0x00
#define MAX_POLL   	0x99

//AD data filter
#define SLIDE_LENGTH  4
#define SHIFT_LIMITS  1

//0~9 display code
BYTE  g7SegCode[11]    	= {0x03, 0x9F, 0x25, 0x0D, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09, 0xFF}; 
BYTE  g7SegCodeDot[11]	= {0x02, 0x9E, 0x24, 0x0C, 0x98, 0x48, 0x40, 0x1E, 0x00, 0x08, 0xFE};

//AD7703 FootPrint Define
sbit AD_CS   = P1^6;
sbit AD_DRDY = P3^2;
sbit AD_SCLK = P1^5;
sbit AD_DOUT = P1^4;
sbit AD_CAL  = P1^7;

//watch dog
sbit WD_CS   = P1^1;    //x5045
sbit WD_SO   = P1^0;
sbit WD_SCK  = P1^2;
sbit WD_SI   = P1^3;

//other control
sbit K_ON    = P0^0;    //key switch
sbit K_SHIFT = P0^1;
sbit K_DISP  = P0^2;
sbit K_ENTER = P0^2;
sbit K_SET   = P0^3;
sbit K_ADD   = P0^4;
sbit K_CLEAR = P0^4;
sbit L_WE    = P2^6;
sbit L_CY    = P0^7;
sbit L_CN    = P2^7;
sbit L_UP    = P2^5;
sbit L_DO    = P0^6;
sbit L_ON    = P2^3;
sbit SSR     = P2^2;    //MOTOR
sbit I1      = P2^0;    //GUANG DIAN=0 VALID
sbit MATU    = P2^4;    //UP MATION
sbit MATD    = P2^1;    //DOWN MATION
sbit OUT     = P0^5;
sbit IN      = P3^3;

//Global Variables
WORD   uiADTmp      = 0;			//AD convert temp data
WORD   uiNumIndex   = 0;			//Index Ad data
WORD   uiShtIndex   = 0;			//Index Shift
WORD   uiADRefShift[SLIDE_LENGTH];  //Shift filter
DWORD  ulShtTotal   = 0;			//AD convert Total Data
DWORD  ulADTotal    = 0;			//AD convert Total Data

//other Variables declearition
BYTE ucBlinkBit = 0;	//mark the blink bit
BYTE ucDotBit   = 1;	//mark the dot bit 
WORD uiDataTmp;		//data temp for adjust
BYTE ucDataindex = 0;	//index different data parameter[0: high; 1: low; 2: coeff]
BYTE ucDetectindex = 0;//index different detect parameter[0: high time; 1: high span; 2: low time; 3: low span; 4: Zero scope; 5: check scope; 6: stable scope]

//Parameter Variables(save to X5045)
WORD uiDataHighLimit;	//data high limits for error
WORD uiDataLowLimit;	//data Low  limits for error
WORD uiDataCoeff;		//data coefficent
BYTE ucDetectHighTime;	//the time high limit to detect
BYTE ucDetectHighSpan;	//the span high limit to detect
BYTE ucDetectLowTime;	//the time low limit to detect
BYTE ucDetectLowSpan;	//the spans low limit to detect
BYTE ucZeroScope;		//the Zero  scope
BYTE ucCheckScope;		//the check  scope
BYTE ucStableScope;		//the stable  scope
WORD uiDetectTmp;		//temp for detect parameters
WORD uiValidVal;		//
WORD uiInvalidVal;		//
WORD uiRatioValL;		//Ratio Low value
WORD uiRatioValH;		//Ratio High value
WORD uiRatioPreDef[7] 	= {200, 500, 1000, 2000, 3000, 4000, 5000};	//
WORD uiADZeroRef   	    = 0;	//Ad zero reference, to make real value
WORD uiADRef   		    = 0;	//Reference value, which is display
BYTE ucRatioPreDefIndex = 0;
WORD uiRatioVal 	= 500;	//

//Flag Variables
//bit bInModify = 0;			//System is in modify state[0: not in modify state; 1: in modify state]

//Other functions
void StartAD(void);        					//Init AD
//void InitClk0(void);				//Init Timer0
void DelayMsec(WORD timeMsec);   	//Delay times msec

//display functions:
void DisplayByte(BYTE Alpha);				//display a unsigned char
void DisplayAlpha(BYTE index);				//display five unsigned char, one time
void DisplayData(WORD uiRef, BYTE ucPosDot, BYTE ucPosBlink);	//Display data to 7 Segment tube
void DisplayDataEx(BYTE index, BYTE ucRef, BYTE ucPosDot, BYTE ucPosBlink);

//key capture and managment functions
void KeyValueSet();		//use key to set values 
void KeyParamSet();		//use key to set parameters
void KeyZeroMarkSet();	//use key to clear and mark

//key sub-sfunction
void KeySetA(WORD* value, BYTE bitNum, BYTE dotBit);
void KeySetB(BYTE *value, BYTE bitNum, BYTE index, BYTE dotNum);
void KeyAddA(WORD *value);
void KeyAddB(BYTE *value);
void KeyShift(BYTE bitNum);

//parameters read and write functions
//parameter address:
//
void ParamsSaveWord(WORD address, WORD value);
void ParamsLoadWord(WORD address, WORD *value);
void ParamsLoadALL();//

//watch dog functions
void x5045_initial();
void x5045_rst_wdog();
void x5045_wren_cmd();
void x5045_page_read(WORD address, BYTE *p, BYTE number);
void x5045_page_write(WORD address, BYTE *p, BYTE number);

//////////////main program
void main(void)
{	
	//INIT AD7703
	AD_CS = 1;             
    AD_SCLK=0;
    AD_DOUT=1;
    AD_CAL=0 ;
    //INIT X25045
    x5045_initial();

    //disable all intss
	EA  = 0;  		
	//Load all Parameters
	ParamsLoadALL();

	//////////////////////////////////////////interrupt
	///////int0
	PX0 = 1;       	//Enable Int0 high proprity 
	IT0 = 1;		//edge trig
	EX0 = 1;        //Int0 enable

	///////Timer0
	//TMOD = 0x01;	//timer0, mod = 1 
	//InitClk0();	   //Initial clock0	
	//ET0 = 1;	   	//Timer0 enable	
	//EA  = 1;       	//All Int enable
    
	//Variables initial 
	uiADRefShift[0] = 0;
	uiADRefShift[1] = 0;
	uiADRefShift[2] = 0;
	uiADRefShift[3] = 0;

    //Init AD
    StartAD();
	DelayMsec(1000); 
	uiADZeroRef = uiADRef;	
    // loop forever .......
    while(1)  
    {
    	//use key to set value    	
    	KeyValueSet();    
  		
    	//if in run state, then inbit Shift key and Clear mark Key 
    	if(L_ON == 1)
    	{
    		//use key to set parameters
 	    	KeyParamSet();
	    	//use key to clear and mark	
			KeyZeroMarkSet();
		}
        //compute the value
        /////////////////////////////////////////
        if(uiNumIndex >= 50)
        {
            EX0 = 0;
             //shift filter
    		if(uiShtIndex >= SLIDE_LENGTH)
    			uiShtIndex = 0;
    		ulShtTotal -= uiADRefShift[uiShtIndex];
    		uiADRefShift[uiShtIndex] = ulADTotal/uiNumIndex;
    		ulShtTotal += uiADRefShift[uiShtIndex];	
    		uiADTmp = ulShtTotal/SLIDE_LENGTH;	
    		if(abs(uiADTmp - uiADRef) > SHIFT_LIMITS)
    			uiADRef = uiADTmp;
            //Display
    		uiADRef = uiRatioPreDef[ucRatioPreDefIndex]*(uiADZeroRef - uiADRef)/uiRatioVal;
    		DisplayData(uiADRef, 0, 6);
    		uiNumIndex 		= 0;
    		ulADTotal		= 0;
    		uiShtIndex++;	
            EX0 = 1;
        }
        else
            DelayMsec(300);

    }
}

//////////////////////////////////
//initial the timer0: 50ms
//////////////////////////////////
/*void InitClk0(void) 
{
	TR0 = 0;
	TH0 = 0x3C;
	TL0 = 0xAF;
	TR0 = 1;
}*/

////////////////////////////////////
//Set AD CS high 
////////////////////////////////////
void StartAD(void)         //Init AD
{
    AD_CS = 1;             //INIT AD7703
    AD_CAL=1;
    DelayMsec(30);         //AD7703 Self_Calibration
    AD_CAL=0;               //Then Waite For 1.5S
}

/////////////////////////////////////
//use key to set values
/////////////////////////////////////
void KeyValueSet()
{
	if(K_SET == 0) //Key set is low
	{
		DelayMsec(30);
		if(K_SET == 0)	//make sure the Key set is low
		{
            EA  = 0;    //disable interrupt
			//set data high limit
			DisplayData(uiDataHighLimit, 1, 6);
			//indicator high limit led on
			L_UP = 0;
			KeySetA(&uiDataHighLimit, 1, 1); 
			ParamsSaveWord(0, uiDataHighLimit);
			L_UP = 1;
			
			//set data low limit
			DisplayData(uiDataLowLimit, 1, 6);
			//indicator low limit led on
			L_DO = 0;
			KeySetA(&uiDataLowLimit, 1, 1);
			ParamsSaveWord(2, uiDataLowLimit);
			L_DO = 1;
			
			//set data coeffient 
			DisplayData(uiDataCoeff, 1, 6);
			//indicator coeff led on
			L_UP = 0;
			L_DO = 0;
			KeySetA(&uiDataCoeff, 0, 1);
			ParamsSaveWord(4, uiDataCoeff);
			L_UP = 1;
			L_DO = 1;
            EA  = 1;    //enable interrupt
		}	
	}			
}

/////////////////////////////////////
//use key to set parameters
////////////////////////////////////
void KeyParamSet()
{
	BYTE i;
	if(K_SHIFT == 0) //key shift is low
	{
		for(i = 0; i < 30; i ++) //Shift Key push down must 3 second or more.
		{
			DelayMsec(100);
			if(K_SHIFT == 1) //key shift is low
				return;
		}
		DisplayAlpha(1);	//display "C_PAR"
		DelayMsec(1000);
		while(1)
		{
			DelayMsec(60);
			if(K_SHIFT == 1)
			{
				DelayMsec(30);
				if(K_SHIFT == 1)	// make sure the Key shift is high
				{
					DisplayDataEx(1, ucDetectHighTime, 0, 6);	
					KeySetB(&ucDetectHighTime, 0, 1, 3);
	                x5045_wren_cmd();
					x5045_page_write(7, &ucDetectHighTime, 1);
				
					DisplayDataEx(2, ucDetectHighSpan, 0, 6);
					KeySetB(&ucDetectHighSpan, 0, 2, 3);
                    x5045_wren_cmd();
					x5045_page_write(8, &ucDetectHighSpan, 1);
		
					DisplayDataEx(3, ucDetectLowTime, 0, 6);
					KeySetB(&ucDetectLowTime, 0, 3, 3);
                    x5045_wren_cmd();
					x5045_page_write(9, &ucDetectLowTime, 1);
					
					DisplayDataEx(4, ucDetectLowSpan, 0, 6);
					KeySetB(&ucDetectLowSpan, 0, 4, 3);
                    x5045_wren_cmd();
					x5045_page_write(10, &ucDetectLowSpan, 1);
					
					DisplayDataEx(5, ucZeroScope, 0, 6);
					KeySetB(&ucZeroScope, 0, 5, 2);
                    x5045_wren_cmd();
					x5045_page_write(11, &ucZeroScope, 1);
					
					DisplayDataEx(6, ucCheckScope, 0, 6);
					KeySetB(&ucCheckScope, 0, 6, 6);
                    x5045_wren_cmd();
					x5045_page_write(12, &ucCheckScope, 1);
					
					DisplayDataEx(7, ucStableScope, 0, 6);
					KeySetB(&ucStableScope, 2, 7, 6);
                    x5045_wren_cmd();
					x5045_page_write(13, &ucStableScope, 1);
					///////////////////////////////////////
					break;
				}
			}
		}				
	}
}

/////////////////////////////////////
//use key to clear and mark
//////////////////////////////////////
void KeyZeroMarkSet()
{
	BYTE i;
	ucRatioPreDefIndex = 1;
	//////////////////////////////////////////////////////////KEY CLEAR(key ADD)
	if(K_CLEAR == 0) //key shift is low
	{
		DelayMsec(30);
		if(K_CLEAR == 0) //make sure key clear is low
		{
			for(i = 0; i < 20; i ++) //6s 
			{
				DelayMsec(300);
				if(K_CLEAR == 1) 	//key shift is low
				{
					DelayMsec(30);
					if(K_CLEAR == 1)//make sure key shift is low
					{
						//clear to zero
						if(L_CY == 0) 		//clear valid value
						{
							uiValidVal = 0;	
							DisplayData(uiValidVal, 6, 6);	
						}
						else if(L_CN == 0) //clear invalid value
						{
							uiInvalidVal = 0;
							DisplayData(uiInvalidVal, 6, 6);
						}
						else if(L_ON == 1) //clear AD value
						{
							uiADZeroRef = uiADRef;
							DisplayData(0, 2, 6);	
						}
						else if(L_ON == 0)	//						
							DisplayData(0, 2, 6);
						//if clear key up, break;
						return;
					}																	
				}
			}
			/////////////////////////////////////////////
			while(1)	//must be set mode
			{
				DelayMsec(60);
				if(K_CLEAR == 0) //key shift is low
				{
					DelayMsec(30);
					if(K_CLEAR == 0)//make sure key shift is low
					{
						if(L_ON == 1) //to mark state
						{
							DisplayAlpha(2); //display " SET "
							DelayMsec(500);
							while(1)	//
							{
								DelayMsec(60);
								if(K_CLEAR == 1) //key shift is high
								{
									DelayMsec(30);
									if(K_CLEAR == 1) //make sure key shift is high
									{
										while(1) //Set mark value
										{
											DelayMsec(60);											
											//////////////////////////////
											DisplayData(uiRatioPreDef[ucRatioPreDefIndex], ucDotBit, 6);		
											if(K_ADD == 0) //
											{
												DelayMsec(30);
												if(K_ADD == 0) //make sure key ADD is low
												{
													ucRatioPreDefIndex ++;
													if(ucRatioPreDefIndex > 6)
														ucRatioPreDefIndex = 0;
													DelayMsec(300);										
												}
											}
											if(K_ENTER == 0) //key enter is low
											{
												DelayMsec(30);
												if(K_ENTER == 0) //make sure key enter is low
												{
													DelayMsec(200);
													uiRatioValL = uiADRef;
													DisplayAlpha(3);	//display "LOAD "
													DelayMsec(500);
													while(1)
													{
														DelayMsec(60);
														if(K_ENTER == 0) //make sure key enter is high
														{
															DelayMsec(30);
															if(K_ENTER == 0) //make sure key enter is low
															{
																DelayMsec(1000);
																uiRatioValH = uiADRef;
																uiRatioVal = uiRatioValL - uiRatioValH;
																//save: rati
																ParamsSaveWord(14, uiRatioValL);	//Ratio Low value
																ParamsSaveWord(16, uiRatioValH);	//Ratio High value
                                                                x5045_wren_cmd();
					                                            x5045_page_write(18, &ucRatioPreDefIndex, 1);
															}
														}
														if(K_ENTER == 1) //make sure key enter is high
														{
															DelayMsec(30);
															if(K_ENTER == 1) //make sure key enter is low
															{
																return ;
															}
														}
													}
												}
											}															
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
}
			
//key sub-sfunction
///////////////////////////////////////
//Value key set
//////////////////////////////////////
void KeySetA(WORD* value, BYTE bitNum, BYTE dotBit)
{
	while(1)	//must set value
	{
		DelayMsec(60);
		if(K_SET == 1)	//the Key set is high 
		{
			DelayMsec(30);
			if(K_SET == 1)		//make sure the Key set is high 
			{				
				//blink display
				ucBlinkBit = 0;
				//query other key [ADD, SHIFT, SET]		
				while(1)	
				{
					DelayMsec(200);
					DisplayData(*value, dotBit, ucBlinkBit);	//data blink dark
					DelayMsec(250);
					DisplayData(*value, dotBit, 6);				//data blink bright
					// Add key
					if(K_ADD == 0)	//Add Key is Low
					{
						DelayMsec(30);
						if(K_ADD == 0)	//make sure Add Key is Low
						{	
							KeyAddA(value);
							DisplayData(*value, dotBit, 6);			//data blink bright
						}
					}			
					// Shift key
					if(K_SHIFT == 0)	//shift Key is Low
					{
						DelayMsec(30);
						if(K_SHIFT == 0)	//make sure shift Key is Low
						{
							KeyShift(bitNum);
							///////////////////////////	
							DisplayData(*value, dotBit, 6);	//data blink dark
							//wait for shift up
							while(1)
							{
								DelayMsec(60);																
								if(K_SHIFT == 1)
								{
									DelayMsec(30);
									if(K_SHIFT == 1)
										break;
								}								
							}
						}
					}
					// Set key				
					if(K_SET == 0)	//Key set is low(jump out)
					{
						DelayMsec(30);
						if(K_SET == 0)
						{	
							while(1)	//wait for Key set high
							{
								DelayMsec(60);	
								if(K_SET == 1)
								{
									DelayMsec(30);
									if(K_SET == 1)			
										return;
								}
							}
						}
					}				
				}
			}
		}
	}	
}

///////////////////////////////
//Parameters Key set
///////////////////////////////
void KeySetB(BYTE *value, BYTE bitNum, BYTE index, BYTE dotNum)
{
	ucBlinkBit = 1;
	while(1)
	{

⌨️ 快捷键说明

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