📄 weight.c
字号:
////////////////////////////////////////////////////////////////////////////////////////////
//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 + -