向大家请教一个编程方法

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条回答
maimaige
1楼-- · 2020-01-23 14:56
 精彩回答 2  元偷偷看……
huangyiting1990
2楼-- · 2020-01-23 18:37
5楼正解,速率上满足的话,总线模式读取 应该来说最合适
wajlh
3楼-- · 2020-01-23 19:13
一个IO可以挂很多18b20,人家早就给你想好解决方案了。
javabean
4楼-- · 2020-01-24 00:37
3个方案,皆可
1、推荐你用1个IO口,然后把这些18B20都串在一起,根据地址找
2、如果你对单总线组网比较头疼,可以做个切换电路,每次选中一路,然后直接操作
3、单片机IO够用的情况下,每一路占一个IO口,至于代码,非常简单,把IO的位置作为参数传入即可,读写代码只要写一遍即可
javabean
5楼-- · 2020-01-24 05:09
另外具体IO口选择不需要lz位的无趣的switch语句,C语言位操作即可,给你一段别的程序做参考:
oid HuXi_up(uint IO_Bit)
{
unsigned char i,mask;
mask=1;
mask = _crol_(1,IO_Bit)

for(pwm_low=1;pwm_low<CYCLE;pwm_low++)
{
P1 = P1 & (~ mask);
duty=0;
while(duty<=pwm_low);
P1 = P1 ^ mask;
duty=0;
while(duty<=(CYCLE-pwm_low));
}
}
丢丢时光机
6楼-- · 2020-01-24 07:54
 精彩回答 2  元偷偷看……

一周热门 更多>