欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
這個單片機程序中 感覺GPS的 GPGGA這條信息沒有被保存
[打印本頁]
作者:
ynzsc001
時間:
2020-1-2 10:39
標題:
這個單片機程序中 感覺GPS的 GPGGA這條信息沒有被保存
我移植了論壇里一位師兄的 程序,但是存儲PAGGA信息的數組內沒有數據。
#include <reg52.h>
#include "pcf8574lcd.h"
unsigned char RX_Buffer[68]; //此數組用于直接儲存來自GPS的原始數據,
unsigned char RX_Count = 0; //
bit Flag_GPS_OK = 0;
extern bit Flag_GPS_OK;
unsigned char xdata Display_GPGGA_Buffer[68]={0}; //用于儲存GPGGA的數據
unsigned char xdata Display_GPRMC_Buffer[68]={0}; //用于儲存GPRMC的數據
unsigned int k=0,qian_a=0,hou_a=0,qian_b=0,hou_b=0,qian_c=0,hou_c=0; //存儲前后逗號的位置序號的變量
bit qian_OK=0; //已找出前面的逗號的標志變量
bit First_Share_OK=0; //已開始LCD顯示的標志變量
bit jiajian=1; //進行加或減的標志變量
bit Flag_Calc_GPGGA_OK = 0; //GPGGA完整有效的數據已收到的標志變量
bit Flag_Calc_GPRMC_OK = 0; //GPRMC完整有效的數據已收到的標志變量
//*****************************************************************************
void GPSUart_Init() // GPS串口初始化
{
// 針對的是 STC89C52的,但是發現STC12C5A60S2單片機也可以用 ,同樣都是11.0592的晶振。
SCON = 0X50; //UART方式1;8位UART
REN = 1; //允許串行口接收數據
PCON = 0x00; //SMOD=0;波特率不加倍 9600
TMOD = 0x20; //T1方式2,用于產生波特率
TH1 = 0xFD; //裝初值
TL1 = 0xFD;
TR1 = 1; //啟動定時器1
EA = 1; //打開全局中斷控制
ES = 1; //打開串行口中斷
}
//-----------------------------------------------------------------
void RECEIVE_DATA(void) interrupt 4 using 3 //串口中斷函數,收到GPS的數據時進入此中斷
{
unsigned char temp = 0;
ES=0; //先關閉串行口中斷
temp = SBUF; //接收SBUF中的數據
RI = 0; //接收完成的標志位清零
if(temp == '
) //若是統一的數據頭,則作為數組第一個元素
{
RX_Count = 0;
Flag_GPS_OK = 0;
}
RX_Buffer[RX_Count++] = temp; //收到的數據放到數組中
if(RX_Count >= 66) //序號大于66的數據無用,統一放到第66位覆蓋掉
{
RX_Count = 66;
}
if(temp == '*') //收到*,則完成一幀數據的接收,不管是否完整有效
{
Flag_GPS_OK = 1; //標志變量置為1
}
ES=1; //重新打開串行口中斷
}
//----------------------------------------------------------------------------------
/********************************************************/
void Delay1s(uchar A) // 1秒,主要用來做歡迎詞延時,STC12系列專用
{
while(A--)
{
unsigned char i, j, k;
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
}
/*******************************************************************************
* 函 數 名 : datapros()
* 函數功能 : 溫度讀取處理轉換函數
* 輸 入 : temp
* 輸 出 : 無
*******************************************************************************/
void datapros(int temp) // 車外溫度考慮零下溫度
{
float tp;
//tp=temp;
//temp=tp*0.0625*100+0.5;
//temp=tp/16*100;//+0.5; //盡量避免浮點型運算//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數點后面。
if(temp< 0) //當溫度值為負數
{
DisplayOneChar(2,1,'-'); //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數點后面。
}
else
{
DisplayOneChar(2,1,' ');
tp=temp; //因為數據處理有小數點所以將溫度賦給一個浮點型變量
//如果溫度是正的那么,那么正數的原碼就是補碼它本身
temp=tp*0.0625*100+0.5;
//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數點后面。
}
if(temp/10000 ==0) DisplayOneChar(2,1,(temp/10000)+' '); //假如溫度百位等于0就不在顯示
else DisplayOneChar(2,1,(temp/10000)+'0'); // 百位
DisplayOneChar(3,1,(temp%10000)/1000+'0'); // 十位
DisplayOneChar(4,1,(temp%1000/100)+'0'); // 個位
DisplayOneChar(6,1,(temp%100/10)+'0'); // 小數點后 1 位
//DisplayOneChar(7,1,(temp%10)+'0'); // 小數點后 2 位
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
void dataprosN(int temp) // 車內溫度不考慮零下
{
float tp;
tp=temp;//temp=tp*0.0625*100+0.5;
temp=tp/16*100;//+0.5; //盡量避免浮點型運算//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數點后面。
if(temp/10000 ==0) DisplayOneChar(2,0,(temp/10000)+' '); //假如溫度百位等于0就不在顯示
else DisplayOneChar(2,0,(temp/10000)+'0'); // 百位
DisplayOneChar(3,0,(temp%10000)/1000+'0'); // 十位
DisplayOneChar(4,0,(temp%1000/100)+'0'); // 個位
DisplayOneChar(6,0,(temp%100/10)+'0'); // 小數點后 1 位
//DisplayOneChar(7,0,(temp%10)+'0'); // 小數點后 2 位
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void dataprosS(int temp) // 水溫度不考慮零下
{
float tp;
tp=temp;//temp=tp*0.0625*100+0.5;
temp=tp/16*100;//+0.5; //盡量避免浮點型運算//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數點后面。
if(temp/10000 ==0) DisplayOneChar(11,1,(temp/10000)+' '); //假如溫度百位等于0就不在顯示
else DisplayOneChar(11,1,(temp/10000)+'0'); // 百位
DisplayOneChar(12,1,(temp%10000)/1000+'0'); // 十位
DisplayOneChar(13,1,(temp%1000/100)+'0'); // 個位
DisplayOneChar(15,1,(temp%100/10)+'0'); // 小數點后 1 位
//DisplayOneChar(7,1,(temp%10)+'0'); // 小數點后 2 位
}
//********************************* 主函數 ******************************************************
void main()
{
unsigned int i = 0;
Init_Lcd(); // 初始化1602液晶顯示器
GPSUart_Init();
Write_LCD(0,0," Good Luck ");
Write_LCD(0,1,"Happy ever day");
Delay1s(1); //延時3S
LCD_write_command(0x01); // 清屏
while(1)
{
unsigned int a;
//------------------------------第一屏:顯示溫度----------------------
for(a=15;a;a--) //保持溫度采樣顯示 7秒 左右(大概2.2倍秒的關系)
{ Write_LCD(0,0,"n:");
Write_LCD(5,0,".");
Write_LCD(8,0,"H:");
Write_LCD(0,1,"w:");
Write_LCD(5,1,".");
Write_LCD(8,1,"S:");
Write_LCD(14,1,".");
datapros(Ds18b20ReadTemp()); //數據處理函數
dataprosN(Ds18b20ReadTempN()); //數據處理函數
dataprosS(Ds18b20ReadTempS()); //數據處理函數
}
LCD_write_command(0x01); // 清屏
//---------------------------- 第二屏:測試用 ------------------------------------------
for(a=15;a;a--) //保持屏幕 5秒 左右(大概10倍秒的關系)
{
Write_LCD(0,0,"Let's go....."); // 用做測試第二屏顯示
}
LCD_write_command(0x01); // 清屏
//-----------------------------------------------------------------------------------------------------
//---------------------------- 第三屏:處理GPS 顯示海拔、速度 ------------------------------------------
//-----------------------------------------------------------------------------------------------------
Write_LCD(0,0,"BBBBBB....."); // 測試用
Delay1s(1); //延時3S
LCD_write_command(0x01); // 清屏
qian_OK=0; //標志變量歸零
k=0; //累計量歸零
if ( Flag_GPS_OK == 1
&& RX_Buffer[1] == 'G'
&& RX_Buffer[3] == 'G'
&& RX_Buffer[4] == 'G'
&& RX_Buffer[5] == 'A'
&& (RX_Buffer[28] == 'N'|| RX_Buffer[28] == 'S')
&& (RX_Buffer[41] == 'E'|| RX_Buffer[41] == 'W') ) //確認是否收到"GPGGA"這一幀完整有效的數據
{
for( i = 0; i < 67 ; i++) //必須為i<67,因為要確保Display_GPGGA_Buffer[67]為'\0',便于串口發送
{
Display_GPGGA_Buffer[i] = RX_Buffer[i]; //儲存到數組中
}
Flag_Calc_GPGGA_OK = 1; //收到完整有效數據后,置為1
}
LCD_write_command(0x85);
LCD_write_data(RX_Buffer[45]); // 測試用,有每一幀的 第45 位的數據,
LCD_write_command(0x88);
LCD_write_data(Display_GPGGA_Buffer[2]); // 沒數據
Delay1s(1); //延時3S
LCD_write_command(0x01); // 清屏
Write_LCD(0,0,"VVVVVV.....");
Delay1s(1); //延時3S
}
}
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/****************************************************************************************************************
*****************************************************************************************************************/
#include "pcf8574lcd.h"
char ADDR = 0x4E; // PCF8574T 模塊的地址碼
//***************************** 延時 XX ms ***********************************************
void delay(int y)
{
;
while(y--)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
}
/***************************** 這是從其他地方移植過來的 *********************
void delay(int ms)
{
unsigned char y ;
while(ms--)
{
for(y = 0 ; y<250 ; y++) // 這是從其他地方移植過來的
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}
*************************************************************************************/
//******************************** IIC 串口開始 ********************************************
void IIC_start(void)
{
SDA=1;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
//********************************* IIC 串口結束 *******************************************
void IIC_stop(void)
{
SDA=0;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
//********************************** IIC 串口寫1個字節 ******************************************
void IIC_writeByte(char temp)
{
char i;
for(i=0;i<8;i++)
{
SDA=(bit)(temp & 0x80) ; // 根據規定1602的數據最高位必須為 1
temp <<=1;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
while(SDA);
_nop_();
SCL=0;
}
//**************************************************************************************************************
//********************************************* 以下是對1602 的操作 ******************************************
//**************************************************************************************************************
//******************************** 1602寫命令 ********************************************
void LCD_write_command(char comm)
{
char tmp;
IIC_start(); // 串口開始
IIC_writeByte(ADDR); // 先選PCF 8574T 的地址 (應該是相當于選中的意思吧)
tmp = comm & 0xF0; // 與0xf0 應該是取第四位的意思吧
tmp |= 0x0C; //保留高4位為指令的高四位,低四位為 RS = 0, RW = 0, EN = 1
IIC_writeByte(tmp); //從串口送出
delay(20);
tmp &= 0xFB; //Make EN = 0
IIC_writeByte(tmp);
tmp = (comm & 0x0F) << 4 ; //將指令的低四位 送到高位置保存
tmp |= 0x0C; //RS = 0, RW = 0, EN = 1
IIC_writeByte(tmp);
delay(20);
tmp &= 0xFB; // Make EN = 0
IIC_writeByte(tmp);
//stop_8574();
}
//******************************** 1602寫數據 ********************************************
void LCD_write_data(char data1)
{
char tmp;
IIC_start();
IIC_writeByte(ADDR); // 先選PCF 8574T 的地址 (應該是相當于選中的意思吧)
tmp = data1 & 0xF0;
tmp |= 0x0D; //RS = 0, RW = 0, EN = 1
IIC_writeByte(tmp);
delay(20);
tmp &= 0xFB; //Make EN = 0
IIC_writeByte(tmp);
tmp = (data1 & 0x0F) << 4 ;
tmp |= 0x0D; //RS = 0, RW = 0, EN = 1
IIC_writeByte(tmp);
delay(20);
tmp &= 0xFB ; // Make EN = 0
IIC_writeByte(tmp);
}
//******************************** 1602初始化 ********************************************
void Init_Lcd(void)
{
LCD_write_command(0x33); //
delay(50) ;
LCD_write_command(0x32); //
delay(50) ;
LCD_write_command(0x28); // 4位數據線,顯示2行,5*7點陣字符 !如果是0x38 則為8位數據線,顯示2行,5*7點陣字符
delay(50) ;
LCD_write_command(0x0C); // 開顯示,關閉光標,不閃爍
delay(50) ;
LCD_write_command(0x06); // 設定輸入方式,增量不位移
delay(50) ;
LCD_write_command(0x01); // 清屏
delay(50) ;
}
//********************************** 1602清屏 ******************************************
void Clear_Lcd(void)
{
LCD_write_command(0x01);
}
//****************************************************************************
void Write_LCD(int x, int y, char *str) //顯示字符串的函數
{
char addr;
if( x < 0)
{
x = 0;
}
if(x > 15)
{
x = 15;
}
if(y<0)
{
y = 0;
}
if(y > 1)
{
y = 1;
}
addr = 0x80 + 0x40 * y + x; // Move cursor 移動光標
LCD_write_command(addr);
while (*str)
{
LCD_write_data(*str++);
}
}
//****************************************************************************
//按指定位置顯示一個字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
X |= 0x80; // 算出指令碼
LCD_write_command(X); //這里不檢測忙信號,發送地址碼
LCD_write_data(DData);
}
//*****************************************************************************************************************************************************************************************************
//********************************************* 以下是對18b20 的操作 **********************************************************************************************************************************
//*****************************************************************************************************************************************************************************************************
/*******************************************************************************
* 函 數 名 : Delay1ms
* 函數功能 : 延時函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Delay1ms(uint y) //誤差 0us STC12系列專用
{
while(y--)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
}
////////////////////////////////////////////////////////
void delay_us(uchar x) //延時 X us STC12系列專用
{uchar i;
for(i=0;i<x;i++);
}
void delay_1us() //延時 1 us
{
uchar i;
for(i=0;i<1;i++);
}
/*******************************************************************************
* 函 數 名 : Ds18b20Init
* 函數功能 : 初始化
* 輸 入 : 無
* 輸 出 : 初始化成功返回1,失敗返回0
*******************************************************************************/
uchar Ds18b20Init()
{
bit flag;
DSPORT = 1;
delay_1us();
DSPORT = 0;
delay_us(255); //將總線拉低480us~960us
DSPORT = 1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
delay_us(30); //等待15-60微秒,18b20作出回應
flag=DSPORT; //檢測是否為低電平
delay_us(255);
delay_us(255); //延時足夠長,最少480us,完成復位周期
return (flag);
}
uchar Ds18b20InitN()
{
bit flag;
DSPORTN = 1;
delay_1us();
DSPORTN = 0;
delay_us(255); //將總線拉低480us~960us
DSPORTN = 1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
delay_us(30); //等待15-60微秒,18b20作出回應
flag=DSPORTN; //檢測是否為低電平
delay_us(255);
delay_us(255); //延時足夠長,最少480us,完成復位周期
return (flag);
}
uchar Ds18b20InitS()
{
bit flag;
DSPORTS = 1;
delay_1us();
DSPORTS = 0;
delay_us(255); //將總線拉低480us~960us
DSPORTS = 1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
delay_us(30); //等待15-60微秒,18b20作出回應
flag=DSPORTS; //檢測是否為低電平
delay_us(255);
delay_us(255); //延時足夠長,最少480us,完成復位周期
return (flag);
}
/*******************************************************************************
* 函 數 名 : Ds18b20WriteByte
* 函數功能 : 向18B20寫入一個字節
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Ds18b20WriteByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DSPORT=1;
delay_1us();//稍作延時
DSPORT=0;//啟動寫時序
DSPORT=dat&0x01;//向數據線傳送最低位
delay_us(40);//延時約50us,供18b20采樣數據
DSPORT=1;//釋放總線
delay_1us();
dat>>=1;//右移一位
}
delay_us(2);//寫完一個指令稍作延時
}
void Ds18b20WriteByteN(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DSPORTN=1;
delay_1us();//稍作延時
DSPORTN=0;//啟動寫時序
DSPORTN=dat&0x01;//向數據線傳送最低位
delay_us(40);//延時約50us,供18b20采樣數據
DSPORTN=1;//釋放總線
delay_1us();
dat>>=1;//右移一位
}
delay_us(2);//寫完一個指令稍作延時
}
void Ds18b20WriteByteS(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DSPORTS=1;
delay_1us();//稍作延時
DSPORTS=0;//啟動寫時序
DSPORTS=dat&0x01;//向數據線傳送最低位
delay_us(40);//延時約50us,供18b20采樣數據
DSPORTS=1;//釋放總線
delay_1us();
dat>>=1;//右移一位
}
delay_us(2);//寫完一個指令稍作延時
}
/*******************************************************************************
* 函 數 名 : Ds18b20ReadByte
* 函數功能 : 讀取一個字節
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
uchar Ds18b20ReadByte()
{
uchar i=0,dat;
for(i=0;i<8;i++)
{
DSPORT=1;//先拉高
delay_1us();//稍作延時
DSPORT=0;//啟動讀時序
delay_1us();//稍作延時
DSPORT=1;//釋放總線
delay_us(6);//延時7us,主機采樣
dat>>=1;//先右移一位,使最高位為0
if(DSPORT==1)
dat|=0x80;//與10000000或,dat=10000000
else
dat|=0x00;//取值為0
delay_us(50);
}
return(dat);
}
uchar Ds18b20ReadByteN()
{
uchar i=0,dat;
for(i=0;i<8;i++)
{
DSPORTN=1;//先拉高
delay_1us();//稍作延時
DSPORTN=0;//啟動讀時序
delay_1us();//稍作延時
DSPORTN=1;//釋放總線
delay_us(6);//延時7us,主機采樣
dat>>=1;//先右移一位,使最高位為0
if(DSPORTN==1)
dat|=0x80;//與10000000或,dat=10000000
else
dat|=0x00;//取值為0
delay_us(50);
}
return(dat);
}
uchar Ds18b20ReadByteS()
{
uchar i=0,dat;
for(i=0;i<8;i++)
{
DSPORTS=1;//先拉高
delay_1us();//稍作延時
DSPORTS=0;//啟動讀時序
delay_1us();//稍作延時
DSPORTS=1;//釋放總線
delay_us(6);//延時7us,主機采樣
dat>>=1;//先右移一位,使最高位為0
if(DSPORTS==1)
dat|=0x80;//與10000000或,dat=10000000
else
dat|=0x00;//取值為0
delay_us(50);
}
return(dat);
}
/*******************************************************************************
* 函 數 名 : Ds18b20ChangTemp
* 函數功能 : 讓18b20開始轉換溫度
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Ds18b20ChangTemp()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc); //跳過ROM操作命令
Ds18b20WriteByte(0x44); //溫度轉換命令
//Delay1ms(100); //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了
}
void Ds18b20ChangTempN()
{
Ds18b20InitN();
Delay1ms(1);
Ds18b20WriteByteN(0xcc); //跳過ROM操作命令
Ds18b20WriteByteN(0x44); //溫度轉換命令
//Delay1ms(100); //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了
}
void Ds18b20ChangTempS()
{
Ds18b20InitS();
Delay1ms(1);
Ds18b20WriteByteS(0xcc); //跳過ROM操作命令
Ds18b20WriteByteS(0x44); //溫度轉換命令
//Delay1ms(100); //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了
}
/*******************************************************************************
* 函 數 名 : Ds18b20ReadTempCom
* 函數功能 : 發送讀取溫度命令
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Ds18b20ReadTempCom()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc); //跳過ROM操作命令
Ds18b20WriteByte(0xbe); //發送讀取溫度命令
}
void Ds18b20ReadTempComN()
{
Ds18b20InitN();
Delay1ms(1);
Ds18b20WriteByteN(0xcc); //跳過ROM操作命令
Ds18b20WriteByteN(0xbe); //發送讀取溫度命令
}
void Ds18b20ReadTempComS()
{
Ds18b20InitS();
Delay1ms(1);
Ds18b20WriteByteS(0xcc); //跳過ROM操作命令
Ds18b20WriteByteS(0xbe); //發送讀取溫度命令
}
/*******************************************************************************
* 函 數 名 : Ds18b20ReadTemp
* 函數功能 : 讀取溫度
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
int Ds18b20ReadTemp()
{
int temp = 0;
uchar tmh, tml;
Ds18b20ChangTemp(); //先寫入轉換命令
Ds18b20ReadTempCom(); //然后等待轉換完后發送讀取溫度命令
tml = Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節
tmh = Ds18b20ReadByte(); //再讀高字節
temp = tmh;
temp <<= 8;
temp |= tml;
return temp;
}
int Ds18b20ReadTempN()
{
int temp = 0;
uchar tmh, tml;
Ds18b20ChangTempN(); //先寫入轉換命令
Ds18b20ReadTempComN(); //然后等待轉換完后發送讀取溫度命令
tml = Ds18b20ReadByteN(); //讀取溫度值共16位,先讀低字節
tmh = Ds18b20ReadByteN(); //再讀高字節
temp = tmh;
temp <<= 8;
temp |= tml;
return temp;
}
int Ds18b20ReadTempS()
{
int temp = 0;
uchar tmh, tml;
Ds18b20ChangTempS(); //先寫入轉換命令
Ds18b20ReadTempComS(); //然后等待轉換完后發送讀取溫度命令
tml = Ds18b20ReadByteS(); //讀取溫度值共16位,先讀低字節
tmh = Ds18b20ReadByteS(); //再讀高字節
temp = tmh;
temp <<= 8;
temp |= tml;
return temp;
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
#ifndef __PCF8574LCD_H__
#define __PCF8574LCD_H__
#include <reg52.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit SCL = P1^0;
sbit SDA = P1^1;
void delay(int ms); // 延時 XX ms
void IIC_start(void); // IIC 串口開始
void IIC_stop(void); // IIC 串口結束
void IIC_writeByte(char temp); // IIC 串口寫1個字節
void LCD_write_command(char comm); // 1602寫命令
void LCD_write_data(char data1); // 1602寫數據
void Init_Lcd(void); // 1602初始化
void Clear_Lcd(void); // 1602清屏
void Write_LCD(int x, int y, char *str); // 顯示字符串(小張寫的)
void Write_Customer(int x, int y, char str[]);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); //按指定位置顯示一個字符
//**************** 18B20*************************************************
//--定義使用的IO口--//
sbit DSPORT=P2^1; // 車外溫度接口
//--聲明全局函數--//
void Delay1ms(uint );
uchar Ds18b20Init();
void Ds18b20WriteByte(uchar com);
uchar Ds18b20ReadByte();
void Ds18b20ChangTemp();
void Ds18b20ReadTempCom();
int Ds18b20ReadTemp();
sbit DSPORTN=P2^2; // 車內溫度接口
//--聲明全局函數--//
uchar Ds18b20InitN();
void Ds18b20WriteByteN(uchar com);
uchar Ds18b20ReadByteN();
void Ds18b20ChangTempN();
void Ds18b20ReadTempComN();
int Ds18b20ReadTempN();
sbit DSPORTS=P2^3; // 水溫度接口
//--聲明全局函數--//
uchar Ds18b20InitS();
void Ds18b20WriteByteS(uchar com);
uchar Ds18b20ReadByteS();
void Ds18b20ChangTempS();
void Ds18b20ReadTempComS();
int Ds18b20ReadTempS();
//****************************************
#endif
復制代碼
作者:
51hei**1140
時間:
2020-1-2 12:11
你好!
你這個程序太長了,沒時間去逐句排查;
一般數據讀取不到,應該是協議解析錯誤;
不同GPS模塊協議有所不同,仔細看看協議吧。
作者:
ynzsc001
時間:
2020-1-3 11:47
51hei**1140 發表于 2020-1-2 12:11
你好!
你這個程序太長了,沒時間去逐句排查;
一般數據讀取不到,應該是協議解析錯誤;
我基礎差,是排查不了啦。謝謝你!
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1