18b20檢測溫度,顯示在數碼管上,同過串口發(fā)送到電腦
單片機源程序如下:
- #include <at89x51.h>
- sbit DQ = P2 ^ 6; //定義端口DQ
- sbit led1 =P2^0;
- sbit led2 =P2^1;
- sbit led3 =P2^2;
- sbit led4 =P2^3;
- #define BCD unsigned char
- #define shi unsigned char
- unsigned char tx[10]={0,0,0x2E,0,0,0,0,0xDF,0x43,0x0A};
- unsigned code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
- 0xf8,0x80,0x90};
- void Delay(int num)//延時函數
- {
- while(num--) ;
- }
- void Delaynms(unsigned int di) //延時
- {
- unsigned int da,db;
- for(da=0;da<di;da++)
- for(db=0;db<100;db++);
- }
- void Init_DS18B20(void)//初始化ds1820
- {
- unsigned char x=0;
- DQ = 1; //DQ復位
- Delay(8); //稍做延時
- DQ = 0; //單片機將DQ拉低
- Delay(80); //精確延時 大于 480us
- DQ = 1; //拉高總線
- Delay(14);
- x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
- Delay(20);
- }
- unsigned char ReadOneChar(void)//讀一個字節(jié)
- {
- unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; // 給脈沖信號
- dat>>=1;
- DQ = 1; // 給脈沖信號
- if(DQ)
- dat|=0x80;
- Delay(4);
- }
- return(dat);
- }
- void WriteOneChar(unsigned char dat)//寫一個字節(jié)
- {
- unsigned char i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- Delay(2);
- DQ = 1;
- dat>>=1;
- }
- }
- void ReadTemperature(void)//讀取溫度
- {
- unsigned char a=0;
- unsigned char b=0;
- unsigned char Data_L=0;
- unsigned char num=0;
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳過讀序號列號的操作
- WriteOneChar(0x44); // 啟動溫度轉換
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器
- a=ReadOneChar(); //讀低8位
- b=ReadOneChar(); //讀高8位
- tx[0] = (a/16+b*16)/10; //整數部分
- tx[1] = (a/16+b*16)%10;
- Data_L=a&0X0F;
- for(num=3;num<7;num++) //小數部分
- {
- Data_L=Data_L*10; //10 //100 //40 //80
- tx[num]=Data_L/16; //0 //6 //2 //5
- Data_L=Data_L%16; //10 //4 //8
- }
- }
- void Display_SMG(void)
- {
- unsigned char a;
- for(a=0;a<=50;a++)
- {
- P0=table[tx[0]];
- P2_0 = 0;
- Delaynms(5);
- P2_0 = 1;
-
- P0=(table[tx[1]])&0x7f;
- P2_1 = 0;
- Delaynms(5);
- P2_1 = 1;
-
- P0=table[tx[3]];
- P2_2 = 0;
- Delaynms(5);
- P2_2 = 1;
-
- P0=table[tx[4]];
- P2_3 = 0;
- Delaynms(5);
- P2_3 = 1;
- }
- }
- void b(unsigned int baud)
- {
- SCON=0x50;//0101 0000
- TMOD &=0x0F;
- TMOD |=0x20;
- TH1=TL1=(256-11059200)/12/2/16/baud;
- ET1=0;
- TR1=1;
- }
- void main(void)
- {
- BCD w,a,s,d;
- shi z,x,c,v;
- Init_DS18B20();
- while(1)
- {
- ReadTemperature();
- Display_SMG();
- b(9600);
- w=(table[tx[0]]/10*16)+(table[tx[0]]%10);
- z=((w>>4)*10+(w&0x0f));
- SBUF=z;
- while(TI==0);
- TI=0;
- Delay(1000);
- a=(table[tx[1]]&0x7f/10*16)+(table[tx[1]]&0x7f%10);
- x=((a>>4)*10+(a&0x0f));
- SBUF=x;
- while(TI==0);
- TI=0;
- Delay(1000);
- s=(table[tx[3]]/10*16)+(table[tx[3]]%10);
- c=((s>>4)*10+(s&0x0f));
- SBUF=c;
- while(TI==0);
- TI=0;
- Delay(1000);
- d=(table[tx[4]]/10*16)+(table[tx[4]]%10);
- v=((d>>4)*10+(d&0x0f));
- SBUF=v;
- while(TI==0);
- TI=0;
- Delay(1000);
- }
- }
復制代碼
所有資料51hei提供下載:
串口溫度.rar
(40.68 KB, 下載次數: 17)
2019-4-25 18:06 上傳
點擊文件名下載附件
溫度18b20 下載積分: 黑幣 -5
|