[51单片机] 求大神帮忙看看这个程序,用KEil运行有个错

[复制链接]
3985|34
 楼主| 彭麟 发表于 2015-5-25 11:22 | 显示全部楼层 |阅读模式
#include <AT89X51.H>
#include<stdio.h>

#include "ds18b20.h"


#define u8 unsigned char
#define u16 unsigned int

#define ds18b20 unsigned char

#define line01 0x80
#define line02 0xc0
#define DATA_BUS P0

sbit DQ=P3^4;                        // ds18b20与单片机连接口
sbit EN=P1^2;                           // lcd1602控制
sbit RS=P1^0;                        // lcd1602与单片机控制接口
sbit RW=P1^1;                        // lcd1602控制
sbit fengming=P1^6;   //蜂鸣器控制端

sbit MOTOR1=P3^3;                // 电机1控制端


sbit Set_Clock=P1^3;                // 调定时控制

sbit Key_up=P1^4;                // +1操作键
sbit Key_dn=P1^5;                // -1操作键


u8 code str1[]={"wendu"};
u8 code str2[]={"shidu"};
u8 disdata[5];
u16 Temperature;                // 检测到的温度(扩大了10倍)
u16 Temperature_H=100;                // 预设的高温控制温度(扩大了10倍)
u16 Temperature_L=000;

/*************************lcd1602程序**************************/
void delay1ms(u16 ms)        // 非精确延时1毫秒
{
        u8 i,j;
        for(;ms>0;ms--)
        for(i=2;i>0;i--)
        for(j=250;j>0;j--);
}

void wr_com(u8 com)                // LCD1602写指令//
{  
        delay1ms(1);
        EN=0;
        RS=0;
        RW=0;

        DATA_BUS=com;
        delay1ms(1);
        EN=1;
        delay1ms(1);
        EN=0;
  }

void wr_dat(u8 dat)                // LCD1602写数据//
{  
        delay1ms(1);;
        RS=1;
        RW=0;
        EN=0;
        DATA_BUS=dat;
        delay1ms(1);
        EN=1;
        delay1ms(1);
        EN=0;
}

void lcd_init()                        // 初始化设置 //
{
        delay1ms(15);
        wr_com(0x38);delay1ms(5);
        wr_com(0x08);delay1ms(5);
        wr_com(0x01);delay1ms(5);
        wr_com(0x06);delay1ms(5);
        wr_com(0x0c);delay1ms(5);
}

void Display_String(u8 *p)        // 写字符串函数
{
        while(*p!='\0')
        {
                wr_dat(*p);
                p++;
                delay1ms(10);
        }
}

void Init_Display_String()        //初始化显示
{
        lcd_init();
        wr_com(0x80);
        Display_String("Wlcome to  !");
        wr_com(0xc0);
        Display_String("   2015-06-06   ");
}
/******************************ds1820程序***************************************/
void delay_1820(u8 i)                // 延时i微秒
{
        for(;i>0;i--);
}

   ds1820 rst()                //*ds1820复位*/                            (就是这一行出错)



****************************************************************
(这是后面的程序)
{  
        u8 x=0;
        DQ = 1;                  // DQ复位
        delay_18B20(4);          // 延时
        DQ = 0;                  // DQ拉低
        delay_18B20(100);         // 精确延时大于480us
        DQ = 1;                  // 拉高
        delay_18B20(40);         
}

u8 ds1820rd()                        //*读数据*/
{
        u8 i=0;
        u8 dat = 0;
        for (i=8;i>0;i--)
        {   
                DQ = 0;         //给脉冲信号
                dat>>=1;
                DQ = 1;         //给脉冲信号
                if(DQ)
                dat|=0x80;
                delay_18B20(10);
         }
        return(dat);
}

void ds1820wr(u8 wdata)                //*写数据*/
{
        u8 i=0;
        for (i=8; i>0; i--)
        {
                DQ = 0;
                DQ = wdata&0x01;
                delay_18B20(10);
                DQ = 1;
                wdata>>=1;
   }
}


void Read_Temperature()                //*读取温度值并转换*/
{
        u8 a,b;
        ds1820rst();   
        ds1820wr(0xcc);                //*跳过读序列号*/
        ds1820wr(0x44);                //*启动温度转换*/
        ds1820rst();   
        ds1820wr(0xcc);                //*跳过读序列号*/
        ds1820wr(0xbe);                //*读取温度*/
        a=ds1820rd();
        b=ds1820rd();
        Temperature=a+b*256;
            if(Temperature<=0x0fff)Temperature_flag=0;
            else
        {
                Temperature=~Temperature+1;
                Temperature_flag=1;
        }
        Temperature=Temperature*(0.625);//温度值扩大10倍,以精确到1位小数       
}

/*******************************************************************/
void Display_Temperature()//温度值显示
{
        disdata[0]=Temperature/1000+0x30;                        //百位数
        disdata[1]=Temperature/100%10+0x30;                        //十位数
        disdata[2]=Temperature/10%10+0x30;                        //个位数
        disdata[3]=Temperature%10+0x30;                                //小数位

        wr_com(0x80);
        Display_String(str1);;
        if(Temperature_flag==1)wr_dat(0x2d);                        //显示符号位
        if(disdata[0]!=0x30)wr_dat(disdata[0]);                        //显示百位
        wr_dat(disdata[1]);                                        //显示十位        
        wr_dat(disdata[2]);                                        //显示个位        
        wr_dat(0x2e);                                                //显示小数点        
        wr_dat(disdata[3]);                                        //显示小数位
        wr_dat('C');

ayb_ice 发表于 2015-5-25 14:04 | 显示全部楼层
ningling_21 发表于 2015-5-25 14:24 | 显示全部楼层
怎么个错法?
 楼主| 彭麟 发表于 2015-5-25 15:09 | 显示全部楼层
ABC.C(108): error C129: missing ';' before 'rst'
 楼主| 彭麟 发表于 2015-5-25 15:09 | 显示全部楼层

太不好意思了,忙了头昏了
 楼主| 彭麟 发表于 2015-5-25 15:10 | 显示全部楼层

不好意思啊,错误我补上了,麻烦看一下
ningling_21 发表于 2015-5-25 15:28 | 显示全部楼层
彭麟 发表于 2015-5-25 15:10
不好意思啊,错误我补上了,麻烦看一下

明显句末少了一个分号吗,加上就可以了
luofeng2g 发表于 2015-5-25 15:29 | 显示全部楼层
ayb_ice 发表于 2015-5-25 16:27 | 显示全部楼层
彭麟 发表于 2015-5-25 15:09
ABC.C(108): error C129: missing ';' before 'rst'

这都说明的很清楚了,少了分号";"
lgq_123 发表于 2015-5-25 17:21 | 显示全部楼层
ds18b20rst() ;后边少了一个;而且ds18b20 和rst之间有个空格,
 楼主| 彭麟 发表于 2015-5-25 17:24 | 显示全部楼层
本帖最后由 彭麟 于 2015-5-25 17:31 编辑
ningling_21 发表于 2015-5-25 15:28
明显句末少了一个分号吗,加上就可以了

加上分号,然后又会跳出错误来

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 彭麟 发表于 2015-5-25 17:26 | 显示全部楼层
本帖最后由 彭麟 于 2015-5-25 17:28 编辑
lgq_123 发表于 2015-5-25 17:21
ds18b20rst() ;后边少了一个;而且ds18b20 和rst之间有个空格,

我去了空格加了分号错就更多了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
19910414twzh 发表于 2015-5-25 17:34 | 显示全部楼层
ds1820 rst()                //*ds1820复位*/                            (就是这一行出错)



****************************************************************
(这是后面的程序)
{  
        u8 x=0;
        DQ = 1;                  // DQ复位
        delay_18B20(4);          // 延时
        DQ = 0;                  // DQ拉低
        delay_18B20(100);         // 精确延时大于480us
        DQ = 1;                  // 拉高
        delay_18B20(40);         
}这是??
 楼主| 彭麟 发表于 2015-5-25 17:39 | 显示全部楼层
19910414twzh 发表于 2015-5-25 17:34
ds1820 rst()                //*ds1820复位*/                            (就是这一行出错)

DS18B20的复位程序
19910414twzh 发表于 2015-5-25 17:41 | 显示全部楼层
我意思是。。。你这样写没问题吗
19910414twzh 发表于 2015-5-25 17:44 | 显示全部楼层
看前面函数的封装结构。。。。照搬改。。。
 楼主| 彭麟 发表于 2015-5-25 18:01 | 显示全部楼层
19910414twzh 发表于 2015-5-25 17:41
我意思是。。。你这样写没问题吗

这个程序有人测试过,没错吧
ningling_21 发表于 2015-5-25 18:08 | 显示全部楼层
彭麟 发表于 2015-5-25 17:26
我去了空格加了分号错就更多了

delay_18B20()  函数未定义,

楼主先去补补C语言的基础 吧
xiaox314 发表于 2015-5-25 18:20 | 显示全部楼层
楼主自己才入门吗?
  ds1820 rst()                //*ds1820复位*/                            (就是这一行出错)

****************************************************************
(这是后面的程序)


把ds1820rst()放到下面,这注释的*号也有问题,改成下面这样

/**************************************************************/
//(这是后面的程序)
ds1820 rst()                //*ds1820复位*/                            (就是这一行出错)
{
       u8 x=0;
        DQ = 1;                  // DQ复位
        delay_18B20(4);          // 延时
        DQ = 0;                  // DQ拉低
        delay_18B20(100);         // 精确延时大于480us
        DQ = 1;                  // 拉高
        delay_18B20(40);     

}
 楼主| 彭麟 发表于 2015-5-25 18:23 | 显示全部楼层
xiaox314 发表于 2015-5-25 18:20
楼主自己才入门吗?
  ds1820 rst()                //*ds1820复位*/                            (就是 ...

我是菜鸟,那段是我为了分开才这样弄得,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

53

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部