本帖最后由 51黑電子會員 于 2020-5-19 11:12 編輯
- #include<reg52.h>//包含51單片機內部寄存器頭文件
- #define uchar unsigned char// 自定義uchar為unsigned char(即無符號字符型數據,數據范圍:0到255。)
- #define uint unsigned int//自定義uint為unsigned int(即無符號字符整數型數據,數據范圍:0到6355。)
- uchar code table0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; //共陰數碼管字碼表
- uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //個位帶數點字碼表
- uchar code Wei[]={0xfe,0xfd,0xfb,0xf7};//數碼管位數碼表
- //uchar Display_data[4];//顯示數據數組
- uint Temperature_value;//溫度值
- uint bai,shi,ge,xiaoshu;
- uchar Temperature_flag;//溫度負標志
- sbit DQ=P1^6;//DS18B20數據信號端口
- /*DS18B20的延時函數*/
- void DS18B20_Delay(uint i)
- {
- while(i--);
- }
- /*DS18B20的初始化函數*/
- void DS18B20_Init()
- {
- uchar x=0;
- DQ = 1;//DS18B20數據信號端口DQ復位
- DS18B20_Delay(4);
- DQ = 0;//DS18B20數據信號端口DQ拉低
- DS18B20_Delay(100);//精確延于480us
- DQ = 1;//DS18B20數據信號端口拉高
- DS18B20_Delay(40);
- }
- /*DS18B20讀一個字節函數*/
- uchar DS18B20_ReadOneByte()
- {
- uchar i=0;
- uchar j=0;
- for (i=8;i>0;i--)
- {
- DQ = 0;//給脈沖信號
- j>>=1;
- DQ = 1;//給脈沖信號
- if(DQ)
- j|=0x80;
- DS18B20_Delay(10);
- }
- return(j);
- }
- /*DS18B20寫一個字節函數*/
- void DS18B20_WriteOneByte(uchar k)
- {
- uchar i=0;
- for (i=8; i>0; i--)//向DS18B20數據信號端口DQ寫入數據8次
- {
- DQ = 0;//DS18B20數據信號端口DQ置低電平
- DQ = k&0x01;//按從低位到高位的順序向DS18B20數據信號端口DQ發送字節(一次只發送一位)
- DS18B20_Delay(10);
- DQ = 1;//DS18B20數據信號端口DQ置高電平
- k>>=1;//重復以上的操作,直到所有的字節全部發送完為止。
- }
- }
- /*單片機讀取DS18B20當前溫度的函數*/
- DS18B20_ReadTemperature()
- {
- uchar a,b;
- DS18B20_Init();//DS18B20初始化
- DS18B20_WriteOneByte(0xcc);//跳讀序列號
- DS18B20_WriteOneByte(0x44);//啟溫度轉換
- DS18B20_Init();//DS18B20初始化
- DS18B20_WriteOneByte(0xcc);//跳讀序列號
- DS18B20_WriteOneByte(0xbe);//讀取溫度
- a=DS18B20_ReadOneByte();//讀取到的第一個字節為溫度LS BYTE
- b=DS18B20_ReadOneByte();//讀取到的第一個字節為溫度MS BYTE
- Temperature_value=b;//先把高八位有效數據賦于Temperature
- Temperature_value<<=8;
- Temperature_value=Temperature_value|a;
- if(Temperature_value<0x0fff)
- Temperature_flag=0;
- else
- {
- Temperature_value=~Temperature_value+2;
- Temperature_flag=1;//負溫度
- }
- Temperature_value=Temperature_value*(0.625);//溫度值擴大10倍,并精確到1位數。
- return(Temperature_value);
- }
- /*DS18B20所測溫度值顯示函數*/
- void DS18B20_Display()
- {
- uchar i;
- bai=Temperature_value/1000;//百位數
- shi=Temperature_value%1000/100;//十位數
- ge=Temperature_value%100/10;//個位數
- xiaoshu=Temperature_value%10;//小數位
- if(Temperature_flag==0)
- {
- if(bai==0x00)
- {
- bai=0x00;//百位數的0顯示
- if(shi==0x00)
- shi=0x00;//十位數的0顯示
- }
- }
- else //負溫度
- {
- bai=0x0b;//負溫度百位顯示負號:-
- if(shi==0x00)
- shi=0x00;//十位數的0顯示
- }
- for(i=0;i<10;i++)
- {
- P2=Wei[0];
- P0=table0[bai];//百位
- DS18B20_Delay(20);
- P2=Wei[1];
- P0=table0[shi];//十位
- DS18B20_Delay(20);
- P2=Wei[2];
- P0=table1[ge];//個位
- DS18B20_Delay(20);
- P2=Wei[3];
- P0=table0[xiaoshu];//小數位
- DS18B20_Delay(20);
-
-
- }
- }
- /*主函數*/
- void main()
- {
- DS18B20_Init();//DS18B20初始化顯示
- while(1)
- {
- DS18B20_ReadTemperature();//單片機讀取DS18B20當前溫度
- DS18B20_Display();//共陰數碼管顯示DS18B20所測溫度
- }
- }
復制代碼
圖片116.png (74.07 KB, 下載次數: 44)
下載附件
2020-5-14 20:02 上傳
圖片117.png (73.85 KB, 下載次數: 60)
下載附件
2020-5-14 20:02 上傳
圖片118.png (76.4 KB, 下載次數: 64)
下載附件
2020-5-14 20:02 上傳
|