?? f334.c
字號:
//-----------------------------------------------------------------------------
// T2Cal33x.c
//-----------------------------------------------------------------------------
// Copyright 2002 Cygnal Integrated Products, Inc.
//
// AUTH: CATHY
// DATE: 04 FEB 03
// 資源配置情況:VREF既作為內(nèi)部A/D基準(zhǔn),又輸出給外部電路
// 1根DA
// 3根A/D
// 4根串口現(xiàn)
// 1根復(fù)位
// 2根電源
// 一個定時器+
// 兩個GPIO,
// 3根SPI,
// Target: C8051F33x
// Tool chain: KEIL C51 6.03 / KEIL EVAL C51
// 程序說明:
//
// 用在帶GPS天線短路保護的便攜式SVA導(dǎo)航儀上
// SJQQC版本,帶日期輸出
// 帶天線短路告警,沒告警輸出為0,有告警輸出為85
// 算法改為:(X * 5 - Y)/ 25 = 角度 X:采樣數(shù)字 Y:基準(zhǔn)
// 本程序用于500套正式生產(chǎn)
// 與SDA程序的區(qū)別:1.FM接口定義變動
// 2.增加日期
// 3.增加長按關(guān)機,同時給WINCE存盤提供時間
// 4.增加背光調(diào)節(jié)協(xié)議
//
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051f330.h> // SFR declarations
#include<math.h>
#include <intrins.h>
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F33x
//-----------------------------------------------------------------------------
sfr16 DAC0 = 0x96; // 10?DAC?????
//sfr16 TMR0RL = 0xca; // ???0???????
//sfr16 TMR1RL = 0xca; // ???1???????
sfr16 TMR2RL = 0xca; // ???2???????
sfr16 TMR3RL = 0x92; // ???3???????
//sfr16 TMR0 = 0xCC; // ???0?????
//sfr16 TMR1 = 0xCC; // ???1?????
sfr16 TMR2 = 0xcc; // ???2?????
sfr16 TMR3 = 0x94; // ???3?????
sfr16 ADC0 = 0xbd; // ADC Data Word Register
sbit BG_EN = P1^3;
sbit S2410_PWR = P1^4;//sbit S2410_PWR = P1^7;
sbit PWR_KEY = P1^6;
sbit LED_TEST = P1^7;
sbit bh_en = P0^7;
sbit bh_clk = P1^0;
sbit bh_data = P1^1;
//----------------------------------------------------------------------------
//global constant
//----------------------------------------------------------------------------
#define BAUDRATE 57600 //?????SW_UART???
#define SYSCLK 24500000 //????????18.432MHz
#define BAUDRATE1 9600
#define TIME_COUNT SYSCLK/BAUDRATE1/4
//#define TIME_COUNT SYSCLK/BAUDRATE/4 //????????PCA???
//(PCA?????SYSCLK/4??)
#define TH_TIME_COUNT TIME_COUNT*3/2 //3/2???,?????????
//??????????RX????
//?????????,????
//??????????????
#define TIMER2_RATE 20 // Timer 2 overflow rate in Hz
#define SAMPLE_RATE 50000
#define HeaderLength 6
#define UTCtimeLength 6
//----------------------------------------------------------------------------
//全局變量
//----------------------------------------------------------------------------
sbit GPS_SW = P1^5;
sbit SW_RX = P0^3; // SW_UART接收引腳
sbit SW_TX = P0^2; // SW_UART發(fā)送引腳
bit SRI; // SW_UART接收完成標(biāo)志
bit STI; // SW_UART發(fā)送完成標(biāo)志
bit SREN; // SW_UART接收允許
bit STXBSY; // SW_UART發(fā)送忙標(biāo)志
char RDR; // SW_UART接收數(shù)據(jù)存儲器(鎖存器)
char TDR; // SW_UART發(fā)送數(shù)據(jù)寄存器
void PORT_Init(void); // Initialize Port I/O
void SYSCLK_Init (void); // Initialize Oscillator
void SW_UART_Init (void);
void UART0_Init (void);
void AD_Init (void);
void DA_Init (void);
void Timer0_Init (void);
void Timer2_Init (int);
void Timer3_Init (void);
void wait_one_second (void);
void Key_scan(void);
void Send_GPS(void);
void Variable_Init(void);
void Key_process(void);
void Measure(void);
void send_contr_word(unsigned int Cotrdata);
void Control_inf(unsigned char dx1,dx2,dx3);
void Delay_1uS(void);
unsigned int test;
unsigned int currval;
unsigned int DA_data;
unsigned char ii;
unsigned char tx_data;
unsigned char key_pre;
unsigned char key_work;
unsigned char key_scan_time;
unsigned int key_time;
unsigned char key_zt;
unsigned int LcdBackLight_Delay_AfterS2410;
unsigned char CRByte;
unsigned char LFByte;
unsigned char PulseCount;
unsigned char S_PulseCount[3];
unsigned char RecvByte;
unsigned char UartBuff;
unsigned char IsGpsFrame;
unsigned char FrameLength;
unsigned char Header[6];
unsigned char UTCtime[10];
unsigned char Longitude[10];
unsigned char Latitude[11];
unsigned char HDOP[4];
unsigned char DGPS;
unsigned char weixing[2];
unsigned char gps_ok;
unsigned char fm[4];
unsigned char fmbak;
unsigned char fmbak1;
unsigned char fmbak2;
unsigned char fmbak3;
unsigned char surt_js;
unsigned char he;
unsigned char FM_delay;
unsigned char FM_flag;
unsigned char S_Pulse_s[3];
unsigned char S_AdResult0[4]; //Ad Result backup for sending
unsigned char S_AdResult1[4]; //Ad Result backup for sending
unsigned char S_AdResult2[4]; //Ad Result backup for sending
unsigned char S_AdResult3[4]; //Ad Result backup for sending
unsigned char S_AdResult4[4]; //Ad Result backup for sending
unsigned char t1;
unsigned char ii;
unsigned int key_bg_time;
unsigned char POWER_SW_delay;
unsigned int zero_all;
unsigned int zero_front;
unsigned char zero_time;
unsigned int zero;
unsigned int zero_all_front;
unsigned char init_flag;
unsigned char zero_time1;
unsigned int zero_all1;
unsigned int zero_single;
unsigned char bujiu;
unsigned char bujiu_js;
unsigned char count_time;
unsigned char sample_time;
unsigned char Pulse_s;
unsigned char S_Pulse_s[3];
unsigned int AdResult[5];
unsigned int tempAdResult;
unsigned int tl;
unsigned int TL_Adresult;
unsigned int AdR[5];
unsigned int GPS_Current;
unsigned int GPS_Current_pre;
unsigned char riqi[6];
unsigned char GPS_Alarm[2];
unsigned int GPS_Alarm_js;
unsigned int GPS_time;
unsigned char b_light;
unsigned int key_press_time;
unsigned int test1;
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void)
{
// Disable Watchdog timer
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
PORT_Init(); // Initialize Port I/O
SYSCLK_Init (); // Initialize Oscillator
SW_UART_Init ();
UART0_Init ();
DA_Init ();
AD_Init ();
Timer0_Init ();
Timer3_Init ();
Variable_Init();
// LED_EN=1;
EIE1 |= 0x10; // enable PCA interrupt
EIP1 |= 0x10;
ET0=1;
ES0=1;
Control_inf(88,0,1);
EA = 1;
DAC0=0x0000;
while(1)
{
if (key_scan_time>20)
{
key_scan_time=0;
Key_scan();
}
Key_process();
if (gps_ok>0)
{
if ((count_time>79) && (sample_time<4))
{
Measure();
AdR[sample_time]=TL_Adresult;
count_time=0;
sample_time++;
}
}
IsGpsFrame = 0;
if(IsGpsFrame) //if a GPS frame received
{
TR0=0; //stop count the pulse,send the last counter
S_Pulse_s[0]=((Pulse_s/100)+0X30); //hundred
S_Pulse_s[1]=((Pulse_s % 100)/10+0X30); //ten
S_Pulse_s[2]=(((Pulse_s % 100) % 10)+0X30); //one
Pulse_s=0;
TR0=1; //restart counter0
Measure();
AdR[4]=TL_Adresult;
S_AdResult0[0]=((AdR[0]/1000)+0X30); //hundred
S_AdResult0[1]=((AdR[0]%1000)/100+0X30); //hundred
S_AdResult0[2]=(((AdR[0]%1000) % 100)/10+0X30); //ten
S_AdResult0[3]=((((AdR[0]%1000) % 100) % 10)+0X30); //one
S_AdResult1[0]=((AdR[1]/1000)+0X30); //hundred
S_AdResult1[1]=((AdR[1]%1000)/100+0X30); //hundred
S_AdResult1[2]=(((AdR[1]%1000) % 100)/10+0X30); //ten
S_AdResult1[3]=((((AdR[1]%1000) % 100) % 10)+0X30); //one
S_AdResult2[0]=((AdR[2]/1000)+0X30); //hundred
S_AdResult2[1]=((AdR[2]%1000)/100+0X30); //hundred
S_AdResult2[2]=(((AdR[2]%1000) % 100)/10+0X30); //ten
S_AdResult2[3]=((((AdR[2]%1000) % 100) % 10)+0X30); //one
S_AdResult3[0]=((AdR[3]/1000)+0X30); //hundred
S_AdResult3[1]=((AdR[3]%1000)/100+0X30); //hundred
S_AdResult3[2]=(((AdR[3]%1000) % 100)/10+0X30); //ten
S_AdResult3[3]=((((AdR[3]%1000) % 100) % 10)+0X30); //one
S_AdResult4[0]=((AdR[4]/1000)+0X30); //hundred
S_AdResult4[1]=((AdR[4]%1000)/100+0X30); //hundred
S_AdResult4[2]=(((AdR[4]%1000) % 100)/10+0X30); //ten
S_AdResult4[3]=((((AdR[4]%1000) % 100) % 10)+0X30); //one
//S_AdResult4[0]=((key_press_time/1000)+0X30); //hundred
//S_AdResult4[1]=((key_press_time%1000)/100+0X30); //hundred
//S_AdResult4[2]=(((key_press_time%1000) % 100)/10+0X30); //ten
//S_AdResult4[3]=((((key_press_time%1000) % 100) % 10)+0X30); //one
count_time=0;
sample_time=0;
Send_GPS();
IsGpsFrame=0;
GPS_time=700;
}
if (GPS_time<100) IsGpsFrame=1;
if (GPS_Alarm_js==0)
{
GPS_Alarm_js=200;
if ((GPS_Current_pre>500) && (GPS_Current>500))
{
GPS_Alarm[0]=8+0x30;GPS_Alarm[1]=5+0x30;
GPS_SW=1;
GPS_Alarm_js=2000;
}
else
{
GPS_Alarm[0]=0+0x30;GPS_Alarm[1]=0+0x30;
GPS_SW=0;
}
GPS_Current_pre=GPS_Current;
}
if (SRI==1)
{
SRI=0;
fmbak=RDR;
if (fmbak==245) surt_js=1;
if ((fmbak==240) && (surt_js==1)) surt_js=2;
else if ((fmbak==204) && (surt_js==1)) surt_js=6;
if ((surt_js==2) && (fmbak<201))
{
surt_js=3;
fmbak3=fmbak;
he=229+fmbak;
}
if ((surt_js==2) && (fmbak==250))
{
surt_js=3;
fmbak3=fmbak;
he=229+fmbak;
}
if ((surt_js==6) && (fmbak<10))
{
surt_js=7;
fmbak3=fmbak;
he=193+fmbak;
}
if ((surt_js==7) && (he==fmbak))
{
surt_js=0;
if (fmbak3<10) b_light=fmbak3+0x30;
if (fmbak3>4) DAC0=(fmbak3-5)*15000;
else DAC0=0;
}
if ((surt_js==3) && (he==fmbak))
{
surt_js=0;
if (fmbak3==250)
{
fm[0]=(2+0x30); //hundred
fm[1]=(5+0x30); //ten
fm[2]=(0+0x30); //one
Control_inf(fmbak1,fmbak2,0);
}
else
{
fm[0]=(fmbak3/100+0x30); //hundred
fm[1]=((fmbak3 % 100)/10+0x30); //ten
fm[2]=(((fmbak3 % 100) % 10)+0x30); //one
fmbak1=fmbak3/10+88;
fmbak2=fm[2]-0x30;
Control_inf(fmbak1,fmbak2,1);
}
}
RDR=0;
}
if (test>500)
{
test=0;
//LED_EN=~LED_EN;
//DAC0=0x0;
//Control_inf(88,0,1);
}
/*else if (test>3000)
{
DAC0=0xffc0;
}
*/
}
}
/////////////////////////////////////
// Config2 Code Configuration File //
/////////////////////////////////////
//----------------------------------------------------------------------------
// P0.0---VREF; SW_TX0(由于目前在該程序中ADC和DAC尚未初始化,所以SW_TX0暫被
// 分配在P0.0口上面;否則一切正常初始化完成后,已被分配
// 在P0.2腳上)
// P0.1---IDA;
// P0.2---GPIO; 待一切初始化正常后,將作為SW_TX0使用。
// P0.3---CEX0; SW_RX0
// P0.4---TX0;
// P0.5---RX0;
// P0.6---T0
// P0.7---GPIO; SW_SPI
// P1.0---GPIO; SW_SPI
// P1.1---GPIO; SW_SPI
// P1.2---AIN0
// P1.3---GPIO
// P1.4---GPIO
// P1.5---GPIO;
// P1.6---GPIO;
// P1.7---GPIO;
// Peripheral specific initialization functions,
// Called from the Init_Device() function
void Port_Init()
{
P0MDIN =0xFC;
P0SKIP = 0x07;
P0MDOUT |= 0x94;
P1MDIN = 0xFB;
P1SKIP = 0x04;
P1MDOUT |= 0x0B;
XBR0 = 0x01;
XBR1 = 0x51;
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use the internal oscillator
// at its maximum frequency.
// Also enables the Missing Clock Detector.
//
void SYSCLK_Init (void)
{
OSCICN |= 0x03; // Configure internal oscillator for
// its maximum frequency
RSTSRC = 0x04; // Enable missing clock detector
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
//
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -