|
我移植了論壇里一位師兄的 程序,但是存儲PAGGA信息的數(shù)組內(nèi)沒有數(shù)據(jù)。
- #include <reg52.h>
- #include "pcf8574lcd.h"
- unsigned char RX_Buffer[68]; //此數(shù)組用于直接儲存來自GPS的原始數(shù)據(jù),
- unsigned char RX_Count = 0; //
- bit Flag_GPS_OK = 0;
- extern bit Flag_GPS_OK;
- unsigned char xdata Display_GPGGA_Buffer[68]={0}; //用于儲存GPGGA的數(shù)據(jù)
- unsigned char xdata Display_GPRMC_Buffer[68]={0}; //用于儲存GPRMC的數(shù)據(jù)
- 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; //已找出前面的逗號的標(biāo)志變量
- bit First_Share_OK=0; //已開始LCD顯示的標(biāo)志變量
- bit jiajian=1; //進(jìn)行加或減的標(biāo)志變量
- bit Flag_Calc_GPGGA_OK = 0; //GPGGA完整有效的數(shù)據(jù)已收到的標(biāo)志變量
- bit Flag_Calc_GPRMC_OK = 0; //GPRMC完整有效的數(shù)據(jù)已收到的標(biāo)志變量
- //*****************************************************************************
- void GPSUart_Init() // GPS串口初始化
- {
-
- // 針對的是 STC89C52的,但是發(fā)現(xiàn)STC12C5A60S2單片機(jī)也可以用 ,同樣都是11.0592的晶振。
- SCON = 0X50; //UART方式1;8位UART
- REN = 1; //允許串行口接收數(shù)據(jù)
- PCON = 0x00; //SMOD=0;波特率不加倍 9600
- TMOD = 0x20; //T1方式2,用于產(chǎn)生波特率
- TH1 = 0xFD; //裝初值
- TL1 = 0xFD;
- TR1 = 1; //啟動定時器1
- EA = 1; //打開全局中斷控制
- ES = 1; //打開串行口中斷
- }
- //-----------------------------------------------------------------
- void RECEIVE_DATA(void) interrupt 4 using 3 //串口中斷函數(shù),收到GPS的數(shù)據(jù)時進(jìn)入此中斷
- {
- unsigned char temp = 0;
- ES=0; //先關(guān)閉串行口中斷
- temp = SBUF; //接收SBUF中的數(shù)據(jù)
- RI = 0; //接收完成的標(biāo)志位清零
-
- if(temp == '
- ) //若是統(tǒng)一的數(shù)據(jù)頭,則作為數(shù)組第一個元素
- {
- RX_Count = 0;
- Flag_GPS_OK = 0;
- }
- RX_Buffer[RX_Count++] = temp; //收到的數(shù)據(jù)放到數(shù)組中
- if(RX_Count >= 66) //序號大于66的數(shù)據(jù)無用,統(tǒng)一放到第66位覆蓋掉
- {
- RX_Count = 66;
- }
- if(temp == '*') //收到*,則完成一幀數(shù)據(jù)的接收,不管是否完整有效
- {
- Flag_GPS_OK = 1; //標(biāo)志變量置為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);
-
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : datapros()
- * 函數(shù)功能 : 溫度讀取處理轉(zhuǎn)換函數(shù)
- * 輸 入 : temp
- * 輸 出 : 無
- *******************************************************************************/
- void datapros(int temp) // 車外溫度考慮零下溫度
- {
- float tp;
- //tp=temp;
- //temp=tp*0.0625*100+0.5;
- //temp=tp/16*100;//+0.5; //盡量避免浮點(diǎn)型運(yùn)算//留兩個小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點(diǎn)
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
- if(temp< 0) //當(dāng)溫度值為負(fù)數(shù)
- {
- DisplayOneChar(2,1,'-'); //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點(diǎn)
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
- }
- else
- {
- DisplayOneChar(2,1,' ');
- tp=temp; //因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個浮點(diǎn)型變量
- //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點(diǎn)
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
- }
-
- 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'); // 小數(shù)點(diǎn)后 1 位
- //DisplayOneChar(7,1,(temp%10)+'0'); // 小數(shù)點(diǎn)后 2 位
-
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void dataprosN(int temp) // 車內(nèi)溫度不考慮零下
- {
- float tp;
- tp=temp;//temp=tp*0.0625*100+0.5;
- temp=tp/16*100;//+0.5; //盡量避免浮點(diǎn)型運(yùn)算//留兩個小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點(diǎn)
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
-
-
-
- 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'); // 小數(shù)點(diǎn)后 1 位
- //DisplayOneChar(7,0,(temp%10)+'0'); // 小數(shù)點(diǎn)后 2 位
- }
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void dataprosS(int temp) // 水溫度不考慮零下
- {
- float tp;
- tp=temp;//temp=tp*0.0625*100+0.5;
- temp=tp/16*100;//+0.5; //盡量避免浮點(diǎn)型運(yùn)算//留兩個小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點(diǎn)
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
-
-
- 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'); // 小數(shù)點(diǎn)后 1 位
-
-
- //DisplayOneChar(7,1,(temp%10)+'0'); // 小數(shù)點(diǎn)后 2 位
- }
- //********************************* 主函數(shù) ******************************************************
- 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倍秒的關(guān)系)
-
- { 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()); //數(shù)據(jù)處理函數(shù)
- dataprosN(Ds18b20ReadTempN()); //數(shù)據(jù)處理函數(shù)
- dataprosS(Ds18b20ReadTempS()); //數(shù)據(jù)處理函數(shù)
- }
- LCD_write_command(0x01); // 清屏
-
-
- //---------------------------- 第二屏:測試用 ------------------------------------------
-
- for(a=15;a;a--) //保持屏幕 5秒 左右(大概10倍秒的關(guān)系)
-
- {
-
- 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; //標(biāo)志變量歸零
- k=0; //累計(jì)量歸零
-
- 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') ) //確認(rèn)是否收到"GPGGA"這一幀完整有效的數(shù)據(jù)
-
- {
- for( i = 0; i < 67 ; i++) //必須為i<67,因?yàn)橐_保Display_GPGGA_Buffer[67]為'\0',便于串口發(fā)送
- {
- Display_GPGGA_Buffer[i] = RX_Buffer[i]; //儲存到數(shù)組中
- }
- Flag_Calc_GPGGA_OK = 1; //收到完整有效數(shù)據(jù)后,置為1
- }
- LCD_write_command(0x85);
- LCD_write_data(RX_Buffer[45]); // 測試用,有每一幀的 第45 位的數(shù)據(jù),
-
- LCD_write_command(0x88);
- LCD_write_data(Display_GPGGA_Buffer[2]); // 沒數(shù)據(jù)
- 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 串口結(jié)束 *******************************************
- void IIC_stop(void)
- {
- SDA=0;
- _nop_();
- SCL=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SDA=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- //********************************** IIC 串口寫1個字節(jié) ******************************************
- void IIC_writeByte(char temp)
- {
- char i;
- for(i=0;i<8;i++)
- {
- SDA=(bit)(temp & 0x80) ; // 根據(jù)規(guī)定1602的數(shù)據(jù)最高位必須為 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 的地址 (應(yīng)該是相當(dāng)于選中的意思吧)
-
- tmp = comm & 0xF0; // 與0xf0 應(yīng)該是取第四位的意思吧
- 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寫數(shù)據(jù) ********************************************
- void LCD_write_data(char data1)
- {
- char tmp;
- IIC_start();
- IIC_writeByte(ADDR); // 先選PCF 8574T 的地址 (應(yīng)該是相當(dāng)于選中的意思吧)
-
- 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位數(shù)據(jù)線,顯示2行,5*7點(diǎn)陣字符 !如果是0x38 則為8位數(shù)據(jù)線,顯示2行,5*7點(diǎn)陣字符
- delay(50) ;
- LCD_write_command(0x0C); // 開顯示,關(guān)閉光標(biāo),不閃爍
- delay(50) ;
- LCD_write_command(0x06); // 設(shè)定輸入方式,增量不位移
- 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) //顯示字符串的函數(shù)
- {
- 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 移動光標(biāo)
- 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; //當(dāng)要顯示第二行時地址碼+0x40;
- X |= 0x80; // 算出指令碼
- LCD_write_command(X); //這里不檢測忙信號,發(fā)送地址碼
- LCD_write_data(DData);
- }
- //*****************************************************************************************************************************************************************************************************
- //********************************************* 以下是對18b20 的操作 **********************************************************************************************************************************
- //*****************************************************************************************************************************************************************************************************
- /*******************************************************************************
- * 函 數(shù) 名 : Delay1ms
- * 函數(shù)功能 : 延時函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- 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++);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20Init
- * 函數(shù)功能 : 初始化
- * 輸 入 : 無
- * 輸 出 : 初始化成功返回1,失敗返回0
- *******************************************************************************/
- uchar Ds18b20Init()
- {
- bit flag;
- DSPORT = 1;
- delay_1us();
- DSPORT = 0;
- delay_us(255); //將總線拉低480us~960us
- DSPORT = 1; //然后拉高總線,如果DS18B20做出反應(yīng)會將在15us~60us后總線拉低
- delay_us(30); //等待15-60微秒,18b20作出回應(yīng)
- flag=DSPORT; //檢測是否為低電平
- delay_us(255);
- delay_us(255); //延時足夠長,最少480us,完成復(fù)位周期
- return (flag);
-
- }
- uchar Ds18b20InitN()
- {
- bit flag;
- DSPORTN = 1;
- delay_1us();
- DSPORTN = 0;
- delay_us(255); //將總線拉低480us~960us
- DSPORTN = 1; //然后拉高總線,如果DS18B20做出反應(yīng)會將在15us~60us后總線拉低
- delay_us(30); //等待15-60微秒,18b20作出回應(yīng)
- flag=DSPORTN; //檢測是否為低電平
- delay_us(255);
- delay_us(255); //延時足夠長,最少480us,完成復(fù)位周期
- return (flag);
-
- }
- uchar Ds18b20InitS()
- {
- bit flag;
- DSPORTS = 1;
- delay_1us();
- DSPORTS = 0;
- delay_us(255); //將總線拉低480us~960us
- DSPORTS = 1; //然后拉高總線,如果DS18B20做出反應(yīng)會將在15us~60us后總線拉低
- delay_us(30); //等待15-60微秒,18b20作出回應(yīng)
- flag=DSPORTS; //檢測是否為低電平
- delay_us(255);
- delay_us(255); //延時足夠長,最少480us,完成復(fù)位周期
- return (flag);
-
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20WriteByte
- * 函數(shù)功能 : 向18B20寫入一個字節(jié)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Ds18b20WriteByte(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DSPORT=1;
- delay_1us();//稍作延時
- DSPORT=0;//啟動寫時序
- DSPORT=dat&0x01;//向數(shù)據(jù)線傳送最低位
- delay_us(40);//延時約50us,供18b20采樣數(shù)據(jù)
- 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;//向數(shù)據(jù)線傳送最低位
- delay_us(40);//延時約50us,供18b20采樣數(shù)據(jù)
- 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;//向數(shù)據(jù)線傳送最低位
- delay_us(40);//延時約50us,供18b20采樣數(shù)據(jù)
- DSPORTS=1;//釋放總線
- delay_1us();
- dat>>=1;//右移一位
- }
- delay_us(2);//寫完一個指令稍作延時
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20ReadByte
- * 函數(shù)功能 : 讀取一個字節(jié)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- 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,主機(jī)采樣
- 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,主機(jī)采樣
- 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,主機(jī)采樣
- dat>>=1;//先右移一位,使最高位為0
- if(DSPORTS==1)
- dat|=0x80;//與10000000或,dat=10000000
- else
- dat|=0x00;//取值為0
- delay_us(50);
- }
- return(dat);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20ChangTemp
- * 函數(shù)功能 : 讓18b20開始轉(zhuǎn)換溫度
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Ds18b20ChangTemp()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令
- //Delay1ms(100); //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個延時了
- }
- void Ds18b20ChangTempN()
- {
- Ds18b20InitN();
- Delay1ms(1);
- Ds18b20WriteByteN(0xcc); //跳過ROM操作命令
- Ds18b20WriteByteN(0x44); //溫度轉(zhuǎn)換命令
- //Delay1ms(100); //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個延時了
- }
- void Ds18b20ChangTempS()
- {
- Ds18b20InitS();
- Delay1ms(1);
- Ds18b20WriteByteS(0xcc); //跳過ROM操作命令
- Ds18b20WriteByteS(0x44); //溫度轉(zhuǎn)換命令
- //Delay1ms(100); //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個延時了
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20ReadTempCom
- * 函數(shù)功能 : 發(fā)送讀取溫度命令
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Ds18b20ReadTempCom()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令
- }
- void Ds18b20ReadTempComN()
- {
- Ds18b20InitN();
- Delay1ms(1);
- Ds18b20WriteByteN(0xcc); //跳過ROM操作命令
- Ds18b20WriteByteN(0xbe); //發(fā)送讀取溫度命令
- }
- void Ds18b20ReadTempComS()
- {
- Ds18b20InitS();
- Delay1ms(1);
- Ds18b20WriteByteS(0xcc); //跳過ROM操作命令
- Ds18b20WriteByteS(0xbe); //發(fā)送讀取溫度命令
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20ReadTemp
- * 函數(shù)功能 : 讀取溫度
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- int Ds18b20ReadTemp()
- {
- int temp = 0;
- uchar tmh, tml;
- Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令
- Ds18b20ReadTempCom(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
- tml = Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節(jié)
- tmh = Ds18b20ReadByte(); //再讀高字節(jié)
- temp = tmh;
- temp <<= 8;
- temp |= tml;
- return temp;
- }
- int Ds18b20ReadTempN()
- {
- int temp = 0;
- uchar tmh, tml;
- Ds18b20ChangTempN(); //先寫入轉(zhuǎn)換命令
- Ds18b20ReadTempComN(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
- tml = Ds18b20ReadByteN(); //讀取溫度值共16位,先讀低字節(jié)
- tmh = Ds18b20ReadByteN(); //再讀高字節(jié)
- temp = tmh;
- temp <<= 8;
- temp |= tml;
- return temp;
- }
- int Ds18b20ReadTempS()
- {
- int temp = 0;
- uchar tmh, tml;
- Ds18b20ChangTempS(); //先寫入轉(zhuǎn)換命令
- Ds18b20ReadTempComS(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
- tml = Ds18b20ReadByteS(); //讀取溫度值共16位,先讀低字節(jié)
- tmh = Ds18b20ReadByteS(); //再讀高字節(jié)
- 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 串口結(jié)束
- void IIC_writeByte(char temp); // IIC 串口寫1個字節(jié)
- void LCD_write_command(char comm); // 1602寫命令
- void LCD_write_data(char data1); // 1602寫數(shù)據(jù)
- 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; // 車外溫度接口
- //--聲明全局函數(shù)--//
- void Delay1ms(uint );
- uchar Ds18b20Init();
- void Ds18b20WriteByte(uchar com);
- uchar Ds18b20ReadByte();
- void Ds18b20ChangTemp();
- void Ds18b20ReadTempCom();
- int Ds18b20ReadTemp();
- sbit DSPORTN=P2^2; // 車內(nèi)溫度接口
- //--聲明全局函數(shù)--//
- uchar Ds18b20InitN();
- void Ds18b20WriteByteN(uchar com);
- uchar Ds18b20ReadByteN();
- void Ds18b20ChangTempN();
- void Ds18b20ReadTempComN();
- int Ds18b20ReadTempN();
- sbit DSPORTS=P2^3; // 水溫度接口
- //--聲明全局函數(shù)--//
- uchar Ds18b20InitS();
- void Ds18b20WriteByteS(uchar com);
- uchar Ds18b20ReadByteS();
- void Ds18b20ChangTempS();
- void Ds18b20ReadTempComS();
- int Ds18b20ReadTempS();
- //****************************************
- #endif
復(fù)制代碼
|
|