ds18b20单总线驱动,要挂接多个,就得扫描ROM提取序列号,还得匹配ROM取温度值,有点麻烦。分析其驱动原理,完全可以用P口的8个位同时驱动8个ds18b20,实现温度显示。
以下是proteus仿真效果:
以下是代码:
main.c
- #include "config.h"
- #include "timer.h"
- #include "lcd1604.h"
- #include "ds18b20.h"
- uchar temp_array[16], *p_array;
- //按位取值
- uchar code dbit[8] = {1, 2, 4, 8, 16, 32, 64, 128};
- uchar code pos[8] = {0,0,1,1,2,2,3,3};
- void dis_temps(void)
- {
- uint16 temp;
- uint8 i, j;
- uchar str[6] = "";
- bit temp_flag;
-
- for(i=0; i<8; i++)
- {
- for(j=0; j<16; j++)
- {
- temp >>= 1;
- if((temp_array[j] & dbit[i]) == dbit[i])
- {
- temp |=0x8000;
- }
- }
- if((temp & 0xf800) == 0xf800)
- {
- temp_flag = 1;
- temp = (~temp) + 1;
- }else{
- temp_flag = 0;
- }
- float2str(temp*0.0625, str, 1);
-
- if(temp_flag == 1)
- {
- if((i%2)==0)
- {
- LCD1604_dis_str(0, pos[i], "-");
- }else{
- LCD1604_dis_str(8, pos[i], "-");
- }
- }else{
- if((i%2)==0)
- {
- LCD1604_dis_str(0, pos[i], " ");
- }else{
- LCD1604_dis_str(8, pos[i], " ");
- }
- }
- if((i%2)==0)
- {
- LCD1604_dis_str(1, pos[i], str);
- }else{
- LCD1604_dis_str(9, pos[i], str);
- }
- }
- }
- void main()
- {
- LCD1604_init();
- p_array = temp_array;
- DS18B20_start();
- while(1)
- {
- DS18B20_get_temp(p_array);
- dis_temps();
- DS18B20_start();
- delay_ms(500);
- }
- }
复制代码 ds18b20.c
|