搜索
bottom↓
回复: 19

求帮助,关于ds18b20模块化编程遇到问题

[复制链接]

出0入0汤圆

发表于 2014-9-23 22:42:58 | 显示全部楼层 |阅读模式
对于模块化编程属于初学,一直无法理清思路。今天用模块化思想编写ds18b20的程序,发现报错了,可悲的是完全不知道自己哪里出了问题,求大神们帮忙理清一下思路

----------------------------------------------------------------------------------------主函数

#include <reg52.h>
#include "delay.h"
#include "ds18b20.h"


void main(void)
{
        while(1)
        {
                get_temp();
        }
}




----------------------------------------------------------------------------------------ds18b20的C文件ds18b20.c

#include <reg52.h>
#include "delay.h"
#include "ds18b20.h"
sbit ds=P2^2;
uint temp;
float f_temp;

/*********ds18b20的初始化*********//
void init_ds()
{
        uint i;
        ds=0;
        i=103;
        while(i>0)
                i--;
        ds=1;
        i=4;
        while(i>0)
                i--;
}


/********读1位数据函数*************//
bit tempreadbit(void)
{
        uint i;
        bit dat;
        ds=0;
        i++;   //起延时作用
        ds=1;
        i++;i++;
        dat=ds;
        i=8;
        while(i>0)
                i--;
        return(dat);
}


/*******读一个字节数据函数***********//
uchar tempread(void)
{
        uchar i,j,dat;
        dat=0;
        for(i=1;i<=8;i++)
        {
                j=tempreadbit();
                dat=(j<<7)|(dat>>1);
        }
        return(dat);
}


/*******写一个字节数据函数************//
void tempwritebyte(uchar dat)
{
        uint i;
        uchar j;
        bit testb;
        for(j=1;j<=8;j++)
        {
                testb=dat&0x01;
                dat=dat>>1;
                if(testb)
                {
                        ds=0;
                        i++;i++;
                        ds=1;
                        i=8;
                        while(i>0)
                                i--;
                }
                else
                {
                        ds=0;
                        i=8;
                        while(i>0)
                                i--;
                        ds=1;
                        i++;i++;
                }
        }
}


/********开始获取温度并转换*******//
{
        init_ds();
        delay(1);
        tempwritebyte(0xcc);  //写跳过读ROM指令
        tempwritebyte(0x44);        //写温度转换指令
}


/********读取寄存器中存储的温度数据***//
        uint get_temp()
{
        uchar a,b;
        init_ds();
        delay(1);
        tempwritebyte(0xcc);
        tempwritebyte(0xbe);
        a=tempread();
        b=tempread();
        temp=b;
        temp<<=8;
        temp=temp|a;
        f_temp=temp*0.0625;
        temp=f_temp*10+0.5;
        f_temp=f_temp+0.05;
        return temp;
}



----------------------------------------------------------------------------------------ds18b20的H文件ds18b20.h---------------------------------

#ifndef _DS18B20_H__
#define _Ds18B20_H__
extern  get_temp();
#endif


----------------------------------------------------------------------------------------下面是定义函数和延时函数一起的,原谅我只会define-----------------------------------------------------------------------------------------

C文件

#include <reg52.h>
#include "delay.h"
//#define uchar unsigned char
//#define uint unsigned int
void delay(uint z)//延时函数
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}



H文件

#ifndef _DELAY_H__
#define _DELAY_H__
#define uchar unsigned char
#define uint unsigned int
extern delay(uint);
#endif

----------------------------------------------------------------------------------------下面是报的错
SRC\DS18B20.C(8): error C141: syntax error near '/'

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-9-23 23:18:15 | 显示全部楼层
错误是在最后一个C文件中被你注释掉两行吗
//#define uchar unsigned char
//#define uint unsigned int

在这个文件中加入#include "DELAY.h"

出0入0汤圆

发表于 2014-9-23 23:19:43 | 显示全部楼层
这样的询问帖基本没人会看的……好像有寻问贴发帖格式规范的,你可以查查

出0入4汤圆

发表于 2014-9-23 23:54:02 | 显示全部楼层
“/********读取寄存器中存储的温度数据***/" 是一行完整的注释,右边多一个"/"当然报错啦
再仔细看看:
                          /*********ds18b20的初始化*********//
                          /********读1位数据函数*************//
                          /********读取寄存器中存储的温度数据***//
是不是?

出0入0汤圆

发表于 2014-9-23 23:55:03 | 显示全部楼层

/*********ds18b20的初始化*********//
后面多了个“/”
全部注释都是
应该写成:
/*********ds18b20的初始化*********/

出0入0汤圆

发表于 2014-9-23 23:57:19 | 显示全部楼层
error C141: syntax error near '/'

出0入4汤圆

发表于 2014-9-24 00:03:17 | 显示全部楼层
两种注释体-- ” //xx " 和 “ /* xx */ " 的作用范围是截然不同的:
       // xx  是从 " // " 开始,一直到本行末尾,都被注释掉了;
       /* xx */  仅仅是注释掉前后符号”夹住“的部分!

出0入0汤圆

发表于 2014-9-24 08:38:06 | 显示全部楼层
新手会碰到的,

出0入0汤圆

发表于 2014-9-24 08:54:24 | 显示全部楼层
这个,还是自己好好根据错误信息看一看, 语法没错误 要是实在出不来, 就去网上找找参考资料, 这个资料还是蛮多的, 我大学的时候,光这个东西就用过很多次,

出0入0汤圆

发表于 2014-9-24 12:00:07 | 显示全部楼层
楼主可以调用别人写好的标准程序。研究底层的话,Maxim手册是最好的选择。

出0入0汤圆

发表于 2014-9-24 12:35:04 | 显示全部楼层
可能有些无法显示的字符,我有的时候会尝试去删除空格

出0入0汤圆

 楼主| 发表于 2014-9-24 13:13:32 | 显示全部楼层
3楼4楼5楼说的是
修改完成后又出现了SRC\DS18B20.C(98): error C231: 'get_temp': redefinition
要被错误埋起来了
我在哪里有重复定义呀,这个需要怎么看呢,求各路大神分析下
就是在main.c主函数包涵声明,是为了声明一个函数,在主函数就不会出现该函数未声明的情况
那假如该函数里又包含了其他函数呢,比如我get_temp里还包涵了init_ds,那么init_ds这个不是未声明吗?运行过程不会报错吗?
还有一个是为什么ds18b20.c一定要包涵ds18b20.h呢?
其实有一篇模块化编程那个文章看了几遍,还有有点不太理解
模块化它的运行是怎么运行的呀~因为大一C语言刚学完,一般都是写在一个C文件里,所以模块化有点让人懊恼,请各位不要见怪

出0入0汤圆

发表于 2014-9-24 13:46:17 来自手机 | 显示全部楼层
顶楼主。。。。

出0入0汤圆

发表于 2014-9-24 14:58:42 | 显示全部楼层
有时间帮你找找问题

出0入0汤圆

发表于 2014-9-24 15:01:08 | 显示全部楼层
你的程序还有问题!
       while(1)
        {
                get_temp();
加入延时
        }

出0入0汤圆

发表于 2014-9-24 15:08:10 | 显示全部楼层
美信网站的上参考资料上有例子可以参考,有完整的代码和流程。见附件

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-9-24 15:17:09 | 显示全部楼层
/********开始获取温度并转换*******//
{
        init_ds();
        delay(1);
        tempwritebyte(0xcc);  //写跳过读ROM指令
        tempwritebyte(0x44);        //写温度转换指令
}

这是什么,没有函数头?

出0入0汤圆

发表于 2014-9-24 15:34:40 | 显示全部楼层
我帮你找到问题了,问题有两类:
问题一:还是  
/********开始获取温度并转换*******//
{
        init_ds();
        delay(1);
        tempwritebyte(0xcc);  //写跳过读ROM指令
        tempwritebyte(0x44);        //写温度转换指令
}
重复,你仔细看看和紧挨着下一个函数里的函数类似吗?   看看有什么作用,直接删掉。
问题二:在头文件中多次出现 extern delay(uint z);   extern  get_temp();   你发现什么了吗? 是不是没有函数返回值类型。  分别改成  extern void delay(uint z);      extern  uint get_temp();

目前大概有以上两类问题。
如果你编译还有问题,再追问吧!

出0入0汤圆

发表于 2014-9-24 15:35:09 | 显示全部楼层
本帖最后由 Samzzt 于 2014-9-24 15:37 编辑

LZ解决了么?

出0入0汤圆

发表于 2014-9-24 18:21:23 | 显示全部楼层
extern  uint get_temp();

话说论坛发帖不是有代码格式的么。这么看可真费劲。



/********开始获取温度并转换*******//
{
        init_ds();
        delay(1);
        tempwritebyte(0xcc);  //写跳过读ROM指令
        tempwritebyte(0x44);        //写温度转换指令
}

这是什么?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 02:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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