原理图下载:
原理图.pdf
(39.12 KB, 下载次数: 21)
单片机源码:
- #include<reg52.h>
- #define ui unsigned int
- #define uc unsigned char //宏定义
- sbit DQ =P3^7; //定义DS18B20总线I/O
- bit bdata fuhao;
- uc qian,bai,shi,ge;
- uc code led[] = {0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7};
- uc code led_dian[] = {0x7f,0x64,0xbd,0xf5,0xe6,0xf3,0xfb,0x67,0xff,0xf7};
- //============================================================================================
- //====================================DS18B20=================================================
- //============================================================================================
- /*****延时子程序*****/
- void Delay(int num)
- {
- while(num--) ;
- }
- /*****初始化DS18B20*****/
- void Init_DS18B20()
- {
- DQ = 1; //DQ复位
- Delay(8); //稍做延时
- DQ = 0; //单片机将DQ拉低
- Delay(80); //精确延时,大于480us
- DQ = 1; //拉高总线
- Delay(40);
- }
- /*****读一个字节*****/
- uc ReadOneChar()
- {
- uc i=0;
- uc dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; // 给脉冲信号
- dat>>=1;
- DQ = 1; // 给脉冲信号
- if(DQ)
- dat|=0x80;
- Delay(4);
- }
- return(dat);
- }
- /*****写一个字节*****/
- void WriteOneChar(uc dat)
- {
- uc i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- Delay(5);
- DQ = 1;
- dat>>=1;
- }
- }
- /*****读取温度*****/
- ui ReadTemperature()
- {
- ui a=0,b=0,t=0;
- float tt=0;
- Init_DS18B20();
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0x44); //启动温度转换
- Init_DS18B20();
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器
- a=ReadOneChar(); //读低8位
- b=ReadOneChar(); //读高8位
- t=b;
- t<<=8;
- t=t|a;
- if(t&0xf800)
- {
- t=~t+1;
- fuhao=1;
- }
- else
- fuhao=0;
- tt=t*0.0625;
- t=tt*10+0.5; //放大10倍输出并四舍五入
- return(t);
- }
- /*****读取温度*****/
- void check_wendu()
- {
- ui f;
- f=ReadTemperature(); //获取温度值并减去DS18B20的温漂误差
- qian=f/1000;
- bai=(f%1000)/100; //计算得到十位数字
- shi=((f%1000)%100)/10; //计算得到个位数字
- ge=((f%1000)%100)%10; //计算得到小数位
- }
- /*****显示开机初始化等待画面*****/
- void Disp_init()
- {
- P0 = 0x7f; //显示----
- P2 = 0x7f;
- Delay(100);
- P2 = 0xdf;
- Delay(100);
- P2 = 0xf7;
- Delay(100);
- P2 = 0xfd;
- Delay(100);
- P2 = 0xff; //关闭显示
- }
- /*****显示温度子程序*****/
- void Disp_Temperature() //显示温度
- {
- if(qian==0)
- {
- if(fuhao==1)
- P0=0x7f; //1011 1111
- else
- P0=0xff;
- P2=0xfd;
- Delay(10);
- P2 = 0xff;
- }
- else if(qian!=0)
- {
- P0 =~led[qian];
- P2 = 0xfd;
- Delay(10);
- P2 = 0xff;
- }
- if((bai==0)&&(qian==0))
- {
- P0=0xff; //
- P2=0xf7;
- Delay(10);
- P2=0xff;
- }
- else if((bai==0)&&(qian!=0))
- {
- P0=~led[bai];
- P2=0xf7;
- Delay(10);
- P2=0xff;
- }
- else if(bai!=0)
- {
- P0=~led[bai]; //
- P2=0xf7;
- Delay(10);
- P2=0xff;
- }
- P0=~led_dian[shi]; //
- P2=0xdf;
- Delay(10);
- P2=0xff;
- P0=~led[ge]; //显示符号
- P2=0x7f;
- Delay(10);
- P2=0xff; //关闭显示
- }
- /*****主函数*****/
- void main()
- {
- uc z;
- for(z=0;z<100;z++)
- {
- Disp_init();
- check_wendu();
- }
- while(1)
- {
- check_wendu();
- for(z=0;z<10;z++)
- Disp_Temperature();
- }
- }
复制代码
|