|
10黑幣
1602顯示18B20測(cè)溫加串口;各位大佬幫我看一下這個(gè)問題咋改啊
main.c(65): error C214: illegal pointer conversion
單片機(jī)源程序如下:
- /****************************************************************
- * 實(shí) 驗(yàn) 名 :DS18B20溫度實(shí)驗(yàn)
- * 實(shí)驗(yàn)說明 :數(shù)碼管顯示當(dāng)前溫度
- * 連接方式 :將DS18B20插到數(shù)字溫度檢測(cè)模塊的U5上(注意方向),DS_RD接P2.2
- *****************************************************************/
- //包含文件
- #include <reg52.h>
- #include <intrins.h>
- #include "lcd.h"
- //宏定義
- #define BAUD 9600 //波特率設(shè)置,bps
- #define FOSC 11059200L //晶振設(shè)置,默認(rèn)使用11.0592M Hz
- //#define FOSC 12000000L //晶振設(shè)置,使用12M Hz
- //#define FOSC 24000000L //晶振設(shè)置,使用24M Hz
- //IO接口定義
- #define uchar unsigned char
- #define uint unsigned int
- #define LED_PORT P0
- sbit DQ = P2^2; //定義DS18B20端口DQ
- void SWC(unsigned char hang,unsigned char lie,unsigned char *p);
- //全局變量定義
- uchar temperature;
- uchar temperature_dec;
- uchar qian,bai,shi,ge;
- //LED顯示字模 0-F 共陽(yáng)模式
- static unsigned char DisNum = 0; //顯示用指針
- unsigned char code table[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','C'};//{0Xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
- unsigned char disbuff[4] ={ 0,0,0,0,};
- uchar RomCode[8]; //DS18B20中的RomCode
- /*******************************************************************************
- * 函 數(shù) 名 :Delayms
- * 函數(shù)功能 :實(shí)現(xiàn) ms級(jí)的延時(shí)
- * 輸 入 :ms
- * 輸 出 :無(wú)
- *******************************************************************************/
- void Delayms(uint ms)
- {
- uint i,j;
- for(i=0;i<ms;i++)
- #if FOSC == 11059200L
- for(j=0;j<114;j++);
- #elif FOSC == 12000000L
- for(j=0;j<123;j++);
- #elif FOSC == 24000000L
- for(j=0;j<249;j++);
- #else
- for(j=0;j<114;j++);
- #endif
- }
- /*******************************************************************************
- * 函 數(shù) 名 :LEDdisplay
- * 函數(shù)功能 :循環(huán)顯示各個(gè)位上的數(shù)據(jù)
- * 輸 入 :num要顯示的數(shù)據(jù)
- * 輸 出 :無(wú)
- *******************************************************************************/
- void LEDdisplay()
- {
- disbuff[0]=qian;
- disbuff[1]=bai;
- disbuff[2]=shi;
- disbuff[3]=ge;
- SWC(0, 1, table[disbuff[0]]);
- SWC(1, 1, table[disbuff[1]]);
- SWC(2, 1, table[disbuff[2]]);
- SWC(3, 1, table[disbuff[3]]);
- // SWC(4, 1, table[10]);//顯示點(diǎn)
- // SWC(5, 1, table[disbuff[4]]);
- SWC(4, 1, table[12]);//顯示℃
-
- /*wela_1 = 1; //關(guān)閉所有數(shù)碼管
- wela_2 = 1;
- wela_3 = 1;
- wela_4 = 1;
- wela_4=0; //顯示千位
- LED_PORT=table[qian];
- Delayms(1);
- LED_PORT = 0xff;
- wela_4=1;
-
- wela_3=0; //顯示百位
- LED_PORT=table[bai];
- Delayms(1);
- LED_PORT = 0xff;
- wela_3=1;
-
- wela_2=0; //顯示十位
- LED_PORT=table[shi] & 0x7F;
- Delayms(1);
- LED_PORT = 0xff;
- wela_2=1;
-
- wela_1=0; //顯示個(gè)位
- LED_PORT=table[ge];
- Delayms(1);
- LED_PORT = 0xff;*/
-
- }
- /*******************************************************************/
- /*us級(jí)延時(shí)函數(shù) 執(zhí)行一次US--所需6.5us進(jìn)入一次函數(shù)需要11.95us */
- /*******************************************************************/
- void Delay(uint num)
- {
- while( --num ) ;
- }
- /*******************************************************************/
- /*初始化ds1820 */
- /*******************************************************************/
- bit Init_DS18B20(void)
- {
- bit presence;
- DQ = 1; //DQ復(fù)位
- Delay(8); //稍做延時(shí)
- DQ = 0; //單片機(jī)將DQ拉低
- Delay(90); //精確延時(shí) 大于 480us
- DQ = 1; //拉高總線
- Delay(4); //稍做延時(shí)
- presence = DQ; //如果=0則初始化成功 =1則初始化失敗
- Delay(20); //稍做延時(shí)
- DQ = 1;
- return(presence); //返信號(hào),0=presence,1= no presence
- }
- /*******************************************************************/
- /* 讀一個(gè)字節(jié) */
- /*******************************************************************/
- uchar ReadOneChar(void)
- {
- uchar i = 0;
- uchar dat = 0;
- for (i = 8; i > 0; i--)//循環(huán)8次,通過dat變量的依次右移裝入8位數(shù)據(jù)
- {
- DQ = 0; //單片機(jī)將DQ拉低
- dat >>= 1; //dat右移1位,準(zhǔn)備讀取1位數(shù)據(jù)
- DQ = 1; //單片機(jī)將DQ拉高
- if(DQ) //判斷DQ狀態(tài),DQ=1則dat的最高位為1,DQ=0則dat的最高位為0
- dat |= 0x80;//dat或10000000,控制dat的最高位:DQ=1則為1,DQ=0則為0
- //proteus仿真設(shè)置為Delay(40)
- Delay(40); //延時(shí)
- //Delay(4);
- }
- return (dat); //返回值dat即為讀到的一字節(jié)數(shù)據(jù)
- }
- /*******************************************************************/
- /* 寫一個(gè)字節(jié) */
- /*******************************************************************/
- void WriteOneChar(uchar dat)
- {
- uchar i = 0;
- for (i = 8; i > 0; i--)//循環(huán)8次,通過dat變量的依次右移發(fā)出8位數(shù)據(jù)
- {
- DQ = 0; //單片機(jī)將DQ拉低
- DQ = dat&0x01; //DQ=dat與00000001,則DQ=dat的最低位(0或1)
- Delay(5); //延時(shí)
- DQ = 1; //單片機(jī)將DQ拉高
- dat>>=1; //dat右移1位,準(zhǔn)備取下一位數(shù)據(jù)
- }
- }
- /*******************************************************************/
- /* 溫度報(bào)警值寫入DS18B20 */
- /*******************************************************************/
- void Write_Temperature_alarm(uchar Temp_h , uchar Temp_l)
- {
- Init_DS18B20(); //初始化
- WriteOneChar(0xCC); //跳過讀序列號(hào)的操作
- WriteOneChar(0x4e); //將設(shè)定的溫度報(bào)警值寫入 DS18B20
- WriteOneChar(Temp_h); //寫TH
- WriteOneChar(Temp_l); //寫TL
- WriteOneChar(0x7f); //12位精確度
- Init_DS18B20(); //初始化
- WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
- WriteOneChar(0x48); //把暫存器里的溫度報(bào)警值拷貝到EEROM
- }
- /*******************************************************************/
- /* 讀取64位序列碼 */
- /*******************************************************************/
- void Read_RomCord(void)
- {
- uchar j;
- Init_DS18B20(); //初始化
- WriteOneChar(0x33); // 讀序列碼的操作命令
- for (j = 0; j < 8; j++)
- {
- RomCode[j] = ReadOneChar() ;
- }
- }
- /*******************************************************************/
- /*DS18B20的CRC8校驗(yàn)程序 */
- /*******************************************************************/
- uchar CRC8()
- {
- uchar i,x;
- uchar crcbuff,crc;
- crc=0;
- for(x = 0; x <8; x++)
- {
- crcbuff=RomCode[x];
- for(i = 0; i < 8; i++)
- {
- if(((crc ^ crcbuff)&0x01)==0)
- crc >>= 1;
- else
- {
- crc ^= 0x18; //CRC=X8+X5+X4+1
- crc >>= 1;
- crc |= 0x80;
- }
- crcbuff >>= 1;
- }
- }
- return crc;
- }
- /*******************************************************************/
- /* 讀取溫度 */
- /*******************************************************************/
- uchar* Read_Temperature(void)
- {
- //unsigned char i;
- uchar temp_comp[2];
- uchar temp_data[2];
- uchar temp_alarm[2];
- //unsigned int t;
- Init_DS18B20(); //初始化
- WriteOneChar(0xCC); //跳過讀序列號(hào)的操作
- WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
- Init_DS18B20(); //初始化
- //實(shí)際器件:匹配ROM或跳過序列號(hào)均可
- //WriteOneChar(0x55); //匹配ROM命令
- //for(i=0;i<8;i++)
- // WriteOneChar(RomCode[i]);
- //proteus仿真:跳過序列號(hào)
- WriteOneChar(0xCC); //跳過讀序列號(hào)的操作
- WriteOneChar(0xBE); //讀取溫度寄存器
-
- temp_data[0] = ReadOneChar(); //溫度低8位
- temp_data[1] = ReadOneChar(); //溫度高8位
- temp_alarm[0] = ReadOneChar(); //溫度報(bào)警TH
- temp_alarm[1] = ReadOneChar(); //溫度報(bào)警TL
- temp_comp[0]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//取溫度整數(shù)值
- temp_comp[1] = temp_data[0]&0x0f;//讀取小數(shù)
- //課件程序:
- //t=temp_data[1];
- //t<<=8;
- //t=t|temp_data[0];
- //temp_comp=t*0.0625;
- return &temp_comp;
- }
- /*******************************************************************************
- * 函 數(shù) 名 :UsartConfiguration
- * 函數(shù)功能 :串口設(shè)置
- * 輸 入 :無(wú)
- * 輸 出 :無(wú)
- *******************************************************************************/
- void UsartConfiguration()
- {
- SCON = 0X50; //設(shè)置為工作方式1:10位異步收發(fā)器
- TMOD |= 0x20; //設(shè)置計(jì)數(shù)器工作方式2:8位自動(dòng)重裝計(jì)數(shù)器
- PCON = 0X80; //波特率加倍:SMOD = 1
- TH1 = 256 -(FOSC/12/32/(BAUD/2)); //計(jì)算定時(shí)器1初值
- TL1 = 256 -(FOSC/12/32/(BAUD/2));
- TR1 = 1;//啟動(dòng)定時(shí)器T1
- ES=1; //開串口中斷
- EA = 1; //開總中斷
- }
- /*******************************************************************************
- * 函 數(shù) 名 :UsartSendTemper
- * 函數(shù)功能 :串口發(fā)送溫度
- * 輸 入 :無(wú)
- * 輸 出 :無(wú)
- *******************************************************************************/
- void UsartSendTemper()
- {
- //發(fā)送 T
- TI = 0; //清除發(fā)送中斷標(biāo)志位TI
- SBUF='T'; //收到的數(shù)據(jù)放入到發(fā)送SBUF,啟動(dòng)串口發(fā)送
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
- //發(fā)送 :
- TI = 0; //清除發(fā)送中斷標(biāo)志位TI
- SBUF=':'; //收到的數(shù)據(jù)放入到發(fā)送SBUF,啟動(dòng)串口發(fā)送
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
- //發(fā)送溫度十位
- TI = 0; //清除發(fā)送中斷標(biāo)志位TI
- SBUF=temperature/10+'0';//收到的數(shù)據(jù)放入到發(fā)送SBUF,啟動(dòng)串口發(fā)送
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
- //發(fā)送溫度個(gè)位
- TI = 0; //清除發(fā)送中斷標(biāo)志位TI
- SBUF=temperature%10+'0';//收到的數(shù)據(jù)放入到發(fā)送SBUF,啟動(dòng)串口發(fā)送
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
- //發(fā)送小數(shù)點(diǎn)
- TI = 0; //清除發(fā)送中斷標(biāo)志位TI
- SBUF='.';//收到的數(shù)據(jù)放入到發(fā)送SBUF,啟動(dòng)串口發(fā)送
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
-
- //發(fā)送溫度小數(shù)位
- TI = 0; //清除發(fā)送中斷標(biāo)志位TI
- SBUF=temperature_dec+'0';//收到的數(shù)據(jù)放入到發(fā)送SBUF,啟動(dòng)串口發(fā)送
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
-
- //發(fā)送換行符
- TI = 0; //清除發(fā)送中斷標(biāo)志位TI
- SBUF='\n'; //收到的數(shù)據(jù)放入到發(fā)送SBUF,啟動(dòng)串口發(fā)送
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
- TI=0;
-
- }
- /*******************************************************************/
- /* 主函數(shù) */
- /*******************************************************************/
- void main(void)
- {
- unsigned char* temp;
- InitLcd1602();
- int count = 0;
- temperature = 0;
- SWC(0, 0,"temperature;");
- //proteus仿真:不讀取64位序列碼
- //Read_RomCord(); //讀取64位序列碼
- UsartConfiguration();//串口配置
- while(1)
- {
- if(count >= 200)//采集周期1s
- {
- temp = Read_Temperature(); //讀取溫度
- temperature = temp[0];
- temperature_dec = temp[1]*0.625;
- count = 0;
- UsartSendTemper();//串口發(fā)送溫度
- }
- qian=temperature/100;
- bai=temperature%100/10;
- shi=temperature%10;
- ge=temperature_dec;
- LEDdisplay();//顯示溫度
-
- count++;
- }
- }
復(fù)制代碼
|
|