#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
//*********************变量声明*********************************************************
uchar A_V[1];// V无效 A有效
uchar JD[11]; //经度七位小数
uchar JD_a; //经度方向
uchar WD[10]; //纬度,七位小数
uchar WD_a; //纬度方向
uchar time[6]; //时间时分秒
uchar TIMER[6]; //年月日
uchar speed[5]; //速度
uchar angle[5]; //方位角
uchar speed1[]="00.0"; //实测车速(xx.x)
uchar rotation[4]="0000"; //发动机转速(xxxx)
uchar tp[5]; //温度(xx.x)
uchar voltage[]="00.00"; //电压(xx.xx)
//串口中断需要的变量
uchar seg_count; //逗号计数器
uchar byte_count; //位数计数器
uchar cmd_number; //命令类型
uchar mode; //0:结束模式,1:命令模式,2:数据模式
uchar cmd[5]; //命令类型存储数组
//ulint timeche;//车速时间
//ulint chesu;//车速实际值
//uint countche;
//ulint TH11;
//取数据结束标志位
uchar tempflag=0; //取温度结束标志
uchar speedflag=0; //取速度结束标志位
uchar rotationflag=0; //取转速结束标志位
uchar voltageflag=0; //取电压结束标志位
uchar jieshu=0; //结束标志位
//uchar flagche=0,flagche1=0; //车速测量标志/测量结束标志
//显示需要的变量
uchar code sendcmd1[]="$C";
uchar code sendcmd2[]="$D";
uchar code table1[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,};//数字的码值
//**********************GPS接收串口初始化******************************
void GPS_serial_initial()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xf4;//波特率9600,22.1184M
TL1=0xf4;
PCON=0x80;//SMOD=1,即加倍
TR1=1;//启动定时器1
REN=1;
SM0=0;
SM1=1;
ES=1;
EA=1;
}
//***********************函数声明************************
void send1(void);//滑行阶段数据发送程序
void send2(void);//加速阶段数据发送程序
void inttimer_init(void);//车速测量中断定时初始化
void delay0(uchar x);
//***********发送电脑串口初始化(模拟GPRS接收RTD,暂时用查询发送)**************
//使用时,先EA=0,发送结束后,EA=1。
void GPRS_serial_initial()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xff;//波特率115200,22.1184M
TL1=0xff;
PCON=0x80;//SMOD=1,即加倍
TR1=1;//启动定时器1
REN=1;
SM0=0;
SM1=1;
}
//************************* 毫秒函数声明 ********************************
void delay_ms(unsigned char i)
{
unsigned char a, b;
for (a = 1; a < i; a++)
{
for (b = 1; b; b++)
{ ; }
}
}
///////////////////////////////////////////////////////
////////////温度传感器////////////////////////////////
///////////////////////////////////////////////////////
sbit DQ=P2^2; //温度输入口
uint temp;
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
uchar data temp_data[2]={0x00,0x00}; //读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用
//
/*****************11us延时函数*************************/
//
void delaytmp(uint t)
{
for (;t>0;t--);
}
/****************DS18B20复位函数************************/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();//从高拉倒低
DQ=0;
delaytmp(50); //550 us
DQ=1;
delaytmp(6); //66 us
presence=DQ; //presence=0 复位成功,继续下一步
}
delaytmp(45); //延时500 us
presence=~DQ;
}
DQ=1; //拉高电平
}
/****************DS18B20写命令函数************************/
//向1-WIRE 总线上写1个字节
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_(); //从高拉倒低
DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us
DQ=val&0x01; //最低位移出
delaytmp(6); //66 us
val=val/2; //右移1位
}
DQ=1;
delaytmp(1);
}
//
/****************DS18B20读1字节函数************************/
//从总线上取1个字节
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us
DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us
if(DQ)value|=0x80;
delaytmp(6); //66 us
}
DQ=1;
return(value);
}
/****************读出温度函数************************/
read_temp()
{
ow_reset(); //总线复位
delaytmp(200);
write_byte(0xcc); //发命令
write_byte(0x44); //发转换命令
ow_reset();
delaytmp(1);
write_byte(0xcc); //发命令
write_byte(0xbe);
temp_data[0]=read_byte(); //读温度值的第字节
temp_data[1]=read_byte(); //读温度值的高字节
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
return temp; //返回温度值
}
//
/****************温度数据处理函数************************/
//二进制高字节的低半字节和低字节的高半字节组成一字节,这个
//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
//下的低字节的低半字节转化成十进制后,就是温度值的小数部分
/********************************************************/
work_temp(uint tem)
{
uchar n=0;
voltage[2]='.';
if(tem>6348) // 温度值正负判断
{tem=65536-tem;n=1;} // 负温度求补码,标志位置1
tp[4]=tem&0x0f; // 取小数部分的值
tp[4]=ditab[tp[4]]; // 存入小数部分显示值
tem=tem>>4;// 取中间八位,即整数部分的值
tp[1]=tem%100/10; // 取十位数据暂存
tp[2]=tem%100%10;
tp[0]='+';
tp[1]=table1[ tp[1]];//十位
tp[2]=table1[tp[2]];//个位
tp[3]='.';
tp[4]=table1[tp[4]];//小数
if(n)
{
tp[0]='-';
}
tempflag=1; //结束标志
}
//////////////////////////////////////////////////////
//****************************主函数*************************************
void main()
{
// flagche1=0;
while(1)
{
//**************取温度值***********
ow_reset(); //温度传感器初始化
write_byte(0xcc); //Skip ROM
write_byte(0x44); //发转换命令
work_temp(read_temp()); //处理温度数据
while(!tempflag);//如果温度没有取完,则等待
tempflag=0;
//***************取GPS数据*********************
GPS_serial_initial();//GPS开始取数据
delay_ms(100);
while(!jieshu);//如果GPS没有取完则等待
jieshu=0;
EA=0;//关闭中断
GPRS_serial_initial();//GPRS波特率
jieshu=0;
send1();
// send2();
}
}
//************************GPS数据接收中断*********************************
void recv_serial_two() interrupt 4
{
unsigned char tmp =0;
unsigned char tempe=0 ;
tempe = SCON;
tempe = tempe & 0x01;
if(tempe)
{
SCON = SCON & 0xFE;//11111110清除标志位S2RI
tmp=SBUF;
switch(tmp)
{
case '$':
cmd_number=0; //命令类型清空
mode=1; //接收命令模式
byte_count=0; //接收位数清空
break;
case ',':
seg_count++; //逗号计数加1
byte_count=0;
break;
default:
if(mode==1)
{
//命令种类判断
cmd[byte_count]=tmp; //接收字符放入类型缓存
if(byte_count>=4)
{ //如果类型数据接收完毕,判断类型
if(cmd[0]=='G')
{
if(cmd[1]=='P')
{
if(cmd[2]=='R