|
10黑币
1602显示18B20测温加串口;各位大佬帮我看一下这个问题咋改啊
main.c(65): error C214: illegal pointer conversion
单片机源程序如下:
- /****************************************************************
- * 实 验 名 :DS18B20温度实验
- * 实验说明 :数码管显示当前温度
- * 连接方式 :将DS18B20插到数字温度检测模块的U5上(注意方向),DS_RD接P2.2
- *****************************************************************/
- //包含文件
- #include <reg52.h>
- #include <intrins.h>
- #include "lcd.h"
- //宏定义
- #define BAUD 9600 //波特率设置,bps
- #define FOSC 11059200L //晶振设置,默认使用11.0592M Hz
- //#define FOSC 12000000L //晶振设置,使用12M Hz
- //#define FOSC 24000000L //晶振设置,使用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 共阳模式
- 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
- /*******************************************************************************
- * 函 数 名 :Delayms
- * 函数功能 :实现 ms级的延时
- * 输 入 :ms
- * 输 出 :无
- *******************************************************************************/
- 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
- }
- /*******************************************************************************
- * 函 数 名 :LEDdisplay
- * 函数功能 :循环显示各个位上的数据
- * 输 入 :num要显示的数据
- * 输 出 :无
- *******************************************************************************/
- 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]);//显示点
- // SWC(5, 1, table[disbuff[4]]);
- SWC(4, 1, table[12]);//显示℃
-
- /*wela_1 = 1; //关闭所有数码管
- 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; //显示个位
- LED_PORT=table[ge];
- Delayms(1);
- LED_PORT = 0xff;*/
-
- }
- /*******************************************************************/
- /*us级延时函数 执行一次US--所需6.5us进入一次函数需要11.95us */
- /*******************************************************************/
- void Delay(uint num)
- {
- while( --num ) ;
- }
- /*******************************************************************/
- /*初始化ds1820 */
- /*******************************************************************/
- bit Init_DS18B20(void)
- {
- bit presence;
- DQ = 1; //DQ复位
- Delay(8); //稍做延时
- DQ = 0; //单片机将DQ拉低
- Delay(90); //精确延时 大于 480us
- DQ = 1; //拉高总线
- Delay(4); //稍做延时
- presence = DQ; //如果=0则初始化成功 =1则初始化失败
- Delay(20); //稍做延时
- DQ = 1;
- return(presence); //返信号,0=presence,1= no presence
- }
- /*******************************************************************/
- /* 读一个字节 */
- /*******************************************************************/
- uchar ReadOneChar(void)
- {
- uchar i = 0;
- uchar dat = 0;
- for (i = 8; i > 0; i--)//循环8次,通过dat变量的依次右移装入8位数据
- {
- DQ = 0; //单片机将DQ拉低
- dat >>= 1; //dat右移1位,准备读取1位数据
- DQ = 1; //单片机将DQ拉高
- if(DQ) //判断DQ状态,DQ=1则dat的最高位为1,DQ=0则dat的最高位为0
- dat |= 0x80;//dat或10000000,控制dat的最高位:DQ=1则为1,DQ=0则为0
- //proteus仿真设置为Delay(40)
- Delay(40); //延时
- //Delay(4);
- }
- return (dat); //返回值dat即为读到的一字节数据
- }
- /*******************************************************************/
- /* 写一个字节 */
- /*******************************************************************/
- void WriteOneChar(uchar dat)
- {
- uchar i = 0;
- for (i = 8; i > 0; i--)//循环8次,通过dat变量的依次右移发出8位数据
- {
- DQ = 0; //单片机将DQ拉低
- DQ = dat&0x01; //DQ=dat与00000001,则DQ=dat的最低位(0或1)
- Delay(5); //延时
- DQ = 1; //单片机将DQ拉高
- dat>>=1; //dat右移1位,准备取下一位数据
- }
- }
- /*******************************************************************/
- /* 温度报警值写入DS18B20 */
- /*******************************************************************/
- void Write_Temperature_alarm(uchar Temp_h , uchar Temp_l)
- {
- Init_DS18B20(); //初始化
- WriteOneChar(0xCC); //跳过读序列号的操作
- WriteOneChar(0x4e); //将设定的温度报警值写入 DS18B20
- WriteOneChar(Temp_h); //写TH
- WriteOneChar(Temp_l); //写TL
- WriteOneChar(0x7f); //12位精确度
- Init_DS18B20(); //初始化
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0x48); //把暂存器里的温度报警值拷贝到EEROM
- }
- /*******************************************************************/
- /* 读取64位序列码 */
- /*******************************************************************/
- void Read_RomCord(void)
- {
- uchar j;
- Init_DS18B20(); //初始化
- WriteOneChar(0x33); // 读序列码的操作命令
- for (j = 0; j < 8; j++)
- {
- RomCode[j] = ReadOneChar() ;
- }
- }
- /*******************************************************************/
- /*DS18B20的CRC8校验程序 */
- /*******************************************************************/
- 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); //跳过读序列号的操作
- WriteOneChar(0x44); //启动温度转换
- Init_DS18B20(); //初始化
- //实际器件:匹配ROM或跳过序列号均可
- //WriteOneChar(0x55); //匹配ROM命令
- //for(i=0;i<8;i++)
- // WriteOneChar(RomCode[i]);
- //proteus仿真:跳过序列号
- WriteOneChar(0xCC); //跳过读序列号的操作
- WriteOneChar(0xBE); //读取温度寄存器
-
- temp_data[0] = ReadOneChar(); //温度低8位
- temp_data[1] = ReadOneChar(); //温度高8位
- temp_alarm[0] = ReadOneChar(); //温度报警TH
- temp_alarm[1] = ReadOneChar(); //温度报警TL
- temp_comp[0]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//取温度整数值
- temp_comp[1] = temp_data[0]&0x0f;//读取小数
- //课件程序:
- //t=temp_data[1];
- //t<<=8;
- //t=t|temp_data[0];
- //temp_comp=t*0.0625;
- return &temp_comp;
- }
- /*******************************************************************************
- * 函 数 名 :UsartConfiguration
- * 函数功能 :串口设置
- * 输 入 :无
- * 输 出 :无
- *******************************************************************************/
- void UsartConfiguration()
- {
- SCON = 0X50; //设置为工作方式1:10位异步收发器
- TMOD |= 0x20; //设置计数器工作方式2:8位自动重装计数器
- PCON = 0X80; //波特率加倍:SMOD = 1
- TH1 = 256 -(FOSC/12/32/(BAUD/2)); //计算定时器1初值
- TL1 = 256 -(FOSC/12/32/(BAUD/2));
- TR1 = 1;//启动定时器T1
- ES=1; //开串口中断
- EA = 1; //开总中断
- }
- /*******************************************************************************
- * 函 数 名 :UsartSendTemper
- * 函数功能 :串口发送温度
- * 输 入 :无
- * 输 出 :无
- *******************************************************************************/
- void UsartSendTemper()
- {
- //发送 T
- TI = 0; //清除发送中断标志位TI
- SBUF='T'; //收到的数据放入到发送SBUF,启动串口发送
- while(!TI); //等待发送数据完成
- //发送 :
- TI = 0; //清除发送中断标志位TI
- SBUF=':'; //收到的数据放入到发送SBUF,启动串口发送
- while(!TI); //等待发送数据完成
- //发送温度十位
- TI = 0; //清除发送中断标志位TI
- SBUF=temperature/10+'0';//收到的数据放入到发送SBUF,启动串口发送
- while(!TI); //等待发送数据完成
- //发送温度个位
- TI = 0; //清除发送中断标志位TI
- SBUF=temperature%10+'0';//收到的数据放入到发送SBUF,启动串口发送
- while(!TI); //等待发送数据完成
- //发送小数点
- TI = 0; //清除发送中断标志位TI
- SBUF='.';//收到的数据放入到发送SBUF,启动串口发送
- while(!TI); //等待发送数据完成
-
- //发送温度小数位
- TI = 0; //清除发送中断标志位TI
- SBUF=temperature_dec+'0';//收到的数据放入到发送SBUF,启动串口发送
- while(!TI); //等待发送数据完成
-
- //发送换行符
- TI = 0; //清除发送中断标志位TI
- SBUF='\n'; //收到的数据放入到发送SBUF,启动串口发送
- while(!TI); //等待发送数据完成
- TI=0;
-
- }
- /*******************************************************************/
- /* 主函数 */
- /*******************************************************************/
- 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();//串口发送温度
- }
- qian=temperature/100;
- bai=temperature%100/10;
- shi=temperature%10;
- ge=temperature_dec;
- LEDdisplay();//显示温度
-
- count++;
- }
- }
复制代码
|
|