本帖最后由 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所测温度
- }
- }
复制代码
|