找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7093|回复: 2
收起左侧

error C214: illegal pointer conversion单片机编译错误

[复制链接]
ID:842962 发表于 2021-1-15 12:17 | 显示全部楼层 |阅读模式
10黑币
1602显示18B20测温加串口;各位大佬帮我看一下这个问题咋改啊
main.c(65): error C214: illegal pointer conversion

单片机源程序如下:
  1. /****************************************************************
  2. * 实 验 名 :DS18B20温度实验
  3. * 实验说明 :数码管显示当前温度
  4. * 连接方式 :将DS18B20插到数字温度检测模块的U5上(注意方向),DS_RD接P2.2
  5. *****************************************************************/
  6. //包含文件
  7. #include <reg52.h>
  8. #include <intrins.h>
  9. #include "lcd.h"
  10. //宏定义
  11. #define BAUD 9600        //波特率设置,bps
  12. #define FOSC 11059200L //晶振设置,默认使用11.0592M Hz
  13. //#define FOSC 12000000L //晶振设置,使用12M Hz
  14. //#define FOSC 24000000L //晶振设置,使用24M Hz
  15. //IO接口定义
  16. #define uchar unsigned char
  17. #define uint unsigned int
  18. #define LED_PORT P0

  19. sbit DQ = P2^2;                                        //定义DS18B20端口DQ
  20. void SWC(unsigned char hang,unsigned char lie,unsigned char *p);
  21. //全局变量定义
  22. uchar temperature;
  23. uchar temperature_dec;
  24. uchar qian,bai,shi,ge;
  25. //LED显示字模 0-F 共阳模式
  26. static unsigned char DisNum = 0; //显示用指针        
  27. 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};
  28.            unsigned char disbuff[4]           ={ 0,0,0,0,};
  29. uchar RomCode[8];         //DS18B20中的RomCode
  30. /*******************************************************************************
  31. * 函 数 名 :Delayms
  32. * 函数功能 :实现 ms级的延时
  33. * 输    入 :ms
  34. * 输    出 :无
  35. *******************************************************************************/
  36. void Delayms(uint ms)
  37. {
  38.         uint i,j;
  39.         for(i=0;i<ms;i++)
  40.         #if FOSC == 11059200L
  41.                 for(j=0;j<114;j++);
  42.         #elif FOSC == 12000000L
  43.           for(j=0;j<123;j++);
  44.         #elif FOSC == 24000000L
  45.                 for(j=0;j<249;j++);
  46.         #else
  47.                 for(j=0;j<114;j++);
  48.         #endif
  49. }
  50. /*******************************************************************************
  51. * 函 数 名 :LEDdisplay
  52. * 函数功能 :循环显示各个位上的数据
  53. * 输    入 :num要显示的数据
  54. * 输    出 :无
  55. *******************************************************************************/

  56. void LEDdisplay()
  57. {        
  58.         disbuff[0]=qian;
  59.         disbuff[1]=bai;
  60.         disbuff[2]=shi;
  61.         disbuff[3]=ge;

  62.         SWC(0, 1, table[disbuff[0]]);
  63.         SWC(1, 1, table[disbuff[1]]);
  64.         SWC(2, 1, table[disbuff[2]]);
  65.         SWC(3, 1, table[disbuff[3]]);        
  66. //        SWC(4, 1, table[10]);//显示点
  67. //        SWC(5, 1, table[disbuff[4]]);        
  68.         SWC(4, 1, table[12]);//显示℃
  69.         
  70.         /*wela_1 = 1;          //关闭所有数码管
  71.         wela_2 = 1;
  72.         wela_3 = 1;
  73.         wela_4 = 1;        

  74.         wela_4=0;  //显示千位
  75.         LED_PORT=table[qian];
  76.         Delayms(1);
  77.         LED_PORT = 0xff;
  78.         wela_4=1;
  79.         
  80.         wela_3=0;  //显示百位
  81.         LED_PORT=table[bai];
  82.         Delayms(1);
  83.         LED_PORT = 0xff;
  84.         wela_3=1;
  85.         
  86.         wela_2=0;  //显示十位
  87.         LED_PORT=table[shi] & 0x7F;
  88.         Delayms(1);
  89.         LED_PORT = 0xff;
  90.         wela_2=1;
  91.         
  92.         wela_1=0;  //显示个位
  93.         LED_PORT=table[ge];
  94.         Delayms(1);
  95.         LED_PORT = 0xff;*/
  96.         
  97. }
  98. /*******************************************************************/
  99. /*us级延时函数  执行一次US--所需6.5us进入一次函数需要11.95us                                    */
  100. /*******************************************************************/
  101. void Delay(uint num)
  102. {
  103.         while( --num ) ;
  104. }
  105. /*******************************************************************/
  106. /*初始化ds1820                                                     */
  107. /*******************************************************************/
  108. bit Init_DS18B20(void)
  109. {
  110.         bit presence;
  111.         DQ = 1;      //DQ复位
  112.         Delay(8);    //稍做延时        
  113.         DQ = 0;      //单片机将DQ拉低
  114.         Delay(90);   //精确延时 大于 480us        
  115.         DQ = 1;      //拉高总线
  116.         Delay(4);    //稍做延时         
  117.         presence = DQ; //如果=0则初始化成功 =1则初始化失败
  118.         Delay(20);  //稍做延时
  119.         DQ = 1;        
  120.         return(presence); //返信号,0=presence,1= no presence
  121. }
  122. /*******************************************************************/
  123. /* 读一个字节                                                      */
  124. /*******************************************************************/
  125. uchar ReadOneChar(void)
  126. {
  127.         uchar i = 0;
  128.         uchar dat = 0;        
  129.         for (i = 8; i > 0; i--)//循环8次,通过dat变量的依次右移装入8位数据
  130.         {
  131.                 DQ = 0;                        //单片机将DQ拉低
  132.                 dat >>= 1;                //dat右移1位,准备读取1位数据        
  133.                 DQ = 1;                        //单片机将DQ拉高               
  134.                 if(DQ)                        //判断DQ状态,DQ=1则dat的最高位为1,DQ=0则dat的最高位为0        
  135.                         dat |= 0x80;//dat或10000000,控制dat的最高位:DQ=1则为1,DQ=0则为0
  136.                 //proteus仿真设置为Delay(40)
  137.                 Delay(40);                //延时
  138.                 //Delay(4);
  139.         }
  140.         return (dat);                //返回值dat即为读到的一字节数据
  141. }
  142. /*******************************************************************/
  143. /* 写一个字节                                                      */
  144. /*******************************************************************/
  145. void  WriteOneChar(uchar dat)
  146. {
  147.         uchar i = 0;
  148.         for (i = 8; i > 0; i--)//循环8次,通过dat变量的依次右移发出8位数据
  149.         {
  150.                 DQ = 0;                        //单片机将DQ拉低
  151.                 DQ = dat&0x01;        //DQ=dat与00000001,则DQ=dat的最低位(0或1)
  152.                 Delay(5);                //延时               
  153.                 DQ = 1;                        //单片机将DQ拉高
  154.                 dat>>=1;                //dat右移1位,准备取下一位数据
  155.         }
  156. }
  157. /*******************************************************************/
  158. /* 温度报警值写入DS18B20                                           */
  159. /*******************************************************************/
  160. void Write_Temperature_alarm(uchar Temp_h , uchar Temp_l)
  161. {
  162.     Init_DS18B20();                                //初始化
  163.     WriteOneChar(0xCC);                        //跳过读序列号的操作
  164.     WriteOneChar(0x4e);                        //将设定的温度报警值写入 DS18B20
  165.         WriteOneChar(Temp_h);                //写TH
  166.         WriteOneChar(Temp_l);                //写TL
  167.     WriteOneChar(0x7f);                        //12位精确度
  168.         Init_DS18B20();                                //初始化
  169.     WriteOneChar(0xCC);                        //跳过读序号列号的操作
  170.     WriteOneChar(0x48);                        //把暂存器里的温度报警值拷贝到EEROM
  171. }
  172. /*******************************************************************/
  173. /* 读取64位序列码                                                  */
  174. /*******************************************************************/
  175. void Read_RomCord(void)
  176. {
  177.         uchar j;
  178.         Init_DS18B20();                                //初始化
  179.         WriteOneChar(0x33);                        // 读序列码的操作命令
  180.         for (j = 0; j < 8; j++)
  181.         {
  182.                 RomCode[j] = ReadOneChar() ;
  183.         }
  184. }
  185. /*******************************************************************/
  186. /*DS18B20的CRC8校验程序                                            */
  187. /*******************************************************************/
  188. uchar CRC8()
  189. {
  190.         uchar i,x;
  191.         uchar crcbuff,crc;        
  192.         crc=0;
  193.         for(x = 0; x <8; x++)
  194.         {
  195.                 crcbuff=RomCode[x];
  196.                 for(i = 0; i < 8; i++)
  197.                 {
  198.                         if(((crc ^ crcbuff)&0x01)==0)
  199.                                 crc >>= 1;
  200.                         else
  201.                         {
  202.                                 crc ^= 0x18;   //CRC=X8+X5+X4+1
  203.                                 crc >>= 1;
  204.                                 crc |= 0x80;
  205.                         }         
  206.                         crcbuff >>= 1;      
  207.                 }
  208.         }
  209.         return crc;        
  210. }        
  211. /*******************************************************************/
  212. /* 读取温度                                                        */
  213. /*******************************************************************/
  214. uchar* Read_Temperature(void)
  215. {
  216.         //unsigned char  i;
  217.         uchar temp_comp[2];        
  218.         uchar temp_data[2];
  219.         uchar temp_alarm[2];        
  220.         //unsigned int t;
  221.         Init_DS18B20();                                //初始化        
  222.         WriteOneChar(0xCC);                        //跳过读序列号的操作
  223.         WriteOneChar(0x44);                        //启动温度转换        
  224.         Init_DS18B20();                                //初始化

  225.         //实际器件:匹配ROM或跳过序列号均可        
  226.         //WriteOneChar(0x55);         //匹配ROM命令
  227.         //for(i=0;i<8;i++)
  228.         //        WriteOneChar(RomCode[i]);

  229.         //proteus仿真:跳过序列号
  230.         WriteOneChar(0xCC);                                //跳过读序列号的操作        
  231.         WriteOneChar(0xBE);                                //读取温度寄存器
  232.                
  233.         temp_data[0] = ReadOneChar();   //温度低8位
  234.         temp_data[1] = ReadOneChar();   //温度高8位
  235.         temp_alarm[0] = ReadOneChar();  //温度报警TH
  236.         temp_alarm[1] = ReadOneChar();  //温度报警TL        
  237.         temp_comp[0]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//取温度整数值
  238.         temp_comp[1] = temp_data[0]&0x0f;//读取小数
  239.         //课件程序:
  240.         //t=temp_data[1];
  241.         //t<<=8;
  242.         //t=t|temp_data[0];
  243.         //temp_comp=t*0.0625;        
  244.         return &temp_comp;                                                                                                                  
  245. }
  246. /*******************************************************************************
  247. * 函 数 名 :UsartConfiguration
  248. * 函数功能 :串口设置
  249. * 输    入 :无
  250. * 输    出 :无
  251. *******************************************************************************/
  252. void UsartConfiguration()
  253. {
  254.         SCON = 0X50;        //设置为工作方式1:10位异步收发器
  255.         TMOD |= 0x20;        //设置计数器工作方式2:8位自动重装计数器        
  256.         PCON = 0X80;        //波特率加倍:SMOD = 1
  257.         TH1 = 256 -(FOSC/12/32/(BAUD/2)); //计算定时器1初值
  258.         TL1 = 256 -(FOSC/12/32/(BAUD/2));
  259.         TR1 = 1;//启动定时器T1        
  260.         ES=1;        //开串口中断
  261.         EA = 1;        //开总中断
  262. }


  263. /*******************************************************************************
  264. * 函 数 名 :UsartSendTemper
  265. * 函数功能 :串口发送温度
  266. * 输    入 :无
  267. * 输    出 :无
  268. *******************************************************************************/
  269. void UsartSendTemper()
  270. {
  271.         //发送 T
  272.                 TI = 0;                          //清除发送中断标志位TI
  273.                 SBUF='T';                 //收到的数据放入到发送SBUF,启动串口发送
  274.                 while(!TI);                  //等待发送数据完成        
  275.         //发送 :
  276.                 TI = 0;                          //清除发送中断标志位TI
  277.                 SBUF=':';                 //收到的数据放入到发送SBUF,启动串口发送
  278.                 while(!TI);                  //等待发送数据完成
  279.         //发送温度十位
  280.                 TI = 0;                          //清除发送中断标志位TI
  281.                 SBUF=temperature/10+'0';//收到的数据放入到发送SBUF,启动串口发送
  282.                 while(!TI);                  //等待发送数据完成
  283.         //发送温度个位
  284.                 TI = 0;                          //清除发送中断标志位TI
  285.                 SBUF=temperature%10+'0';//收到的数据放入到发送SBUF,启动串口发送
  286.                 while(!TI);                  //等待发送数据完成
  287.         //发送小数点
  288.                 TI = 0;                          //清除发送中断标志位TI
  289.                 SBUF='.';//收到的数据放入到发送SBUF,启动串口发送
  290.                 while(!TI);                  //等待发送数据完成
  291.         
  292.         //发送温度小数位
  293.                 TI = 0;                          //清除发送中断标志位TI
  294.                 SBUF=temperature_dec+'0';//收到的数据放入到发送SBUF,启动串口发送
  295.                 while(!TI);                  //等待发送数据完成
  296.                
  297.         //发送换行符
  298.                 TI = 0;                          //清除发送中断标志位TI
  299.                 SBUF='\n'; //收到的数据放入到发送SBUF,启动串口发送
  300.                 while(!TI);                  //等待发送数据完成
  301.                 TI=0;         
  302.                         
  303. }
  304. /*******************************************************************/
  305. /* 主函数                                                          */
  306. /*******************************************************************/
  307. void main(void)
  308. {
  309.         unsigned char* temp;
  310.         InitLcd1602();
  311.         int count = 0;
  312.         temperature = 0;
  313.         SWC(0, 0,"temperature;");
  314.         //proteus仿真:不读取64位序列码        
  315.         //Read_RomCord();         //读取64位序列码
  316.         UsartConfiguration();//串口配置
  317.         while(1)
  318.         {
  319.                 if(count >= 200)//采集周期1s
  320.                 {
  321.                         temp = Read_Temperature();  //读取温度
  322.                         temperature = temp[0];
  323.                         temperature_dec = temp[1]*0.625;
  324.                         count = 0;
  325.                         UsartSendTemper();//串口发送温度               
  326.                 }
  327.                 qian=temperature/100;
  328.                 bai=temperature%100/10;
  329.                 shi=temperature%10;
  330.                 ge=temperature_dec;                                
  331.                 LEDdisplay();//显示温度
  332.                

  333.                 count++;
  334.         }
  335. }
复制代码

51黑论坛_DS18B20温度检测应用设计.rar

5.14 MB, 下载次数: 7

51黑论坛_DS18B20温度检测应用设计2.7z

43.87 KB, 下载次数: 5

回复

使用道具 举报

ID:842962 发表于 2021-1-15 13:08 | 显示全部楼层
51黑论坛_DS18B20温度检测应用设计 (2)这个是有问题的程序
回复

使用道具 举报

ID:879537 发表于 2021-1-27 15:32 | 显示全部楼层
#include "lcd.h" 这个我很服,还有你的延时函数,串口发送函数的声明呢?不用写吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表