📄 main0.c
字号:
//------------------------------------------------------------------------------------
// Blinky.c
//------------------------------------------------------------------------------------
// Copyright (C) 2004 Silicon Laboratories, Inc.
//
// AUTH: BD
// DATE: 26 SEP 2002
//
// This program flashes a LED on the C8051F060 target board about five times
// a second using the interrupt handler for Timer3.
// The LED should be connected to P1.6
// Target: C8051F06x
//
// Tool chain: KEIL Eval 'c'
//-------------------------
//---------------------------------downlink-------------------------------------------
unsigned int ad_dat;
unsigned char x0;
float ad_dat0;
float jx0;
signed int xdata temp0 _at_ 0x0840;
float temp;
signed int jx;
//------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
#define deltap1 4000
#define deltap0 7
#define zero_0 105
#define pzero4 707 //通道4压力传感器零点(量化台阶数)
#define kp4 447 //通道4压力传感器斜率(量化台阶数/MPa)
#define pzero7 -10 //通道7压力传感器零点(量化台阶数)
#define kp7 0 //通道7压力传感器斜率(量化台阶数/MPa)
#define mintime 10
#define maxtime 75
#define open_time 30
#define close_time 40
//------------------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------------------
#include <c8051f060.h> // SFR declarations
#include <intrins.h>
#include "func.h"
#include <MATH.h>
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F06x
//-----------------------------------------------------------------------------
#define XBYTE ((unsigned char volatile xdata*) 0)
sfr16 RCAP3 = 0xCA; // Timer3 reload value
sfr16 TMR3 = 0xCC; // Timer3 counter
sfr16 ADC0 = 0xBE; // ADC0 Data
//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------
#define SYSCLK 24000000//22118400 // approximate SYSCLK frequency in Hz
#define SAMP_RATE 50 // ADC sample rate in Hz
#define BAUDRATE 115200
#define kwyzk 663.18 //zk板位移传感器斜率
#define bwyzk -452.444 //zk板位移传感器截距
#define kwytd 680.09 //cx板位移传感器斜率
#define bwytd 603.45 //cx板位移传感器截距
#define kwycx 683.82 //td板位移传感器斜率
#define bwycx 673.38 //td板位移传感器截距
//------------------------------------------------------------------------------------
// Function PROTOTYPES
//------------------------------------------------------------------------------------
//unsigned int Ram_ID(void);
void PORT_Init (void);
void external_osc (void);
void UART0_Init (void);
//void UART1_Init (void);
void Delay(unsigned char times);
void Delay1(void);
unsigned int AD_Complete (void);
void Ram_Erase(unsigned char Ram_Addr5,unsigned char Ram_Addr4,unsigned char Ram_Addr3); //Ram_Addr5与Ram_Addr2:00h-07h,
void Ram_Rd(unsigned char Ram_Addr5,unsigned char Ram_Addr4,unsigned char Ram_Addr3,unsigned char Ram_Addr2,
unsigned char Ram_Addr1,unsigned int Ram_buf,unsigned int data_sum);//怎么校验ECC?
void Ram_Program(unsigned char Ram_Addr5,unsigned char Ram_Addr4,unsigned char Ram_Addr3,unsigned int Ram_buf,unsigned int data_sum);//,unsigned int Ram_buf);
//void Ram_Erase(unsigned char Ram_Addr_h,unsigned char Ram_Addr_m);
//void Ram_Rd(unsigned char Ram_Addr_h,unsigned char Ram_Addr_m,unsigned char Ram_Addr_l,
// unsigned char Area,unsigned int Ram_buf,unsigned int data_sum);
//void Ram_Program(unsigned char Ram_Addr_h,unsigned char Ram_Addr_m,unsigned int Ram_buf);
//------------------------------------------------------------------------------------
// System Initialize Function
//------------------------------------------------------------------------------------
//unsigned char bv;
unsigned int addr;
unsigned char page_5,page_4,page_3,duan;
unsigned int xdata vx0 _at_ 0x0322;
unsigned int para_addr,inx0=0,inx1=0,iny1,Dly_Time,Delay_Time,Delay_Time0;
unsigned int xdata Dly_Time0 _at_ 0x0320;
bit one_second,ten_ms,open_close=1,mode_3;
unsigned int time_counter;
bit state_val,sam_state,time_1s;
unsigned char xdata time_s _at_ 0x0ffc;
unsigned char xdata time_m _at_ 0x0ffd;
unsigned char xdata time_h _at_ 0x0ffe;
unsigned char xdata time_d _at_ 0x0fff;
unsigned int xdata test[1024] _at_ 0x0000;
unsigned int xdata test1[31] _at_ 0x0e00;
unsigned int xdata para _at_ 0x0f00;
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
void clr_mem(void);
void rece_para(void);
void trans_para(void);
void set_start(void);
void trans_page(void);
//void trans_byte(void);
//void test_online(void);
void reset(void);
void clr_comd(void);
//void mem(void);
void samp_mem(void);
void end_proc(void);
void Timer3_Init (int counts);
void ADC0_Init (void);
unsigned char code fa[7]={1,0,1,0,1,0,1};
unsigned int xdata ml[7] _at_ 0x0700;
unsigned int code dcommand[14][7]={
{45,30,30,30,30,30,45},
{45,30,30,30,60,30,45},
{45,30,30,30,90,30,45},
{45,30,30,30,120,30,45},
{45,30,30,30,150,30,45},
{45,30,30,30,180,30,45},
{45,30,30,30,210,30,45},
{45,30,30,30,240,30,45},
{45,30,30,30,270,30,45},
{45,30,30,30,300,30,45},
{45,30,30,30,330,30,45},
{45,30,30,30,360,30,45},
{45,30,30,30,390,30,45},
{45,30,30,30,420,30,45}};
//------------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
void main (void) {
unsigned char x0;
unsigned int i;
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
PORT_Init ();
external_osc (); // initialize oscillator
UART0_Init();
ADC0_Init (); // configure ADC0 and ADC1 for differential
EA = 1; // enable global interrupts
ES0=1;
PS=1;
SFRPAGE = 0x0f; // Switch to configuration page
PWD=1;
txshdn=1;
val1=1;
val2=1;
//trans_para();
time_s=0;
time_m=0;
time_h=0;
time_1s=0;
/* for(i=0;i<1024;i++){test[i]=0xffff;}
Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0000,2048);
Ram_Erase(0x03,0xff,0x00);
Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0000,2048);
for(i=0;i<1024;i++){test[i]=i;}
Ram_Program(0x03,0xff,0x00,0x0000,2048);
Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0000,2048);
*/
do{Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0e00,512);
x0=XBYTE[0x0efe];}
while(x0!=0xaa);
do{Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0e00,512);
x0=XBYTE[0x0eff];}
while(x0!=0x55);
duan=0;
if(para>0&¶<15)
{for(x0=0;x0<7;x0++){ml[x0]=dcommand[para-1][x0];}}
SFRPAGE = 0x0f; // Switch to configuration page
PWD=0;
val1=1;
val2=1;
txshdn=1;
for(x0=0;x0<40;x0++){Delay(10);} //11.20由238改成了10,验证是否与井下程序同步
para_addr=0x0e00;
page_5=0x00;
page_4=0x00;
page_3=0x00;
addr=0x0000;
repeat:Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0e00,512);
/*读出当前参数段中的间隔时间*/
inx1=XBYTE[para_addr];
para_addr++;
inx1=(inx1<<8)|XBYTE[para_addr];
para_addr++;
/*读出当前参数段中的应测采样点数 */
inx0=XBYTE[para_addr];
para_addr++;
inx0=(inx0<<8)|XBYTE[para_addr];
para_addr++;
Delay_Time0=XBYTE[para_addr];
para_addr++;
Delay_Time0=(Delay_Time0<<8)|XBYTE[para_addr];
para_addr++;
para_addr++;
Dly_Time0=XBYTE[para_addr]*1000-Delay_Time0;
para_addr++;
vx0=XBYTE[para_addr];
para_addr++;
vx0=(vx0<<8)|XBYTE[para_addr];
para_addr++;
para_addr=para_addr+6;
if(inx0==65535)
{if(inx1==65535)
{SFRPAGE = 0x0f;P5=0x2f;
end_proc();
SFRPAGE = 0x00;
RSTSRC=0x10;
}
}
ten_ms=0;
Timer3_Init (SYSCLK/12/SAMP_RATE); // Init Timer3 for 100ksps sample rate
sam_state=0;
Delay_Time=Delay_Time0/20;
Dly_Time=Dly_Time0/20;
pl2: iny1=inx1/20;
pl5: if(Dly_Time==0){Delay_Time=Delay_Time0/20;
Dly_Time=Dly_Time0/20;} //Delay_Time*19; }
if(ten_ms!=1){goto pl5;}
ten_ms=0;
if(vx0==0x01){if(Delay_Time!=0)
{SFRPAGE = 0x0f;val1=0;state_val=1;Delay_Time--;}
else
{SFRPAGE = 0x0f;val1=1;state_val=0;Dly_Time--;}
}
if(vx0==0x02){if(Delay_Time!=0)
{SFRPAGE = 0x0f;val2=0;
state_val=1;
Delay_Time--;}
else
{SFRPAGE = 0x0f;val2=1;state_val=0;Dly_Time--;}
}
iny1--;
if(sam_state==0){samp_mem();//mem();
sam_state=1;}
if(iny1!=0){goto pl5;}
sam_state=0;
inx0--;
if(inx0!=0){goto pl2;}
goto repeat;
}
/*void mem(void)
{
unsigned int i;
test[addr]=time_h;
addr++;
test[addr]=time_m;
addr++;
test[addr]=time_s;
addr++;
SFRPAGE = 0x0f;P6=0xfc; //P6=0xfc?11.09
Delay(1);
EA=0;
ad_dat=AD_Complete();
ad_dat=AD_Complete()-32768;
EA=1;
jx=ad_dat-(zero_0);
if(jx>=deltap1)
{test[addr]=255;}
else
{test[addr]=0;}
addr++;
test[addr]=13;
addr++;
SFRPAGE = 0x0f;P6=0xfe;//P6=0xfe?11.09
Delay(1);
EA=0;
ad_dat=AD_Complete();
ad_dat=AD_Complete();
EA=1;
ad_dat0=ad_dat-32768;
ad_dat0=ad_dat0-(pzero7);
if(ad_dat0<0)ad_dat0=0;
ad_dat0=ad_dat0*kp7;
test[addr]=ad_dat0;
addr++;
SFRPAGE = 0x0f;P6=0xfb; //P6=0xfb?11.09
Delay(1);
EA=0;
ad_dat=AD_Complete();
ad_dat=AD_Complete();
EA=1;
jx0=ad_dat-32768;
jx0=jx0-(pzero4);
if(jx0<0)jx0=0;
jx0=(jx0*10/kp4);
test[addr]=jx0;
addr++;
test[addr]=16;
addr++;
if(addr==0x0100)//应该为0x400?
{ addr=0x0000;
Ram_Program(page_5,page_4,page_3,0x0c00);
for(i=0;i<256;i++)//256?
{test[i]=0xffff;}
page_3++;
if(page_3==0x00)
{page_4++;}
if(page_4==0x00)
{page_5++;}
}
}*/
void samp_mem(void)
{ unsigned int i;
for(i=0;i<16;i++)
{ SFRPAGE = 0x0f;
P6=0xf8|i;
Delay(5);
EA=0;
ad_dat=AD_Complete();
//ad_dat=AD_Complete();
EA=1;
test[addr]=ad_dat;
addr=addr+1;
}
if(addr==0x0400)
{ //for(addr=0;addr<2048;addr++){test[addr]=addr;}
addr=0x0000;
Ram_Program(page_5,page_4,page_3,0x0000,2048);
page_3++;
if(page_3==0x00)
{page_4++;
if(page_4==0x00)
{page_5++;}
}
}
}
void end_proc(void)
{ Ram_Program(page_5,page_4,page_3,0x0000,2048);
Delay(20);
Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0e00,512);
Delay(20);
Ram_Erase(0x03,0xff,0x00);
Delay(20);
XBYTE[0x0efe]=0xff;
XBYTE[0x0eff]=0xff;
Ram_Program(0x03,0xff,0x00,0x0e00,512);
Delay(20);
}
//------------------------------------------------------------------------------------
// PORT_Init
//------------------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void external_osc (void)
{
int n; // local variable used in delay FOR loop.
char old_SFRPAGE;
old_SFRPAGE = SFRPAGE; // Save old SFRPAGE
SFRPAGE = CONFIG_PAGE; // switch to config page to config oscillator
OSCXCN = 0x67; // start external oscillator; 22.1 MHz Crystal
for (n=0;n<255;n++); // d elay about 1ms
while ((OSCXCN & 0x80) == 0);
CLKSEL |= 0x01; // switch to external oscillator
SFRPAGE = old_SFRPAGE; // restore SFRPAGE
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
//
void UART0_Init (void)
{ char old_SFRPAGE = SFRPAGE;
SFRPAGE = UART0_PAGE; // Switch to UART0 page
SCON0 = 0xf0; // SCON: mode 1, 8-bit UART, enable RX
SSTA0 = 0x10; // Timer 1 generates UART0 baud rate and
// UART0 baud rate divide by two disabled
SFRPAGE = TIMER01_PAGE; // Switch to Timer 0/1 page
TMOD = 0x21; // TMOD: timer 1, mode 2, 8-bit reload
TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate
TR1 = 1; // start Timer1
CKCON |= 0x10; // Timer1 uses SYSCLK as time base
PCON |= 0x80; // SMOD = 1
SFRPAGE = UART0_PAGE; // Switch to UART0 page
TI0 = 0; // Indicate TX ready
ES0=1;
ET0=0;
SFRPAGE = old_SFRPAGE; // restore SFRPAGE
}
void PORT_Init (void)
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = CONFIG_PAGE; // Switch to configuration page
XBR0 = 0x05; // Enable UART0 on crossbar
XBR1 = 0x00;
XBR2 = 0x44; // Enable crossbar and weak pull-ups
P0MDOUT = 0xff; // enable Port0 outputs as push-pull
P2MDOUT = 0xff; // enable Port0 outputs as push-pull
P3MDOUT = 0xff; // enable Port0 outputs as push-pull
P5MDOUT = 0xff;
P6MDOUT = 0Xff;
SFRPAGE = old_SFRPAGE; // restore SFRPAGE
}
void Delay(unsigned char times)
{
unsigned int i;
for(i=0;i<160*times;i++)_nop_();
}
//------------------------------------------------------------------------------------
// 读数子程序
//------------------------------------------------------------------------------------
void Ram_Rd(unsigned char Ram_Addr5,unsigned char Ram_Addr4,unsigned char Ram_Addr3,unsigned char Ram_Addr2,
unsigned char Ram_Addr1,unsigned int Ram_buf,unsigned int data_sum)
{
unsigned int i;
unsigned int temp_p;
char old_SFRPAGE;
old_SFRPAGE = SFRPAGE; // Save old SFRPAGE
SFRPAGE = 0x0F;
Ram_CS=1; // CS* 0
Ram_CLE=0; // Command latch
Ram_WE=1; // CS* 0
Ram_ALE=0; // Command latch
Ram_RE=1; // CS* 0
Ram_WP=0; //擦/写保护
//while(Ram_Busy==0);
temp_p = Ram_buf;
P7MDOUT =0xff; // P7 Output mode
Ram_CS=0;
Ram_CLE=1;
Ram_WE=0;
P7 =0x00;
Ram_WE=1; // WE Pulse
Ram_CLE=0;
Ram_ALE=1; // Address latch
Ram_WE=0;
P7 = Ram_Addr1;
Ram_WE=1; // WE Pulse
Ram_WE=0;
P7 = Ram_Addr2;
Ram_WE=1; // WE Pulse
Ram_WE=0;
P7 = Ram_Addr3;
Ram_WE=1; // WE Pulse
Ram_WE=0;
P7 = Ram_Addr4;
Ram_WE=1;
Ram_WE=0;
P7 = Ram_Addr5;
Ram_WE=1;
Ram_ALE=0;
Ram_CLE=1;
Ram_WE=0;
P7 =0x30;
Ram_WE=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -