標(biāo)題:
stm32測溫 通道2的搜索程序就是把1的搜索程序改為2,程序運(yùn)行只能正常顯示通道1...
[打印本頁]
作者:
yanz123
時(shí)間:
2018-6-18 23:25
標(biāo)題:
stm32測溫 通道2的搜索程序就是把1的搜索程序改為2,程序運(yùn)行只能正常顯示通道1...
主程序:
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(); //延時(shí)函數(shù)初始化
uart_init(9600); //串口初始化為9600
LED_Init(); //初始化與LED連接的硬件接口
LCD_Init();
POINT_COLOR=RED;//設(shè)置字體為紅色
LCD_ShowString(30,50,200,16,16,"DS18B20 TEST");
LCD_ShowString(30,80,200,16,16,"2018/6/15");
POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色
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數(shù)量為: %d\r\n",MAXNUM);
printf("通道1搜索到的DS18B20數(shù)量為: %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數(shù)量為: %d\r\n",MAXNUM);
printf("通道2搜索到的DS18B20數(shù)量為: %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個(gè)DS18B20溫度為:-%.2f ℃",i+1,temperature/100.0);
}
else
{
LCD_ShowChar(30+50,160,' ',16,0);
printf("\r\n 通道1第%d個(gè)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個(gè)DS18B20溫度為:-%.2f ℃",i+1,temperature/100.0);
}
else
{
LCD_ShowChar(30+50,160,' ',16,0);
printf("\r\n 通道2第%d個(gè)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(); //復(fù)位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(); // 讀兩位數(shù)據(jù)
k=k&0x03;
s= s>>1;
if(k==0x01) //0000 0001 如果讀到的數(shù)據(jù)為0
{
DS18B20_Write_Bit_1(0);//寫0,使總線上為0的器件響應(yīng)
ss[(m*8+n)]=0;
}
else if(k==0x02) //0000 0010 如果讀到的數(shù)據(jù)為1
{
s=s|0x80;
DS18B20_Write_Bit_1 (1);//寫1,使總線上為1的器件響應(yīng)
ss[(m*8+n)]=1;
}
else if(k==0x00)//如果讀取到的數(shù)據(jù)為00,則有沖突,需進(jìn)行沖突位判斷
{
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])//如果沖突位小于棧頂,則寫以前的數(shù)據(jù)
{
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//如果讀到的數(shù)據(jù)為0x03(0000 0011),則說明單總線上不存在任何設(shè)備
{
return num; //搜索完成,返回搜索到的個(gè)數(shù)
}
delay_us(5);
}
pID[num][m]=s;
s=0;
}
num=num+1;
}
while(BUFFER_1[l]!=0&&(num<MAXNUM));
return num; //返回搜索到的個(gè)數(shù)
}
復(fù)制代碼
通道2的搜索程序就是把1的搜索程序改為2,程序運(yùn)行只能正常顯示通道1的傳感器序列號及對應(yīng)的溫度值。而通道2只能顯示1個(gè)序列號及對應(yīng)的溫度值
作者:
yanz123
時(shí)間:
2018-6-18 23:26
當(dāng)吧通道1去掉,通道2正常運(yùn)行
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1