向大家请教一个编程方法

2020-01-22 12:16发布

我正在设计一个测温系统,用的18B20,测温没什么问题,问题在我的mcu上要接14路18B20,编程上就出现难题:
如果测一路,可以先定义一路IO口:
define DQ p1.0;
然后在函数里读写:
        void init(){DQ=...}
        int8 Read(){DQ=...}
现在要接14路,而单片机的IO口又不能用参数传递,这怎么处理?
我现在只能想到这样:
先挨个定义IO口
define DQ1 p1.0;
define DQ2 p1.1;
...
define DQ14 p2.7;
再在函数里判断
        void init(int8 index)
        {
                select(index)
                        case 1: DQ1...
                        case 2: DQ2...
                        ......
                        case 14: DQ14...
        }
还要在其它函数里都这么写。
可是这么写也太过繁琐,我想应该有更好的解决方法吧,只是我想不到,希望大家指点。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
22条回答
meirenai
1楼-- · 2020-01-24 07:57
楼主,我做过类似的用电子开关切换 最多可以支持36个通道,只占用8个IO,同时支持sht21和sht11
mcu5i51
2楼-- · 2020-01-24 09:02
set PIO(u8 IO,u8 BitMsk)
{
    switch(IO){
        case 0:
        P0 |= BitMsk;
        break;
        case 1:...
}
}
wxty
3楼-- · 2020-01-24 10:02
javabean 发表于 2014-8-23 10:26
3个方案,皆可
1、推荐你用1个IO口,然后把这些18B20都串在一起,根据地址找
2、如果你对单总线组网比较头 ...

给楼主提供另一种思路,14个IO口同周期操作,一个周期搞定,不用切换。
nandi
4楼-- · 2020-01-24 11:47
谢谢各位的热情解答!
首先,51的IO是不能当参数传递的,所以上面有些方法行不通,avr能不能行我不知道;
其次关于组网,我每个通道做单总线上面都挂了大概30个器件,整个主板要接400多个;
现在只能想到用形如 P1||mask 即对8个IO一组操作的方法简便一点,本质上和单个赋值是一样的。
不知道我想得对不对。
nandi
5楼-- · 2020-01-24 11:59
 精彩回答 2  元偷偷看……
nandi
6楼-- · 2020-01-24 17:55
meirenai 发表于 2014-8-23 14:12
楼主,我做过类似的用电子开关切换 最多可以支持36个通道,只占用8个IO,同时支持sht21和sht11 ...

别光说不练啊

一周热门 更多>