7985|10

81

帖子

1931

TA的资源

纯净的硅(中级)

楼主
 

USB HID 自定义设备之 DS18B20 温度计(转) [复制链接]

转自:点点滴滴版主 http://www.pic16.com/bbs/dispbbs.asp?boardid=8&replyid=172309&id=46618&page=1&skin=0&Star=1

经过将近一个月的闭关。今天终于完成自定义USB HID 免驱动设备。其中由于系统问题,识别出来的HID 设备要驱动程序,害得我浪费好多时间。最后没有办法不得不重新系统!!这期间有不少网友的问题都没有时间回答,请大家见谅!上位机采用VB 软件编写,参考国外的 “PIC18F2550 USB HID 示波器”里面已经封成模块,只要调用里的程序就可以实现调与USB HID 设备进行通信。下位机硬件是PIC16F73 + PDIUSB12 。自定义一个简单的通信协议。可以实现控制一路LED 的开关,读取DS18B20的温度数据,并能够检测出DS18B20 的硬件状态!

1.jpg (12.33 KB, 下载次数: 1)

1.jpg

2.jpg (37.88 KB, 下载次数: 0)

2.jpg

3.jpg (26.63 KB, 下载次数: 0)

3.jpg

4.jpg (30.91 KB, 下载次数: 0)

4.jpg

5.jpg (226.18 KB, 下载次数: 0)

5.jpg

6.jpg (226.18 KB, 下载次数: 0)

6.jpg

7.jpg (18.97 KB, 下载次数: 0)

7.jpg

8.jpg (72.22 KB, 下载次数: 2)

8.jpg

9.jpg (48.28 KB, 下载次数: 0)

9.jpg

10.jpg (33.44 KB, 下载次数: 0)

10.jpg

11.jpg (50.71 KB, 下载次数: 0)

11.jpg

12.jpg (48.45 KB, 下载次数: 0)

12.jpg
此帖出自单片机论坛

最新回复

参考一下,受益匪浅!  详情 回复 发表于 2011-10-30 03:56
点赞 关注
 

回复
举报

81

帖子

1931

TA的资源

纯净的硅(中级)

沙发
 
  1. /* 项目名称:PDIUSB12 DS18B20
  2. *
  3. * 项目简介:PDIUSB12 的应用实例。主控芯片PIC16F73@5V 16M
  4. * PDIUSB12 是目前USB控制芯片较为流行的。本程序是设置为标
  5. * 准的USB HID 设备。将DS18B20 的温度数据传给电脑。控制一
  6. * 个LED 的打开与关闭。
  7. *
  8. * 软件版本:V 1.0
  9. * 建造作者:点点滴滴 <310902900@163.com>
  10. *
  11. * 版权声明:版权所有。可以用于学习,交流为目的使用。
  12. * 不得用于任何商业为目的使用!
  13. *
  14. * 建造日期:2009年7月5日至2009年7月12日
  15. * 开发平台:HI-TECH C PRO for the PIC10/12/16 MCU family V9.65
  16. */

  17. #include
  18. #include "usb.h"
  19. #include "usart.h"
  20. #include "system.h"
  21. #include "ds18b20.h"
  22. #include "compiler.h"
  23. #include "PDIUSB12.h"

  24. // 单片机熔丝配置
  25. __CONFIG(HS & WDTDIS & PWRTEN & BOREN & UNPROTECT);

  26. /* 项目名称:port_init()
  27. * 输入参数:无
  28. * 输出参数:无
  29. * 功能简介:端口上电初始化
  30. */
  31. void port_init(void)
  32. {
  33. // 配置为数字 I/O
  34. ADCON1 = 0B00000110;

  35. // B 端口使能上拉
  36. OPTION = 0B00000000;

  37. // |--------- NC
  38. // ||-------- NC
  39. // |||------- NC
  40. // ||||------ NC
  41. // |||||----- NC
  42. // ||||||---- NC
  43. // |||||||--- IN/OUT DQ
  44. // ||||||||-- OUT LED
  45. PORTA = 0B00000000;
  46. TRISA = 0B11111110;

  47. // |--------- IN/OUT DTAT
  48. // ||-------- IN/OUT DTAT
  49. // |||------- IN/OUT DTAT
  50. // ||||------ IN/OUT DTAT
  51. // |||||----- IN/OUT DTAT
  52. // ||||||---- IN/OUT DTAT
  53. // |||||||--- IN/OUT DTAT
  54. // ||||||||-- IN/OUT DTAT
  55. PORTB = 0B00000000;
  56. TRISB = 0B11111111;

  57. // |--------- NC
  58. // ||-------- OUT TXD
  59. // |||------- NC
  60. // ||||------ NC
  61. // |||||----- OUT A0
  62. // ||||||---- OUT RD
  63. // |||||||--- OUT WR
  64. // ||||||||-- IN INT
  65. PORTC = 0B01001110;
  66. TRISC = 0B11110001;
  67. }

  68. /* 项目名称:power_up_init()
  69. * 输入参数:无
  70. * 输出参数:无
  71. * 功能简介:所有模块上电初始化
  72. */
  73. void power_up_init(void)
  74. {
  75. // 端口初始化设置
  76. port_init();

  77. // D12 初始化设置
  78. D12_power_init();

  79. // 串口初始化设置
  80. usart0_init_modem();

  81. // 定时器计时设置
  82. timer0_init();

  83. // 打开LED 指示灯
  84. open_Led();
  85. }

  86. /* 项目名称:main()
  87. * 输入参数:无
  88. * 输出参数:无
  89. * 功能简介:主函数
  90. */
  91. void main(void)
  92. {
  93. // 上电初始化设置
  94. power_up_init();

  95. // USB12 硬件检测
  96. usb_d12_detect();

  97. // DS18B 硬件检测
  98. ds18b20_detect();

  99. // 循环执行
  100. while (TRUE)
  101. {
  102. // USB 事务处理
  103. usb_tasks();

  104. // 响应指令事件
  105. respon_comm();

  106. // 循环获取温度
  107. access_T_data();
  108. }
  109. }

复制代码
此帖出自单片机论坛
 
 

回复

81

帖子

1931

TA的资源

纯净的硅(中级)

板凳
 
  1. /* 项目名称:usb
  2. *
  3. * 项目简介:本项目实现对usb 的核心控制。USB 所有的事件都由
  4. * 主机发起。设备只能是听令行事。其中最主要的部分就是SETUP
  5. * 请求设置包。主机发出请求包,以获取设备的属性,状态,类型
  6. * 等参数,并分配唯一地址给设备。本示例对SETUP 设置包进行优
  7. * 化,能识别的都返回相应的数据给主机。不能识别的,返回零长
  8. * 度的数据包给主机。经过简单的测试都能在几台不同的电脑上被
  9. * 识别,并能很好的工作!
  10. *
  11. * 特别鸣谢:USB 响应SETUP 设置包的思路原型来于 (电脑圈圈)
  12. *
  13. * 软件版本:V 1.1
  14. * 修改说明:提高可读性,增加除错调试模式,USB12 硬件检测
  15. * 建造作者:点点滴滴 <310902900@163.com>
  16. *
  17. * 版权声明:版权所有。可以用于学习,交流为目的使用。
  18. * 不得用于任何商业为目的使用!
  19. *
  20. * 建造日期:2009年8月5日至2009年8月8日
  21. * 开发平台:HI-TECH C PRO for the PIC10/12/16 MCU family V9.65
  22. */

  23. #include "usb.h"

  24. /*
  25. *
  26. *
  27. *
  28. */
  29. void usb_endp0_send_data(void)
  30. {
  31. U8 buffer_endp[ENDP0_MAX];
  32. U8 i, length = CLR;

  33. // 数据长度不能大于端点0 最大封包
  34. // 如果大于则只能发送一个封包单位
  35. if (send_length > ENDP0_MAX)
  36. {
  37. // 最大数据封包长度
  38. length = ENDP0_MAX;

  39. // 调整剩余数据长度
  40. send_length -= (U16)(length);
  41. }

  42. // 数据长度小于或等于最大封包
  43. // 发送的数据长度等于剩余长度
  44. else
  45. {
  46. // 数据类型强行转换
  47. length = (U8)(send_length & 0xff);

  48. // 发送完成长度清零
  49. send_length = CLR;
  50. }

  51. // 将描述符数据项复制到缓冲区
  52. for (i = 0; i < length; i++)
  53. {
  54. // 描述符的数据复制到缓冲区
  55. buffer_endp[i] = *p_send_data;

  56. // 缓冲区指针指向下一个地址
  57. p_send_data++;
  58. }

  59. // 将缓冲区数据写入端点缓冲区
  60. D12_write_endp_buffer(ENDP_0_IN, // 选取端点
  61. length, // 数据长度
  62. buffer_endp); // 数组首址

  63. // 缓冲区写入数据必须使能有效
  64. D12_val_buffer();

  65. #ifdef DEBUG
  66. // 串口输出调试排错信息的数据
  67. print("ENDP_0_IN ");
  68. print_buffer(buffer_endp, length);
  69. print("\n\n");
  70. #endif
  71. }

  72. /*
  73. *
  74. *
  75. *
  76. */
  77. void usb_endp0_setup(void)
  78. {
  79. // 读取SETUP 设置包事务数据
  80. D12_read_endp_buffer(ENDP_0_OUT, // 选取端点
  81. sizeof(setup.buffer), // 数据长度
  82. setup.buffer); // 数组首址

  83. // 必须使能才能收到SETUP 包
  84. D12_ack_setup();

  85. // 使能控制端点必须清缓冲区
  86. D12_clr_buffer();

  87. #ifdef DEBUG
  88. // 串口输出调试排错信息数据
  89. print("ENDP_0_SETUP ");
  90. print_buffer(setup.buffer, sizeof(setup.buffer));
  91. print("\n\n");
  92. #endif

  93. // 控制包是整个枚举过程中最
  94. // 重要的,也是最复杂的。由
  95. // 于USB 规定所有的指令都
  96. // 主机发出,设备只能听令行
  97. // 事。在本程序应用中对此作
  98. // 出一些优化,精简。只对几
  99. // 个标准请求代码作出响应。
  100. // SETUP 设置包标准请求识别
  101. switch (setup.b_request)
  102. {
  103. // 主机获取描述符
  104. case GET_DESCRIPTOR:

  105. // w_value 高字节指出描述符类型
  106. switch (setup.w_value_h)
  107. {
  108. // 主机获取设备描述符
  109. case DEVICE_DESCRIPTOR:

  110. // 请求的数据长度大于设备描述符长度
  111. // 则只返回设备描述符长度的有效数据
  112. if (setup.w_length > sizeof(device_descriptor))
  113. {
  114. send_length = sizeof(device_descriptor);
  115. }

  116. // 则只返回请求的数据长度的有效数据
  117. else
  118. {
  119. send_length = setup.w_length;
  120. }

  121. // 指针加载设备描述符所在缓冲区首址
  122. p_send_data = device_descriptor;

  123. // 通过端点0 返回数据
  124. usb_endp0_in();

  125. break;

  126. // 主机获取配置描述符
  127. case CONFIGURATION_DESCRIPTOR:

  128. // 请求的数据长度大于配置描述符长度
  129. // 则只返回配置描述符长度的有效数据
  130. if (setup.w_length >
  131. sizeof(configuration_descriptor))
  132. {
  133. send_length = sizeof(configuration_descriptor);
  134. }

  135. // 则只返回请求的数据长度的有效数据
  136. else
  137. {
  138. send_length = setup.w_length;
  139. }

  140. // 指针加载配置描述符所在缓冲区首址
  141. p_send_data = configuration_descriptor;

  142. // 通过端点0 返回数据
  143. usb_endp0_in();

  144. break;

  145. // 主机获取报告描述符
  146. case REPORT_DESCRIPTOR:

  147. // 请求的数据长度大于设备描述符长度
  148. // 则只返回设备描述符长度的有效数据
  149. if (setup.w_length > sizeof(report_descriptor))
  150. {
  151. send_length = sizeof(report_descriptor);
  152. }

  153. // 则只返回请求的数据长度的有效数据
  154. else
  155. {
  156. send_length = setup.w_length;
  157. }

  158. // 指针加载报告描述符所在缓冲区首址
  159. p_send_data = report_descriptor;

  160. // 通过端点0 返回数据
  161. usb_endp0_in();

  162. break;

  163. // 主机获取字符描述符
  164. case STRING_DESCRIPTOR:

  165. // w_value 低字节指出字符串索引值
  166. switch (setup.w_value_l)
  167. {
  168. // 获取语言ID
  169. case 0:

  170. // 加载语言ID 数据长度 数据指针
  171. send_length = sizeof(language_id);
  172. p_send_data = language_id;

  173. break;

  174. // 获取产品字符串
  175. case 1:

  176. // 加载产品字符串 数据长度 数据指针
  177. send_length = sizeof(product_string_descriptor);
  178. p_send_data = product_string_descriptor;

  179. break;

  180. // 获取编号字符串
  181. case 2:

  182. // 加载编号字符串 数据长度 数据指针
  183. send_length = sizeof(date_string_descriptor);
  184. p_send_data = date_string_descriptor;

  185. break;

  186. // 未知的索引值
  187. default:

  188. // 返回一零长度的数据包
  189. send_length = CLR;

  190. break;
  191. }

  192. // 如果请求的数据长度小于描述符长度
  193. // 则只返回请求的数据长度的有效数据
  194. if (setup.w_length < send_length)
  195. {
  196. send_length = setup.w_length;
  197. }

  198. // 通过端点0 返回数据
  199. usb_endp0_in();

  200. break;

  201. // 没有定义的描述符
  202. default:

  203. // 端点0 返回一个零长度的数据包
  204. send_length = CLR;
  205. usb_endp0_in();

  206. break;
  207. }

  208. break;

  209. // 分配地址给设备
  210. case SET_ADDRESS:

  211. // w_value 的低字节指出地址的值
  212. D12_set_addr(setup.w_value_l);

  213. // 端点0 返回一个零长度的数据包
  214. send_length = CLR;
  215. usb_endp0_in();

  216. break;

  217. // 设置配置给设备
  218. case SET_CONFIGURATION:

  219. // w_value 的低字节指出配置的值
  220. // 如果该值非零才能使能非零端点
  221. if (setup.w_value_l)
  222. {
  223. config_value = TRUE;
  224. D12_set_endp();
  225. }

  226. // 端点0 返回一个零长度的数据包
  227. send_length = CLR;
  228. usb_endp0_in();

  229. break;

  230. // 未定义的请求包
  231. default:

  232. // 端点0 返回一个零长度的数据包
  233. send_length = CLR;
  234. usb_endp0_in();

  235. break;
  236. }
  237. }

  238. /*
  239. *
  240. *
  241. *
  242. */
  243. void usb_endp0_out(void)
  244. {
  245. U8 buffer_out[8];

  246. // 读取控制端点输出普通数据
  247. D12_read_endp_buffer(ENDP_0_OUT, // 选取端点
  248. sizeof(buffer_out), // 数据长度
  249. buffer_out); // 数组首址

  250. // 读取缓冲区后必须清缓冲区
  251. D12_clr_buffer();

  252. #ifdef DEBUG
  253. // 串口输出调试排错信息的数据
  254. print("ENDP_0_OUT ");
  255. print_buffer(buffer_out, sizeof(buffer_out));
  256. print("\n\n");
  257. #endif
  258. }

  259. /*
  260. *
  261. *
  262. *
  263. */

复制代码
此帖出自单片机论坛
 
 
 

回复

81

帖子

1931

TA的资源

纯净的硅(中级)

4
 
  1. void usb_endp0_in(void)
  2. {
  3. // 端点0 读取最后状态清中断标志
  4. D12_read_endp_status(ENDP_0_IN);

  5. // 端点0 发送描述符剩余长度数据
  6. usb_endp0_send_data();
  7. }

  8. /*
  9. *
  10. *
  11. *
  12. */
  13. void usb_endp1_out(void)
  14. {
  15. U8 buffer_out[8];

  16. // 端点1 读取最后状态清中断标志
  17. D12_read_endp_status(ENDP_1_OUT);

  18. // 端点 1 输出普通数据
  19. D12_read_endp_buffer(ENDP_1_OUT, // 选取端点
  20. sizeof(buffer_out), // 数据长度
  21. buffer_out); // 数组首址

  22. // 读取缓冲区后必须清缓冲区
  23. D12_clr_buffer();

  24. // 端点1 输出数据指令包识别
  25. command_type(buffer_out);

  26. #ifdef DEBUG
  27. // 串口输出调试排错信息的数据
  28. print("ENDP_1_OUT ");
  29. print_buffer(buffer_out, sizeof(buffer_out));
  30. print("\n\n");
  31. #endif
  32. }

  33. /*
  34. *
  35. *
  36. *
  37. */
  38. void usb_endp1_in(void)
  39. {
  40. // 端点1 读取最后状态清中断标志
  41. D12_read_endp_status(ENDP_1_IN);

  42. // 端点1 忙碌标志清零 进入空闲
  43. endp_1_busy = FALSE;
  44. }

  45. /*
  46. *
  47. *
  48. *
  49. */
  50. void usb_tasks(void)
  51. {
  52. U8 int_mark, status;

  53. // D12 事务中断触发
  54. if (D12_INT_LOW())
  55. {
  56. // 读中断事件标志
  57. int_mark = D12_read_interrupt();

  58. // USB 总线复位
  59. if (int_mark & USB_RESET)
  60. {
  61. #ifdef DEBUG
  62. print("USB BUS RESET..\n\n");
  63. #endif
  64. }

  65. // USB 总线挂起
  66. if (int_mark & USB_HANG)
  67. {
  68. #ifdef DEBUG
  69. print("USB BUS HANG...\n\n");
  70. #endif
  71. }

  72. // 端点0 输出中断
  73. if (int_mark & ENDP0_INT_OUT)
  74. {
  75. // 端点0 读取最后状态清中断标志
  76. status = D12_read_endp_status(ENDP_0_OUT);

  77. // 端点0 SETUP 设置包
  78. if (status & SETUP_MARK)
  79. {
  80. usb_endp0_setup();
  81. }

  82. // 端点0 普通数据输出
  83. else
  84. {
  85. usb_endp0_out();
  86. }
  87. }

  88. // 端点0 输入中断
  89. if (int_mark & ENDP0_INT_IN)
  90. {
  91. usb_endp0_in();
  92. }

  93. // 端点1 输出中断
  94. if (int_mark & ENDP1_INT_OUT)
  95. {
  96. usb_endp1_out();
  97. }

  98. // 端点1 输入中断
  99. if (int_mark & ENDP1_INT_IN)
  100. {
  101. usb_endp1_in();
  102. }

  103. // 端点2 输出中断
  104. if (int_mark & ENDP2_INT_OUT)
  105. {

  106. }

  107. // 端点2 输入中断
  108. if (int_mark & ENDP2_INT_IN)
  109. {

  110. }
  111. }
  112. }

  113. /*
  114. *
  115. *
  116. *
  117. */
  118. void usb_d12_detect(void)
  119. {
  120. U16 usb12_id;

  121. // 读取芯片ID
  122. usb12_id = D12_read_ID();

  123. // 校验芯片ID
  124. if (usb12_id == USB12_ID)
  125. {
  126. #ifdef DEBUG
  127. print("ID: 0x");
  128. print_int_hex(usb12_id);
  129. print(".....\n\n");
  130. print("USB CONNECT....\n\n");
  131. #endif

  132. // USB 连接
  133. D12_usb_con();
  134. }

  135. else
  136. {
  137. // 关闭 LED
  138. close_Led();

  139. // 校验出错
  140. // 停止运行
  141. while (TRUE);
  142. }
  143. }

复制代码
此帖出自单片机论坛
 
 
 

回复

81

帖子

1931

TA的资源

纯净的硅(中级)

5
 
  1. /* 项目名称:ds18b20
  2. *
  3. * 项目简介:PIC16F73@5V 16M。控制DS18B20 温度传感器
  4. * 对传感器底层操作,产品编号检测,硬件检测,所有数据
  5. * 都进行CRC_8 沉余校验,确保数据准确性。采用状态机方
  6. * 式读取温度数据。在调试过程中输出排错调试信息!
  7. *
  8. * 软件版本:V 1.0
  9. * 建造作者:点点滴滴 <310902900@163.com>
  10. *
  11. * 版权声明:版权所有。可以用于学习,交流为目的使用。
  12. * 不得用于任何商业为目的使用!
  13. *
  14. * 建造日期:2009年8月5日至2009年8月8日
  15. * 开发平台:HI-TECH C PRO for the PIC10/12/16 MCU family V9.65
  16. */

  17. #include "ds18b20.h"

  18. /*
  19. *
  20. *
  21. *
  22. */
  23. void delay_01us(void)
  24. {
  25. NOP();
  26. NOP();
  27. NOP();
  28. NOP();
  29. }

  30. /*
  31. *
  32. *
  33. *
  34. */
  35. void delay_60us(void)
  36. {
  37. U8 time;

  38. for (time = COUNT_US; time > 0; time--);
  39. }

  40. /*
  41. *
  42. *
  43. *
  44. */
  45. U8 ds18b20_reset(void)
  46. {
  47. U8 time, ds_mark = TRUE;

  48. // 总线输出为低
  49. DQ_LOW();
  50. DQ_PIN_OUT();

  51. // 延时 480us
  52. for (time = 8; time > 0; time--)
  53. {
  54. delay_60us();
  55. }

  56. // 主机释放总线
  57. DQ_PIN_IN();

  58. // 延时 120us
  59. for (time = 2; time > 0; time--)
  60. {
  61. delay_60us();
  62. }

  63. // 总线数据采样
  64. if (DQ_READ() == 1)
  65. {
  66. ds_mark = FALSE;
  67. }

  68. // 延时 360us
  69. for (time = 6; time > 0; time--)
  70. {
  71. delay_60us();
  72. }

  73. // 返回设备标志
  74. return ds_mark;
  75. }

  76. /*
  77. *
  78. *
  79. *
  80. */
  81. void ds18b20_write_byte(U8 value)
  82. {
  83. U8 bit_test = 0x01;

  84. while (bit_test)
  85. {
  86. // 总线输出为低
  87. DQ_LOW();
  88. DQ_PIN_OUT();

  89. // 短暂延时 1us
  90. delay_01us();

  91. // 数据高低测试
  92. // 低位先高位后
  93. if (value & bit_test)
  94. {
  95. DQ_HIGH();
  96. }

  97. else
  98. {
  99. DQ_LOW();
  100. }

  101. // 测试数据左移
  102. bit_test <<= 1;

  103. // 位延时 60us
  104. delay_60us();

  105. // 主机释放总线
  106. DQ_PIN_IN();

  107. // 短暂延时 1us
  108. delay_01us();
  109. }
  110. }

  111. /*
  112. *
  113. *
  114. *
  115. */
  116. U8 ds18b20_read_byte(void)
  117. {
  118. U8 bit_test = 0x01, value = 0;

  119. while (bit_test)
  120. {
  121. // 总线输出为低
  122. DQ_LOW();
  123. DQ_PIN_OUT();

  124. // 短暂延时 1us
  125. delay_01us();

  126. // 主机释放总线
  127. DQ_PIN_IN();

  128. // 短暂延时 1us
  129. delay_01us();

  130. // 总线数据采样
  131. // 低位先高位后
  132. if (DQ_READ() == 1)
  133. {
  134. value |= bit_test;
  135. }

  136. // 测试数据左移
  137. bit_test <<= 1;

  138. // 位延时 60us
  139. delay_60us();
  140. }

  141. return value;
  142. }

  143. /*
  144. *
  145. *
  146. *
  147. */
  148. void convert_T_data(void)
  149. {
  150. U8 i, data_crc;
  151. static U8 step, time;

  152. // 状状机读取温度
  153. switch (step)
  154. {
  155. // 设备响应检测
  156. // 启动温度转换
  157. case 0:

  158. if (ds18b20_reset() == TRUE)
  159. {
  160. ds18b20_write_byte(SKIP_ROM);
  161. ds18b20_write_byte(CONVERT_T);
  162. step++;
  163. }

  164. // 设备没响应
  165. else
  166. {
  167. ds18_state = FALSE;
  168. }

  169. break;

  170. // 设备忙碌等待
  171. case 1:

  172. if (++time > BUSY_TIME)
  173. {
  174. time = 0;
  175. step++;
  176. }

  177. break;

  178. // 读取所有数据
  179. case 2:

  180. ds18b20_reset();
  181. ds18b20_write_byte(SKIP_ROM);
  182. ds18b20_write_byte(READ_REGISTER);

  183. for (i = 0; i < sizeof(ds18_buffer); i++)
  184. {
  185. ds18_buffer[i] = ds18b20_read_byte();
  186. }

  187. step++;

  188. break;

  189. // 数据CRC 校验
  190. case 3:

  191. data_crc = data_crc8(ds18_buffer,
  192. (sizeof(ds18_buffer) - 1));

  193. // 校验成功 更新标志置位
  194. if (data_crc == ds18_buffer[8])
  195. {
  196. T_update = TRUE;
  197. }

  198. step = 0;

  199. break;
  200. }
  201. }

  202. /*
  203. *
  204. *
  205. *
  206. */
  207. void ds18b20_detect(void)
  208. {
  209. U8 i, id_crc, id_buffer[8];

  210. // DS18B20 检测
  211. // 硬件没有响应
  212. if (ds18b20_reset() == FALSE)
  213. {
  214. ds18_state = FALSE;

  215. #ifdef DEBUG
  216. print("NO FOUND DEVICE\n\n");
  217. #endif
  218. }

  219. // 硬件成功响应
  220. else
  221. {
  222. // 读取寄存器
  223. ds18b20_write_byte(READ_ROM);

  224. // 读取产品ID
  225. for (i = 0; i < sizeof(id_buffer); i++)
  226. {
  227. id_buffer[i] = ds18b20_read_byte();
  228. }

  229. // ID沉余校验
  230. // 校验产品ID
  231. // ID校验正确
  232. id_crc = data_crc8(id_buffer, (sizeof(id_buffer) - 1));

  233. if ((id_crc == id_buffer[7]) &&
  234. (DS18B_ID == id_buffer[0]))
  235. {
  236. ds18_state = TRUE;

  237. #ifdef DEBUG
  238. print("ID CRC OK......\n\n");
  239. print("DEVICE ID OK...\n\n");
  240. print("ID: ");
  241. print_buffer(id_buffer, sizeof(id_buffer));
  242. print("\n\n");
  243. #endif
  244. }

  245. // ID校验出错
  246. else
  247. {
  248. ds18_state = FALSE;

  249. #ifdef DEBUG
  250. print("DEVICE ERROR...\n\n");
  251. print("ID: ");
  252. print_buffer(id_buffer, sizeof(id_buffer));
  253. print("\n\n");
  254. #endif
  255. }
  256. }
  257. }

  258. /*
  259. *
  260. *
  261. *
  262. */
  263. void access_T_data(void)
  264. {
  265. // 查徇定时器1ms 益出
  266. if (T0_overflow() == TRUE)
  267. {
  268. // DS18B 硬件是否就绪
  269. if (ds18_state == TRUE)
  270. {
  271. convert_T_data();
  272. }

  273. // 尝试查找DS18B 硬件
  274. else
  275. {
  276. ds18b20_detect();
  277. }
  278. }
  279. }

复制代码
此帖出自单片机论坛
 
 
 

回复

81

帖子

1931

TA的资源

纯净的硅(中级)

6
 
上位机程序

2009881872519449.rar (22.13 KB, 下载次数: 100)

下位机程序
2009881883881034.rar (223.19 KB, 下载次数: 111)

*********** 上位机更新 V1.01*************
更新说明,
1,增加打开,关闭LED 电脑蜂鸣器有声音输出提示!
2,最小化是,在标题显示当前温度!
3,其它方面的小改动,





2009810115911951121111.rar (22.19 KB, 下载次数: 50)
此帖出自单片机论坛
 
 
 

回复

1908

帖子

7

TA的资源

五彩晶圆(高级)

7
 

挺好

这东西不错,可以参考一下,把别的传感器传送上来的数据也送上位机进行显示,进一步达到控制的目的。
此帖出自单片机论坛
 
 
 

回复

130

帖子

0

TA的资源

纯净的硅(中级)

8
 
mark
此帖出自单片机论坛
 
个人签名就这样看着你慢慢离去.......
 
 

回复

143

帖子

0

TA的资源

纯净的硅(高级)

9
 

回复 幸福的娃 的帖子

支持下!
此帖出自单片机论坛
 
 
 

回复

111

帖子

0

TA的资源

纯净的硅(高级)

10
 
此帖出自单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
参考一下,受益匪浅!
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表