这个用单片机最小系统+DS18B20进行温度测量试验,所需要器材:一块单片机最小系统、一只DS18B20数字温度传感器,测试结果经串口发送到PC机,通过电脑串口调试软件显示测量结果,测量范围-55-125度,保留一位小数。关于单片机最小系统的制作,在本空间有详细介绍,本文就不作介绍,相关的原理图、PCB图、元件清单等内容有,这里就不作介绍了,需要制作的爱好者可参考本空间的手把手制作单片机最小系统。这里只给出单片机最小系统+DS18B20进行温度测量试验的具体程序的压缩包,需要的可以自己下载。需要说明的是,DS18B20的1脚接地、数据端口(2脚)是直接焊接在单片机最小系统板上的单片机P2.0口上、3脚接+5伏。DS18B20的2脚接正电源的4.7K的电阻可以省去,原因是单片机内部是自己带有上接电阻。下面是试验的相关图片。
下载:
用单片机最小系统 DS18B20进行温度测量试验程序.rar
(389.53 KB, 下载次数: 394)
串口调试助手等单片机工具软件的下载地址:http://www.51hei.com/mcudown/

源代码:
- //单片机使用AT89C51晶振11.0592MHz
- //读取DS18B20上的数据,发送至电脑
- //数据格式:符号、十位、个位、小数、换行符
- //分别发送。 串口:(9600,N,8,1)
- #include<at89x51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define DQ P2_0 //定义P0.0口为单总线数据口
- uchar code st[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//小数部分转换
- bit stop=1;
- uchar pe=0; //发送指针
- uchar t=0; //延时计数
- uchar rad; //温度数值
- uchar disply[]={'0','0','0','.','0','\n'};//温度极性,十位,个位,小数
- void temp(uchar aa);
- void rest(void);
- void write(uchar da);
- void read(void);
- void hand(void);
- void disp(void);
- void timer(void);
- void temp(uchar aa)
- {
- while(--aa); //每执行一次2uS
- }
- void rest(void) //返回"1"时表示有设备应答,复位成功
- {
- DQ=1;
- DQ=0;
- temp(225); //大于480us低电平产生复位
- DQ=1;
- temp(150);
- }
- void write(uchar da)
- {
- uchar wb=0x01,t;
- for(t=0;t<8;t++)
- {
- if(da&wb)
- {
- DQ=0;
- temp(1);
- DQ=1;
- temp(17);
- }
- else
- {
- DQ=0;
- temp(12);
- DQ=1;
- temp(6);
- }
- wb=wb<<1;
- }
- }
- void read(void)
- {
- uchar sb=0x01,s,tes;
- bit pdt;
- rad=0;
- for(s=0;s<8;s++)
- {
- DQ=0;
- DQ=1;
- temp(2);
- pdt=DQ;
- temp(18);
- if(pdt)
- {
- rad=rad|sb;
- }
- sb=sb<<1;
- tes=rad;
- }
- }
- void hand(void)
- {
- uchar et,lcm,hcm;
- uint cm;
- rest();
- write(0xcc); //跳过
- write(0x44); //启动转换
- timer(); //延时500ms
- rest();
- write(0xcc); //跳过
- write(0xbe); //读取命令
- read();
- lcm=rad;
- read();
- hcm=rad;
- cm=hcm;
- cm=cm<<8;
- cm=cm|lcm;
- if(cm&0xf000)
- {
- cm=~cm;
- cm++;
- disply[0]='-';
- }
- else
- {
- disply[0]=' ';
- }
- et=cm&0x000f;
- disply[4]=st[et]|0x30; //截取后四位,查表转换后,填入显示缓冲区
- et=cm>>4;
- if(et>99)
- {
- disply[0]='1';
- et=et-100;
- }
- disply[1]=(et/10)|0x30; //取温度整数
- disply[2]=(et%10)|0x30;
- stop=0;
- }
- void pc(void) interrupt 4 //串口中断
- {
- if(TI)
- {
- if(pe>5) //发送完成
- {
- pe=0;
- stop=1;
- }
- else //继续发送剩余部分
- {
- ACC=disply[pe];
- SBUF=ACC;
- pe++;
- }
- TI=0;
- }
- }
- void disp(void)
- {
- stop=0;
- ACC=disply[0];
- SBUF=ACC;
- pe++;
- }
- void tep(void) interrupt 1 //定时器0中断
- {
- TH0=0x4c;
- TL0=0x00;
- t++;
- }
- void timer(void) //延时500ms
- {
- TR0=1;
- while(t<50); //启动定时器,等待10次中断
- TR0=0;
- t=0;
- TH0=0x4c;
- TL0=0x00;
- }
- void main(void)
- {
- TMOD=0x21; //定时器1模式2;定时器0模式1
- // TH1=0xfd;
- // TL1=0xfd; //波特率9600,11.0592MHz晶振
- TH1=0xE6;
- TL1=0xE6; //波特率1200,12MHz晶振
- TH0=0x4c;
- TL0=0x00; //定时器初值,50ms
- SCON=0x50; //串口模式1,允许接受,单机通讯0x90
- PCON=0;
- IE=0x92; //开所有中断,开串口中断,开T0中断
- TR1=1; //启动T1,波特率发生器
- TR0=0; //暂停T0
- disp();
- while(1)
- {
- while(!stop);
- hand();
- disp();
- }
- }
复制代码
|