打印
[51单片机]

求大神帮忙看看这个程序,用KEil运行有个错

[复制链接]
2768|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'

使用特权

评论回复
5
彭麟|  楼主 | 2015-5-25 15:09 | 只看该作者

太不好意思了,忙了头昏了

使用特权

评论回复
6
彭麟|  楼主 | 2015-5-25 15:10 | 只看该作者

不好意思啊,错误我补上了,麻烦看一下

使用特权

评论回复
7
ningling_21| | 2015-5-25 15:28 | 只看该作者
彭麟 发表于 2015-5-25 15:10
不好意思啊,错误我补上了,麻烦看一下

明显句末少了一个分号吗,加上就可以了

使用特权

评论回复
8
luofeng2g| | 2015-5-25 15:29 | 只看该作者

使用特权

评论回复
9
ayb_ice| | 2015-5-25 16:27 | 只看该作者
彭麟 发表于 2015-5-25 15:09
ABC.C(108): error C129: missing ';' before 'rst'

这都说明的很清楚了,少了分号";"

使用特权

评论回复
10
lgq_123| | 2015-5-25 17:21 | 只看该作者
ds18b20rst() ;后边少了一个;而且ds18b20 和rst之间有个空格,

使用特权

评论回复
11
彭麟|  楼主 | 2015-5-25 17:24 | 只看该作者
本帖最后由 彭麟 于 2015-5-25 17:31 编辑
ningling_21 发表于 2015-5-25 15:28
明显句末少了一个分号吗,加上就可以了

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

QQ截图20150525172910.png (64.66 KB )

QQ截图20150525172910.png

使用特权

评论回复
12
彭麟|  楼主 | 2015-5-25 17:26 | 只看该作者
本帖最后由 彭麟 于 2015-5-25 17:28 编辑
lgq_123 发表于 2015-5-25 17:21
ds18b20rst() ;后边少了一个;而且ds18b20 和rst之间有个空格,

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

QQ截图20150525172709.png (69.51 KB )

QQ截图20150525172709.png

使用特权

评论回复
13
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);         
}这是??

使用特权

评论回复
14
彭麟|  楼主 | 2015-5-25 17:39 | 只看该作者
19910414twzh 发表于 2015-5-25 17:34
ds1820 rst()                //*ds1820复位*/                            (就是这一行出错)

DS18B20的复位程序

使用特权

评论回复
15
19910414twzh| | 2015-5-25 17:41 | 只看该作者
我意思是。。。你这样写没问题吗

使用特权

评论回复
16
19910414twzh| | 2015-5-25 17:44 | 只看该作者
看前面函数的封装结构。。。。照搬改。。。

使用特权

评论回复
17
彭麟|  楼主 | 2015-5-25 18:01 | 只看该作者
19910414twzh 发表于 2015-5-25 17:41
我意思是。。。你这样写没问题吗

这个程序有人测试过,没错吧

使用特权

评论回复
18
ningling_21| | 2015-5-25 18:08 | 只看该作者
彭麟 发表于 2015-5-25 17:26
我去了空格加了分号错就更多了

delay_18B20()  函数未定义,

楼主先去补补C语言的基础 吧

使用特权

评论回复
19
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);     

}

使用特权

评论回复
20
彭麟|  楼主 | 2015-5-25 18:23 | 只看该作者
xiaox314 发表于 2015-5-25 18:20
楼主自己才入门吗?
  ds1820 rst()                //*ds1820复位*/                            (就是 ...

我是菜鸟,那段是我为了分开才这样弄得,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

53

帖子

0

粉丝