搜索
bottom↓
回复: 79

tyoo的KL25开源项目进行中[18B20单总线方式的多点测温系统]

[复制链接]

出0入0汤圆

发表于 2014-12-31 20:02:10 | 显示全部楼层 |阅读模式
本帖最后由 tyoo 于 2014-12-31 20:54 编辑

项目描述:
基于18B20单总线方式的多点测温系统,下位机实现18B20温度数据读取,上位机实现实时显示、编号、历史数据等处理。该项目重点目标使用单总线方式通讯距离尽量达到500米,可挂的18B20数量尽量多,要求系统稳定。参与活动的目标暂设通讯距离150米(使用超五类网线),可挂18B20数量15只(每10米1个)。

硬件原理图:
明天补上

总费用:
序号        名称        规格        数量        单价        备注
1        网线        超五类,150米        0        0        已有
2        18B20                 15        0        已有
3        打样                 1        50+22        运费22
4        其它器件                 1        10        部分已有,需要购买的不多
合计                                   82         

计划完成时间:春节前
时间安排
1-1 完成硬件
1-2 开发环境搭建

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-12-31 20:31:05 | 显示全部楼层
XD你搞两个项目做什么?

出100入101汤圆

发表于 2014-12-31 20:33:00 | 显示全部楼层
单总线方式通讯距离尽量达到500米,这个有点难度!

出0入0汤圆

发表于 2014-12-31 20:37:40 | 显示全部楼层
单总线500米?是双绞线?屏蔽吗?
觉得是奇迹

出0入0汤圆

 楼主| 发表于 2014-12-31 20:57:21 | 显示全部楼层
holts2 发表于 2014-12-31 20:31
XD你搞两个项目做什么?

多谢提醒,网络故障了一下就成这样了,已修改另一个内容。

出0入0汤圆

发表于 2014-12-31 20:59:46 | 显示全部楼层
tyoo 发表于 2014-12-31 20:57
多谢提醒,网络故障了一下就成这样了,已修改另一个内容。

请版主删一个吧,不然分不清你用哪个

出0入0汤圆

 楼主| 发表于 2014-12-31 21:15:31 | 显示全部楼层
fengyunyu 发表于 2014-12-31 20:33
单总线方式通讯距离尽量达到500米,这个有点难度!

努力吧,官网一份手册中提到过。之前已经做过200米左右挂一只和3米挂20只的,没有系统化,稳定性也不太好,一直想完善却未行动。这次正好借这个机会,不再做行动的矮子。
下面是当初找的资料,还没有详细研究。



本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-12-31 21:21:31 | 显示全部楼层
18B20总线没听过,这个能支持150M ?

出0入0汤圆

发表于 2014-12-31 22:17:24 | 显示全部楼层
试过这种总线的方式 和总线拓扑关系很大

出0入0汤圆

发表于 2014-12-31 22:19:17 | 显示全部楼层
以前做过类似的 用的是厂家的模块 数据稳定运行了两个多月 采集点大概60多个吧

出0入0汤圆

发表于 2014-12-31 22:56:18 | 显示全部楼层
单总线多点测温 ,挂这么多测温设备啊

出0入0汤圆

发表于 2014-12-31 22:57:25 | 显示全部楼层
子鱼 发表于 2014-12-31 22:19
以前做过类似的 用的是厂家的模块 数据稳定运行了两个多月 采集点大概60多个吧 ...

接了60个18B20测温 ?

出0入0汤圆

发表于 2015-1-1 07:42:17 | 显示全部楼层
等待楼主上图哈,,我好看看怎么个链接多个传感器,材料用什么比较好。。

出100入101汤圆

发表于 2015-1-1 15:36:58 | 显示全部楼层
子鱼 发表于 2014-12-31 22:19
以前做过类似的 用的是厂家的模块 数据稳定运行了两个多月 采集点大概60多个吧 ...


总线拓扑是怎么样的?

出0入0汤圆

发表于 2015-1-1 16:51:19 | 显示全部楼层
fengyunyu 发表于 2015-1-1 15:36
总线拓扑是怎么样的?

需要保证每个端点到测试点的距离等长 星形连接

出0入0汤圆

发表于 2015-1-1 17:01:03 | 显示全部楼层
子鱼 发表于 2015-1-1 16:51
需要保证每个端点到测试点的距离等长 星形连接

这样太浪费线了

出0入0汤圆

 楼主| 发表于 2015-1-1 20:56:32 | 显示全部楼层
本帖最后由 tyoo 于 2015-1-1 21:02 编辑

单总线原理图:


由于KL25芯片不好买,方案改为KL25小板+驱动板的方式,上图是一个通道的单总线驱动,驱动板尺寸与KL25小板一致,驱动通道尽量多。
PDF中还有张RJ45x3的原理图,这张是网线每10米处的转接板。
-------------------------------------------------------------
补充版权声明:本项目同意授权发布在阿莫网站,阿莫网站和飞思卡尔拥有资料的发布权和使用权。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-1-1 21:55:09 | 显示全部楼层
tyoo 发表于 2015-1-1 20:56
单总线原理图:

等待楼主上图哈。。

出0入0汤圆

发表于 2015-1-2 10:33:24 | 显示全部楼层
500米的距离,赞

出0入0汤圆

发表于 2015-1-2 12:31:18 | 显示全部楼层

能传500米吗,真难相信

出0入0汤圆

 楼主| 发表于 2015-1-2 18:14:59 | 显示全部楼层
1-2 安装了KDS、KSDK。Elipse不陌生,试用还满意,有了KSDK也就不打算去深究KL25如何使用了。

出0入0汤圆

 楼主| 发表于 2015-1-2 21:14:01 | 显示全部楼层
系统板与上位机传输协议,参与活动先实现这些简单的功能。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-1-2 22:09:54 | 显示全部楼层
这个距离感觉有难度,每次搞1-WIRE这个东西都搞得头大,期待楼主的作品。

出100入101汤圆

发表于 2015-1-2 22:14:32 | 显示全部楼层
tyoo 发表于 2015-1-1 20:56
单总线原理图:

和单片机是如何连接的?有完整的原理图么?

出0入0汤圆

发表于 2015-1-2 22:40:20 | 显示全部楼层
DPU,SPU,DRIVE这些是什么

出0入0汤圆

发表于 2015-1-3 09:23:44 | 显示全部楼层
楼主  我记得你用的这个传感器测温度其实不是很准 但是测量温度变化率是很准确的  那么请问您是如何解决这个问题的呢

出0入0汤圆

 楼主| 发表于 2015-1-3 09:23:49 | 显示全部楼层
fengyunyu 发表于 2015-1-2 22:14
和单片机是如何连接的?有完整的原理图么?

DPU/SPU/DRIVE/SENSE这些信号直接与单片机IO连接,现在只画了单通道的,如果申请能通过,待KL25到手,根据板子引出的IO设计为多个通道的,这样也省的去买MCU,暂时也不用深究KL25原理图了。

出0入0汤圆

 楼主| 发表于 2015-1-3 09:31:04 | 显示全部楼层
luckner 发表于 2015-1-3 09:23
楼主  我记得你用的这个传感器测温度其实不是很准 但是测量温度变化率是很准确的  那么请问您是如何解决这 ...

没太明白,这次活动不考虑精度这些,能稳定、正确读取温度数据即可。
根据之前的使用情况来看,同一批的几十个同时使用时差别小于0.5℃(仅遇到过1只超过1℃),波动小于0.1℃。

出0入0汤圆

 楼主| 发表于 2015-1-3 09:33:27 | 显示全部楼层
feiante116 发表于 2015-1-2 22:40
DPU,SPU,DRIVE这些是什么

DPU:上拉
SPU:强上位(预留)
DRIVE:下拉

出0入0汤圆

发表于 2015-1-3 09:34:13 | 显示全部楼层
tyoo 发表于 2015-1-3 09:31
没太明白,这次活动不考虑精度这些,能稳定、正确读取温度数据即可。
根据之前的使用情况来看,同一批的 ...

我的意思是  对的  我之前也有做过实验   发现他们的温度变化率是相同的

出0入0汤圆

发表于 2015-1-3 13:10:49 | 显示全部楼层
顶起来

出0入0汤圆

发表于 2015-1-3 18:45:28 | 显示全部楼层
单总线的时序我在想还有没有更好的处理方式比如定时器

出0入0汤圆

发表于 2015-1-3 18:56:44 | 显示全部楼层
xianghaisha 发表于 2015-1-3 18:45
单总线的时序我在想还有没有更好的处理方式比如定时器

用中断方式节省资源

出0入0汤圆

 楼主| 发表于 2015-1-3 20:28:48 | 显示全部楼层
xianghaisha 发表于 2015-1-3 18:45
单总线的时序我在想还有没有更好的处理方式比如定时器

个人感觉还是用UART处理比较好,TX/RX接SENSE,数据收发均由硬件处理,不过单片机的UART数量有限,测温点较多时不适用。

出0入0汤圆

发表于 2015-1-3 20:43:38 | 显示全部楼层
tyoo 发表于 2015-1-3 20:28
个人感觉还是用UART处理比较好,TX/RX接SENSE,数据收发均由硬件处理,不过单片机的UART数量有限,测温点 ...

可以用软件模拟啊

出0入0汤圆

 楼主| 发表于 2015-1-3 21:27:50 | 显示全部楼层
holts2 发表于 2015-1-3 20:43
可以用软件模拟啊

使用UART的优势是不占用CPU即可读写温度传感器,用软件模拟出UART再用来读写温度传感器则与直接编写读写程序无本质区别

出0入0汤圆

发表于 2015-1-3 21:31:12 | 显示全部楼层
tyoo 发表于 2015-1-3 21:27
使用UART的优势是不占用CPU即可读写温度传感器,用软件模拟出UART再用来读写温度传感器则与直接编写读写 ...


不太明白18B20和MCU的通讯是用UART ? UART通讯可以150M ?

出0入0汤圆

 楼主| 发表于 2015-1-3 21:36:35 | 显示全部楼层
holts2 发表于 2015-1-3 21:31
不太明白18B20和MCU的通讯是用UART ? UART通讯可以150M ?

1-wire总线是串行读写的,UART也是串行,调整好UART波特率,发送特定数据即可实现TX上输出控制18B20的时序

出0入0汤圆

发表于 2015-1-3 21:42:16 | 显示全部楼层
tyoo 发表于 2015-1-3 21:36
1-wire总线是串行读写的,UART也是串行,调整好UART波特率,发送特定数据即可实现TX上输出控制18B20的时 ...

还是没有整体的概念,待你弄得差不多我再来学习。

出0入0汤圆

发表于 2015-1-3 23:06:38 | 显示全部楼层
用uart的方式之前有一个网友提到过, 当时感觉想法真的很不错, 不过自己从来没试过.

出0入0汤圆

发表于 2015-1-3 23:20:53 | 显示全部楼层
没尝试过这么多这么远的 很看好楼主的创意设计 到时候回来学习下成功经验

出0入0汤圆

发表于 2015-1-4 09:49:40 | 显示全部楼层
很是期待这个大作啊。18B20在温度应用领域还是比较广泛的

出0入0汤圆

发表于 2015-1-4 12:55:45 | 显示全部楼层
tyoo 发表于 2015-1-3 21:36
1-wire总线是串行读写的,UART也是串行,调整好UART波特率,发送特定数据即可实现TX上输出控制18B20的时 ...

用UART控制18b20还是第一次听说,期待更多资料

出0入0汤圆

发表于 2015-1-5 13:23:16 | 显示全部楼层
好期待,感觉测试也是个大工程

出0入0汤圆

 楼主| 发表于 2015-1-7 14:57:26 | 显示全部楼层
本帖最后由 tyoo 于 2015-1-8 14:42 编辑

原计划做成KL25底板形式,实在等不到坛主审批就先做成单个形式。每个小板一个通道,为了省点打样费就自已拼板了。



PCB文件几次未能上传成功就放到云盘了
链接:http://pan.baidu.com/s/1bnzZGx5 密码:r60n
请大家帮忙看一下PCB有哪些需要修改,明天下班前下单打样。
另外,RJ45-TO92(双网口、18B20,每10米处转接板)做60个,1-WIRE Drive做了20个。前者我需要15个,后者需要1个,剩下的需要的网友请提前说,在下单时一并将器件配齐(需要代焊的说一声)

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-1-7 19:31:02 | 显示全部楼层
楼主,用串口方式还是模拟时序?mos管用的什么型号??

出0入0汤圆

 楼主| 发表于 2015-1-8 14:25:31 | 显示全部楼层
menghong_4 发表于 2015-1-7 19:31
楼主,用串口方式还是模拟时序?mos管用的什么型号??

对KL25不熟,软件还没开始,暂未确定用哪种方式驱动

这是选用的器件型号

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-1-8 20:46:41 | 显示全部楼层
2002年时用过DS18B20做过项目,总线上挂40个DS1820,总线长200米左右, 环境很不好,对传感器做了三防封装,用的是CD4050驱动,做过正向检测和反向仿真(为测试系统用CPU仿真40个传感器,可任意设置温度和报警及传感器故障模拟),原理图附上供参考,

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-1-9 06:34:22 来自手机 | 显示全部楼层
happyliu 发表于 2015-1-8 20:46
2002年时用过DS18B20做过项目,总线上挂40个DS1820,总线长200米左右, 环境很不好,对传感器做了三防封装 ...

程序方便贴出来学习一下吗
头像被屏蔽

出0入0汤圆

发表于 2015-1-10 16:10:43 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2015-1-12 21:35:40 | 显示全部楼层
单总线方式通讯距离尽量达到500米 ,这个有点难吧 !

出0入0汤圆

 楼主| 发表于 2015-1-15 13:57:06 | 显示全部楼层
彼岸花开@ 发表于 2015-1-1 07:42
等待楼主上图哈,,我好看看怎么个链接多个传感器,材料用什么比较好。。 ...

先做个单只的调试,网线已让工人做好,板子回来才发现RJ-45转TO-92那张板错了,图片中箭头所指是双RJ45,谁知实特两个竟是反的,引脚也是反的,板子用不了就按图中方法焊接一只先用着吧。


log:
1-15 套件已收到。软件开发环境也安装好了,昨晚把blink例程跑一下熟悉了软件使用。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-2-2 17:29:40 | 显示全部楼层
学习~~~~~~~~~~~~~

出0入0汤圆

 楼主| 发表于 2015-2-10 14:34:59 | 显示全部楼层
本打算趁年底两星期闲时把项目做完的,结果老板说这笔单结束没啥事了你就先放假回家吧,所以今晚收拾收拾就回家了。网线不方便带回去,只好把板子带回去先调通单只的。

出0入0汤圆

发表于 2015-2-10 14:46:12 | 显示全部楼层
tyoo 发表于 2015-2-10 14:34
本打算趁年底两星期闲时把项目做完的,结果老板说这笔单结束没啥事了你就先放假回家吧{:cry: ...

这下有时间调了,搞定一只,也就搞定一篇

出0入0汤圆

 楼主| 发表于 2015-2-11 07:42:41 | 显示全部楼层
armok 发表于 2015-1-10 16:10
开发套件已经在前天寄出,申通:968804636479

运费我们已经支付,广东省内1-2天到,省外3-5天到。

年前可能完成不了,放到年后正月十五可以吗

出0入0汤圆

发表于 2015-2-12 08:17:13 | 显示全部楼层
tyoo 发表于 2015-2-11 07:42
年前可能完成不了,放到年后正月十五可以吗

应该 可以的,加紧调代码

出0入0汤圆

发表于 2015-2-13 00:31:17 | 显示全部楼层
楼主的这种线是哪里买的

出0入0汤圆

 楼主| 发表于 2015-3-2 20:26:16 | 显示全部楼层
拖了这么久还没完成,非常不好意思。
今天把串口与SHELL给整好了,很久没写代码有些手生,FREESCALE不熟再加上KDS用着很不爽,调试程序很是难受。下面先贴出SHELL和串口的主要代码(这些代码主要是参考网络修改整理的,在此感谢原作者):
  1. /*
  2. * shell.c
  3. *
  4. *  Created on: 2015年3月2日
  5. *      Author:
  6. */

  7. #include "shell.h"
  8. #include "uart.h"
  9. #include "string.h"

  10. //命令缓存及标志
  11. char gCmdBuf[CMD_BUF_SIZE+1] = {0};//增加一位结束符
  12. uint_8 gCmdBufCnt = 0;//缓存计数
  13. uint_8 gCmdBufStatus = 0; //0:接收中   1: 待处理 2:缓存满

  14. int Cmd_help(int argc, char *argv[]);

  15. tCmdLineEntry g_sCmdTable[] =
  16. {
  17.     { "help",   Cmd_help,   " : Display list of commands" },
  18.     { "h",      Cmd_help,   " : alias for help" },
  19.     { "?",      Cmd_help,   " : alias for help" },
  20.     { 0, 0, 0 }
  21. };

  22. /*
  23. * Cmd_help
  24. *
  25. *  打印命令帮助信息
  26. */
  27. int Cmd_help(int argc, char *argv[])
  28. {
  29.     tCmdLineEntry *pEntry;

  30.     // Print some header text.
  31.     uart1_printf("\nAvailable commands\r\n");
  32.     uart1_printf("------------------\r\n");
  33.     // Point at the beginning of the command table.
  34.     pEntry = g_sCmdTable;
  35.     // Enter a loop to read each entry from the command table.  The
  36.     // end of the table has been reached when the command name is NULL.
  37.     while(pEntry->pcCmd)
  38.     {
  39.         // Print the command name and the brief description.
  40.             uart1_printf("%s%s\r\n", pEntry->pcCmd, pEntry->pcHelp);
  41.         // Advance to the next entry in the table.
  42.         pEntry++;
  43.     }
  44.     //
  45.     // Return success.
  46.     //
  47.     return(0);
  48. }

  49. int CmdLineProcess(char *pcCmdLine)
  50. {
  51.         static char *argv[CMDLINE_MAX_ARGS + 1];
  52.         char *pcChar;
  53.         int argc;
  54.         int bFindArg = 1;
  55.         int re = 0;
  56.         tCmdLineEntry *pCmdEntry;
  57.         //
  58.         // Initialize the argument counter, and point to the beginning of the
  59.         // command line string.
  60.         //
  61.         argc = 0;
  62.         pcChar = pcCmdLine;
  63.         //
  64.         // Advance through the command line until a zero character is found.
  65.         //
  66.         while(*pcChar)
  67.         {
  68.                 //
  69.                 // If there is a space, then replace it with a zero, and set the flag
  70.                 // to search for the next argument.
  71.                 //
  72.                 if(*pcChar == ' ')
  73.                 {
  74.                         *pcChar = 0;
  75.                         bFindArg = 1;
  76.                 }
  77.                 //
  78.                 // Otherwise it is not a space, so it must be a character that is part
  79.                 // of an argument.
  80.                 //
  81.                 else
  82.                 {
  83.                         //
  84.                         // If bFindArg is set, then that means we are looking for the start
  85.                         // of the next argument.
  86.                         //
  87.                         if(bFindArg)
  88.                         {
  89.                                 //
  90.                                 // As long as the maximum number of arguments has not been
  91.                                 // reached, then save the pointer to the start of this new arg
  92.                                 // in the argv array, and increment the count of args, argc.
  93.                                 //
  94.                                 if(argc < CMDLINE_MAX_ARGS)
  95.                                 {
  96.                                         argv[argc] = pcChar;
  97.                                         argc++;
  98.                                         bFindArg = 0;
  99.                                 }
  100.                                 //
  101.                                 // The maximum number of arguments has been reached so return
  102.                                 // the error.
  103.                                 //
  104.                                 else
  105.                                 {
  106.                                         return(CMDLINE_TOO_MANY_ARGS);
  107.                                 }
  108.                         }
  109.                 }
  110.                 //
  111.                 // Advance to the next character in the command line.
  112.                 //
  113.                 pcChar++;
  114.         }

  115.         //
  116.         // If one or more arguments was found, then process the command.
  117.         //
  118.         if(argc)
  119.         {

  120.                 //
  121.                 // Start at the beginning of the command table, to look for a matching
  122.                 // command.
  123.                 //
  124.                 pCmdEntry = g_sCmdTable;
  125.                 //
  126.                 // Search through the command table until a null command string is
  127.                 // found, which marks the end of the table.
  128.                 //
  129.                 while(pCmdEntry->pcCmd)
  130.                 {
  131.                         //
  132.                         // If this command entry command string matches argv, then call
  133.                         // the function for this command, passing the command line
  134.                         // arguments.
  135.                         //

  136.                         if(!strcmp(argv[0], pCmdEntry->pcCmd))
  137.                         {
  138.                                 re = pCmdEntry->pfnCmd(argc, argv);
  139.                                 uart1_printf("\r\n$");
  140.                         }
  141.                         //
  142.                         // Not found, so advance to the next entry.
  143.                         //
  144.                         pCmdEntry++;
  145.                 }
  146.         }
  147.         //
  148.         // Fall through to here means that no matching command was found, so return
  149.         // an error.
  150.         //
  151.         return(CMDLINE_BAD_CMD);
  152. }
复制代码

  1. /*
  2. * shell.h
  3. *
  4. *  Created on: 2015年3月2日
  5. *      Author:
  6. */

  7. #ifndef SHELL_H_
  8. #define SHELL_H_

  9. #include "common.h"    //包含公共要素头文件
  10. #include "sysinit.h"

  11. #define CMD_BUF_SIZE 100
  12. #define CMDLINE_MAX_ARGS 10

  13. #define CMDLINE_BAD_CMD 1
  14. #define CMDLINE_TOO_MANY_ARGS 2

  15. typedef int (*pfnCmdLine)(int argc, char *argv[]);

  16. //*****************************************************************************
  17. //
  18. //! Structure for an entry in the command list table.
  19. //
  20. //*****************************************************************************
  21. typedef struct
  22. {
  23.     //命令字符串
  24.     const char *pcCmd;
  25.     //命令实现函数
  26.     pfnCmdLine pfnCmd;
  27.     //命令帮助信息
  28.     const char *pcHelp;
  29. }tCmdLineEntry;

  30. extern char gCmdBuf[CMD_BUF_SIZE+1];//增加一位结束符
  31. extern uint_8 gCmdBufCnt;//缓存计数
  32. extern uint_8 gCmdBufStatus; //0:接收中   1: 待处理 2:缓存满

  33. extern int Cmd_help(int argc, char *argv[]);
  34. extern int CmdLineProcess(char *pcCmdLine);

  35. extern tCmdLineEntry g_sCmdTable[];

  36. #endif /* SHELL_H_ */
复制代码


串口苏大例程中加入了printf功能(不需要重定向的,稍加修改适用于任何开发环境哦):
  1. void uart1_printf(char* fmt, ...)
  2. {
  3.     double vargflt = 0;
  4.     int  vargint = 0;
  5.     char* vargpch = NULL;
  6.     char vargch = 0;
  7.     char* pfmt = NULL;
  8.     va_list vp;

  9.     va_start(vp, fmt);
  10.     pfmt = fmt;

  11.     while(*pfmt)
  12.     {
  13.         if(*pfmt == '%')
  14.         {
  15.             switch(*(++pfmt))
  16.             {

  17.                 case 'c':
  18.                     vargch = va_arg(vp, int);
  19.                     /*    va_arg(ap, type), if type is narrow type (char, short, float) an error is given in strict ANSI
  20.                         mode, or a warning otherwise.In non-strict ANSI mode, 'type' is allowed to be any expression. */
  21.                     printch(vargch);
  22.                     break;
  23.                 case 'd':
  24.                 case 'i':
  25.                     vargint = va_arg(vp, int);
  26.                     printdec(vargint);
  27.                     break;
  28.                 case 'f':
  29.                     vargflt = va_arg(vp, double);
  30.                     /*    va_arg(ap, type), if type is narrow type (char, short, float) an error is given in strict ANSI
  31.                         mode, or a warning otherwise.In non-strict ANSI mode, 'type' is allowed to be any expression. */
  32.                     printflt(vargflt);
  33.                     break;
  34.                 case 's':
  35.                     vargpch = va_arg(vp, char*);
  36.                     printstr(vargpch);
  37.                     break;
  38.                 case 'b':
  39.                 case 'B':
  40.                     vargint = va_arg(vp, int);
  41.                     printbin(vargint);
  42.                     break;
  43.                 case 'x':
  44.                 case 'X':
  45.                     vargint = va_arg(vp, int);
  46.                     printhex(vargint);
  47.                     break;
  48.                 case '%':
  49.                     printch('%');
  50.                     break;
  51.                 default:
  52.                     break;
  53.             }
  54.             pfmt++;
  55.         }
  56.         else
  57.         {
  58.             printch(*pfmt++);
  59.         }
  60.     }
  61.     va_end(vp);
  62. }

  63. void    printch(char ch)
  64. {
  65.     uart_send1(UART_1, ch);
  66. }

  67. void    printdec(int dec)
  68. {
  69.     if(dec==0)
  70.     {
  71.         return;
  72.     }
  73.     printdec(dec/10);
  74.     printch( (char)(dec%10 + '0'));
  75. }

  76. void    printflt(double flt)
  77. {
  78.     int tmpint = 0;

  79.     tmpint = (int)flt;
  80.     printdec(tmpint);
  81.     printch('.');
  82.     flt = flt - tmpint;
  83.     tmpint = (int)(flt * 1000000);
  84.     printdec(tmpint);
  85. }

  86. void    printstr(char* str)
  87. {
  88.     while(*str)
  89.     {
  90.         printch(*str++);
  91.     }
  92. }

  93. void    printbin(int bin)
  94. {
  95.     if(bin == 0)
  96.     {
  97.         printstr("0b");
  98.         return;
  99.     }
  100.     printbin(bin/2);
  101.     printch( (char)(bin%2 + '0'));
  102. }

  103. void    printhex(int hex)
  104. {
  105.     if(hex==0)
  106.     {
  107.         printstr("0x");
  108.         return;
  109.     }
  110.     printhex(hex/16);
  111.     if(hex < 10)
  112.     {
  113.         printch((char)(hex%16 + '0'));
  114.     }
  115.     else
  116.     {
  117.         printch((char)(hex%16 - 10 + 'a' ));
  118.     }
  119. }
复制代码

串口中断接收程序
  1. //串口1接收中断服务例程
  2. void isr_uart1_re(void)
  3. {
  4.     uint_8 ch;
  5.     uint_8 flag = 1;
  6.    
  7.     DISABLE_INTERRUPTS;
  8.    
  9.     ch = uart_re1(UART_1, &flag);
  10.     if (0 == flag)
  11.     {
  12.         uart_send1(UART_1, ch);
  13.         if (ch != '\r')
  14.         {
  15.                 if (gCmdBufStatus == 0)
  16.                 {
  17.                         gCmdBuf[gCmdBufCnt++] = ch;
  18.                         if (gCmdBufCnt == CMD_BUF_SIZE)
  19.                                 gCmdBufStatus = 2;
  20.                 }
  21.         }
  22.         else
  23.         {
  24.                 uart_send1(UART_1, '\n');
  25.                 gCmdBuf[gCmdBufCnt] = '\0';
  26.                 gCmdBufCnt = 0;
  27.                 gCmdBufStatus = 1;
  28.         }
  29.     }

  30.     ENABLE_INTERRUPTS;
  31. }
复制代码

出0入0汤圆

 楼主| 发表于 2015-3-2 20:29:02 | 显示全部楼层
程序主循环中加入下面内容即可处理命令:
  1. if (gCmdBufStatus == 1)
  2. {
  3.         CmdLineProcess(gCmdBuf);
  4.         gCmdBufStatus = 0;
  5. }
复制代码

出0入0汤圆

发表于 2015-3-2 22:23:24 | 显示全部楼层
以前做过类似应用,挂128只18B20确实可以到几百米的通讯距离。不过做稳定还是需要下一番功夫的。
1、接口驱动电路设计很关键
2、软件时序需要精准

出0入0汤圆

发表于 2015-3-7 09:38:09 | 显示全部楼层
XD项目完成了吗 ?

出0入0汤圆

发表于 2015-3-7 09:45:53 | 显示全部楼层
500米那么远,感觉很不可思议!成功了吗?楼主

出0入0汤圆

发表于 2015-3-7 10:02:52 | 显示全部楼层
jiang887786 发表于 2015-3-7 09:45
500米那么远,感觉很不可思议!成功了吗?楼主

加上转接放大器,还可以远

出0入0汤圆

发表于 2015-3-7 10:05:56 | 显示全部楼层
holts2 发表于 2015-3-7 10:02
加上转接放大器,还可以远

太远的话,波形时序都会很难掌握吧?再加上元器件的环境温度变化等等外界因素。我感觉太远了还是不靠谱。

出0入0汤圆

发表于 2015-3-7 10:27:52 | 显示全部楼层
superrf 发表于 2015-1-4 12:55
用UART控制18b20还是第一次听说,期待更多资料

同求相关资料,我以前写过单总线程序,还是非常要求时间精准的,UART是怎么完成的呢?

出0入0汤圆

发表于 2015-3-7 16:11:54 | 显示全部楼层
太慢!

出0入0汤圆

发表于 2015-3-7 16:18:35 | 显示全部楼层
也玩过18B20单总线的,500米的距离LZ成功没?

出10入10汤圆

发表于 2015-3-8 07:50:01 | 显示全部楼层
期待楼主大作

出0入0汤圆

 楼主| 发表于 2015-3-10 16:36:04 | 显示全部楼层

对不住大家了,能力不足,现在很少敲代码,对飞思卡尔的也不熟偏偏又选择了KDS来开发,再加上工作、家庭的各种烦琐小事,最关键还有本人的毅力不够坚强,所以一慢再慢,不过相信自己还是能坚持做完的,即使做那只最慢的蜗牛也要将自己的兴趣进行到底。
PS:不做研发后的写代码状态很不好

出0入0汤圆

发表于 2015-3-10 18:19:03 | 显示全部楼层
tyoo 发表于 2015-3-10 16:36
对不住大家了,能力不足,现在很少敲代码,对飞思卡尔的也不熟偏偏又选择了KDS来开发,再加上工作、家庭 ...

如果你原来做过,只是移植应该问题 不大的

出0入0汤圆

发表于 2015-3-10 19:37:43 | 显示全部楼层
holts2 发表于 2015-3-10 18:19
如果你原来做过,只是移植应该问题 不大的

这次驱动方法、搜索方法、驱动电路都是新方式

出0入0汤圆

发表于 2015-3-10 20:44:03 | 显示全部楼层
mq-life 发表于 2015-3-10 19:37
这次驱动方法、搜索方法、驱动电路都是新方式

只是传送远点,其它没区别吧

出0入0汤圆

发表于 2015-4-8 13:39:50 | 显示全部楼层
楼主,一个月了。做的怎么样了?

出0入0汤圆

 楼主| 发表于 2015-4-29 08:56:29 | 显示全部楼层
menghong_4 发表于 2015-4-8 13:39
楼主,一个月了。做的怎么样了?

别提了,现在每天四点就得起床忙活,两份工作真不好做,累死了,这玩意好久没碰了

出0入0汤圆

发表于 2015-4-30 09:10:17 | 显示全部楼层
tyoo 发表于 2015-4-29 08:56
别提了,现在每天四点就得起床忙活,两份工作真不好做,累死了,这玩意好久没碰了 ...

加油啊,善始善终,  好歹得把交的钱拿回来吧 ?

出0入0汤圆

发表于 2015-5-7 09:07:02 | 显示全部楼层
如果成本可以稍微提高点的话,我建议使用485总线传输,毕竟差分信号传输比起普通的TTL传输要好些~

出0入0汤圆

发表于 2015-8-17 16:33:04 | 显示全部楼层
不错啊 谢谢楼主分享!

出0入0汤圆

发表于 2015-8-28 12:34:17 | 显示全部楼层
tyoo 发表于 2014-12-31 21:15
努力吧,官网一份手册中提到过。之前已经做过200米左右挂一只和3米挂20只的,没有系统化,稳定性也不太好 ...

楼主怎么不可以下载啊

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-3-29 08:11

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

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