主程序:
- u8 ID_Buff_1[MAXNUM][8];
- u8 ID_Buff_2[MAXNUM][8];
- int main(void)
- {
- u8 num1,num2,i,j,k=0;
- u8 IN1,IN2;
- short temperature;
- delay_init(); //延时函数初始化
- uart_init(9600); //串口初始化为9600
- LED_Init(); //初始化与LED连接的硬件接口
- LCD_Init();
- POINT_COLOR=RED;//设置字体为红色
- LCD_ShowString(30,50,200,16,16,"DS18B20 TEST");
- LCD_ShowString(30,80,200,16,16,"2018/6/15");
- POINT_COLOR=BLUE;//设置字体为蓝色
- while(DS18B20_Init_1()&&(k<10)) //DS18B20初始化
- {
- k++;
- }
-
- if(k>=10)
- {
- IN1 =0;
- LCD_ShowString(30,100,200,16,16,"DS18B20_1 is NO!");
-
- }
- else
- {
- IN1 =1;
- num1 = DS18B20_Search_ROM_1(ID_Buff_1,MAXNUM);
- printf("通道1总线上最大挂载的DS18B20数量为: %d\r\n",MAXNUM);
- printf("通道1搜索到的DS18B20数量为: %d\r\n",num1);
- }
- k=0;
-
- while(DS18B20_Init_2()&&(k<10)) //DS18B20初始化
- {
- k++;
- }
-
- if(k>=10)
- {
- IN2 =0;
- LCD_ShowString(30,160,200,16,16,"DS18B20_2 is NO!");
-
- }
- else
- {
- IN2 =1;
- num2 = DS18B20_Search_ROM_2(ID_Buff_2,MAXNUM);
- printf("通道2总线上最大挂载的DS18B20数量为: %d\r\n",MAXNUM);
- printf("通道2搜索到的DS18B20数量为: %d\r\n",num2);
- }
-
-
-
- while(1)
- {
- LED1 = ~LED1;
- delay_ms (500);
-
- if(IN1)
- {
- printf("\r\n通道1存在\r\n");
- LCD_ShowString(30,110,200,16,16,"DS18B20_1 OK");
- DS18B20_Start_1 ();
- for(i = 0;i < num1;i ++)
- {
- temperature = DS18B20_Get_Tempers_1(ID_Buff_1[i]);
- printf("\r\n DS18B20 No%d ID: ",i+1);
-
- for(j = 0;j < 8;j ++)
- {
-
- //LCD_ShowString(30,110,200,16,16,ID_Buff[i][j]);
- printf("%02X ",ID_Buff_1[i][j]);
- }
-
-
- if(temperature<0)
- {
- LCD_ShowChar(30+50,160,'-',16,0);
- temperature =-temperature ;
-
-
- printf("\r\n 通道1第%d个DS18B20温度为:-%.2f ℃",i+1,temperature/100.0);
- }
- else
- {
- LCD_ShowChar(30+50,160,' ',16,0);
- printf("\r\n 通道1第%d个DS18B20温度为:%.2f ℃",i+1,temperature/100.0);
-
-
- }
-
- LCD_ShowString(30,120+i*20,200,16,16,"temp1: . C");
- LCD_ShowNum (30+50+8,120+i*20,temperature /100,2,16);
- LCD_ShowNum(30+50+32,120+i*20,temperature %100,1,16);
- delay_ms (1000);
- }
- }
- if(IN2)
- {
- printf("\r\n通道2存在\r\n");
- LCD_ShowString(30,130,200,16,16,"DS18B20_2 OK");
- DS18B20_Start_2 ();
- for(i = 0;i < num2;i ++)
- {
- temperature = DS18B20_Get_Tempers_2(ID_Buff_2[i]);
- printf("\r\n DS18B20 No%d ID: ",i+1);
-
- for(j = 0;j < 8;j ++)
- {
-
- //LCD_ShowString(30,110,200,16,16,ID_Buff[i][j]);
- printf("%02X ",ID_Buff_2[i][j]);
- }
-
-
- if(temperature<0)
- {
- LCD_ShowChar(30+50,160,'-',16,0);
- temperature =-temperature ;
-
-
- printf("\r\n 通道2第%d个DS18B20温度为:-%.2f ℃",i+1,temperature/100.0);
- }
- else
- {
- LCD_ShowChar(30+50,160,' ',16,0);
- printf("\r\n 通道2第%d个DS18B20温度为:%.2f ℃",i+1,temperature/100.0);
-
-
- }
-
- LCD_ShowString(60,160+i*30,200,16,16,"temp2: . C");
- LCD_ShowNum (60+50+8,160+i*30,temperature /100,2,16);
- LCD_ShowNum(60+50+32,160+i*30,temperature %100,1,16);
- delay_ms (1000);
- }
- }
-
- if(i == num1)
- {
- //i = 0;
- printf("\r\n");
- }
- }
- }
- 通道1的搜索程序:
- u8 DS18B20_Search_ROM_1(u8 (*pID)[8],u8 Num)
- {
- unsigned char k,l=0,ConflictBit,m,n;
- unsigned char BUFFER_1[MAXNUM];
- unsigned char ss[64];
- unsigned char s=0;
- u8 num = 0;
- do
- {
- DS18B20_Rst_1();
- DS18B20_Check_1(); //复位DS18B20总线
- DS18B20_Write_Byte_1(0xf0); //搜索ROM 0xf0
- for(m=0;m<8;m++)
- {
- // unsigned char s=0;
- for(n=0;n<8;n++)
- {
- k=DS18B20_Read_2Bit_1(); // 读两位数据
- k=k&0x03;
- s= s>>1;
- if(k==0x01) //0000 0001 如果读到的数据为0
- {
- DS18B20_Write_Bit_1(0);//写0,使总线上为0的器件响应
- ss[(m*8+n)]=0;
- }
- else if(k==0x02) //0000 0010 如果读到的数据为1
- {
- s=s|0x80;
- DS18B20_Write_Bit_1 (1);//写1,使总线上为1的器件响应
- ss[(m*8+n)]=1;
- }
- else if(k==0x00)//如果读取到的数据为00,则有冲突,需进行冲突位判断
- {
- ConflictBit=m*8+n+1;
- if(ConflictBit>BUFFER_1[l])//如果冲突位大于栈顶,则写0
- {
- DS18B20_Write_Bit_1 (0);
- ss[(m*8+n)]=0;
- BUFFER_1[++l]=ConflictBit;
- }
- else if(ConflictBit<BUFFER_1[l])//如果冲突位小于栈顶,则写以前的数据
- {
- s=s|((ss[(m*8+n)]&0x01)<<7);
- DS18B20_Write_Bit_1 (ss[(m*8+n)]);
- }
- else if(ConflictBit==BUFFER_1[l])//如果冲突位等于栈顶,则写1
- {
- s=s|0x80;
- DS18B20_Write_Bit_1 (1);
- ss[(m*8+n)]=1;
- l=l-1;
- }
- }
- else//如果读到的数据为0x03(0000 0011),则说明单总线上不存在任何设备
- {
- return num; //搜索完成,返回搜索到的个数
- }
- delay_us(5);
- }
- pID[num][m]=s;
- s=0;
- }
- num=num+1;
- }
- while(BUFFER_1[l]!=0&&(num<MAXNUM));
-
- return num; //返回搜索到的个数
- }
复制代码
通道2的搜索程序就是把1的搜索程序改为2,程序运行只能正常显示通道1的传感器序列号及对应的温度值。而通道2只能显示1个序列号及对应的温度值
|