📄 processor.c
字号:
#include <iom128v.h>
#include "board.h"
#include "datatype.h"
#include "processor.h"
#include "cc1000.h"
//---------------------------------处理器设置-----------------------------------
//---------------------------------FIRST PART-----------------------------------
//-------------------------------- ADC -----------------------------------
void init_adc(void)
{
ADCSRA = 0X00;
ADCSRA |= CONTINUE; //使ADC工作于连续模式
ADMUX = 0x00;
ADMUX |= INVREF; //将ADC的参考电压设置成内部的
ADMUX |= RSSI; //将ADC0设置成单端模拟输入端口
}
void open_adc(void) //开启ADC
{
ADCSRA |= 0x80;
}
void close_adc(void) //关闭ADC
{
ADCSRA &= 0x7F;
}
int conv_end(void)
{
if(ADCSRA & 0x10 == 0x10)return 1;
else return 0;
}
void rssi_vbat(BYTE adc_td) //银行系统中两路模-->数之间的切换
{
if (adc_td == RSSI)
{
//while (ADCSRA & 0x10 == 0x10) //判断ADC转换是否结束,直到结束再转换通道
ADMUX |= RSSI;
}
if (adc_td == VBATC)
//while (ADCSRA & 0x10 == 0x10)
ADMUX |= VBATC;
}
void adc_int_enable(void)
{
SREG |= E_GLOBLE_INT ;
ADCSRA|= 0x40;
}
ADCTYPE adc_result_reading(BYTE adc_tl,ADCTYPE adc_result) //完成AD转换,结果应用HEX数据表示,数据传递靠数组传递
{
int t;
BYTE adc_h,adc_l;
init_adc(); //初始化
rssi_vbat(adc_tl); //通路选择
open_adc(); //打开ADC
t=conv_end();
while (t == NO ); //判断转换结束
//delay(15) ;
adc_l = ADCL,adc_h = ADCH;
adc_result.high2bit = ADCL;
adc_result.low8bit = ADCH;
return adc_result;
//读取结果
}
/*--------------------------第二部分------------------------*/
/*-------------------------GPS_USART0-----------------------*/
BYTE GPRMC[6] ={'G','P','R','M','C'};
BYTE GPGAA[6] ={'G','P','G','A','A'};
BYTE GPVTG[6] ={'G','P','V','T','G'};
BYTE is(BYTE c)
{
if (USART0_Receive() ==c)return 0x01;
return 0x00;
}
/*first:USART0 initializtion*/
void init_usart0(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x20;
UCSR0C = 0x06;
UBRR0L = USART_BOUD; //set baud rate lo
UBRR0H &= 0xF0; //set baud rate hi BOUD_RATE 4800
UCSR0B = 0x18;
}
BYTE USART0_Receive(void) //USART0接收数据
{
while ((UCSR0A&(1<<RXC0))==(1<<RXC0)) return UDR0;
return 0;
}
/*second: GPS message detect*/
BYTE gps_data_format(BYTE gps_data_buf[],BYTE message_id[],int message_id_length)
{
int i,right_cnt;
for(i=0;i<=message_id_length;i++)
{
if(gps_data_buf[i]==message_id[i])right_cnt++;
}
if(right_cnt==message_id_length)return OK ;
else return NO;
}
/*third : pick_up GPS valid data*/
GPS pickup_valid_data(void)
{
int i;
BYTE buf[GPS_MESSAGE_LENGTH];
GPS gps_data;
if(is('$'))
{
for(i=0;i<=GPS_MESSAGE_LENGTH-1;i++)
{
buf[i]=USART0_Receive();
}
{PORTC=0x00;delay(300);PORTC=0xff;delay(300);PORTC=0x00;delay(300);PORTC=0xff;delay(300);PORTC=0x00;delay(300);PORTC=0xff;delay(300);PORTC=0x00;delay(300);PORTC=0xff;delay(300);}
}
if (gps_data_format(buf,GPRMC,5))
{
PORTC=0x00;delay(10000) ;
gps_data.utc[0] = buf[6] ;
gps_data.utc[1] = buf[7] ;
gps_data.utc[2] = buf[8] ;
gps_data.utc[3] = buf[10];
gps_data.utc[4] = buf[11];
gps_data.status = buf[13];
gps_data.latitude.degree = buf[15];
gps_data.latitude.minute[0] = buf[16];
gps_data.latitude.minute[1] = buf[18];
gps_data.latitude.minute[2] = buf[19];
gps_data.latitude.direction = buf[21];
gps_data.longitude.degree[0]= buf[23];
gps_data.longitude.degree[1]= buf[24];
gps_data.longitude.minute[0]= buf[25];
gps_data.longitude.minute[1]= buf[27];
gps_data.longitude.minute[2]= buf[28];
gps_data.longitude.direction= buf[30];
gps_data.speed = buf[34];
}
if (gps_data_format(buf,GPGAA,5))
{
;
}
if (gps_data_format(buf,GPVTG,5))
{
;
}
return gps_data;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -