文档详情

protues仿真DS18B20温度控制(共12页)

des****85
实名认证
店铺
DOCX
84.38KB
约12页
文档ID:221008049
protues仿真DS18B20温度控制(共12页)_第1页
1/12

精选优质文档-----倾情为你奉上电路图仿真图温控范围25到35度之间源程序#include //包含单片机寄存器的头文件#include //包含_nop_()函数定义的头文件#include #include sbit DQ=P1^1; sbit jdq=P1^0; sbit dot=P2^7; unsigned char code xiaoshu[]={0xc0,0xc0,0xf9,0xf9,0xa4,0xb0,0xb0,0x99,0x92,0x92,0x82,0xf8,0xf8,0x80,0x80,0x90}; char duan[4]={0,0,0,0}; unsigned char code weikong[]={0x01,0x02,0x04,0x08,0x10,0x20}; unsigned char code table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; int bai,shi,ge,flag=0,i; unsigned char temp; unsigned char TL; //储存暂存器的温度低位 unsigned char TH; //储存暂存器的温度高位 unsigned char TN; //储存温度的整数部分 unsigned int TD; //储存温度的小数部分void delay1ms(){ unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; } void delaynms(int n) { unsigned char i; for(i=0;i>=1; _nop_(); //等待一个机器周期 DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备 for(time_DS18B20=0;time_DS18B20<3;time_DS18B20++); //延时约6us,使主机在15us内采样 if(DQ==1) dat|=0x80; //如果读到的数据是1,则将1存入dat else dat|=0x00;//如果读到的数据是0,则将0存入dat //将单片机检测到的电平信号DQ存入r[i] for(time_DS18B20=0;time_DS18B20<8;time_DS18B20++) ; //延时3us,两个读时序之间必须有大于1us的恢复期 } return(dat); //返回读出的十进制数据}WriteOneChar(unsigned char dat){ unsigned char i=0; for (i=0; i<8; i++) { DQ =1; // 先将数据线拉高 _nop_(); //等待一个机器周期 DQ=0; //将数据线从高拉低时即启动写时序 DQ=dat&0x01; //利用与运算取出要写的某位二进制数据, //并将其送到数据线上等待DS18B20采样 for(time_DS18B20=0;time_DS18B20<10;time_DS18B20++) ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样 DQ=1; //释放数据线 for(time_DS18B20=0;time_DS18B20<1;time_DS18B20++) ;//延时3us,两个写时序间至少需要1us的恢复期 dat>>=1; //将dat中的各二进制位数据右移1位 } for(time_DS18B20=0;time_DS18B20<4;time_DS18B20++) ; //稍作延时,给硬件一点反应时间}void ReadyReadTemp(void){ Init_DS18B20(); //将DS18B20初始化 WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 for(time_DS18B20=0;time_DS18B20<100;time_DS18B20++) ; //温度转换需要一点时间 Init_DS18B20(); //将DS18B20初始化 WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位 TL=ReadOneChar(); //先读的是温度值低位 TH=ReadOneChar(); //接着读的是温度值高位 }void display(){ if(TH>=8) { TH=~TH; //当温度为负数时求负数的补码 TL=~TL; TL=TL+1; flag=1; //当温度为负值时标志置1 if(TL==0) TH+=1; } duan[0]=TL&0X0f; //保存小数部分的值 temp=(((TH<<4)&0x70)|(TL>>4)); //将高8位的低3位和低8位的高4位合并构成温度的整数部分 duan[3]=temp/100; //取百位 duan[2]=temp%100/10; //取十位 duan[1]=temp%10; //取个位 P2=xiaoshu[duan[0]];//显示小数部分 P3=0x01; delaynms(3); P3=0; if(duan[3]) //显示百位 { P3=weikong[3]; P2=table[duan[3]]; delaynms(3); P3=0; } if(duan[3]) { //显示十位 P3=weikong[2]; P2=table[duan[2]]; delaynms(3); P3=0; } else { if(duan[2]) //显示十位 { P3=weikong[2]; P2=table[duan[2]]; delaynms(3); P3=0; } } P3=weikong[1]; //显示个位 P2=table[duan[1]]; dot=0; //显示小数点 delaynms(3); P3=0; if(flag) //当温度为负数时显示符号位 { P2=0xbf; if(!duan[3]) { P3=0x08; if(!duan[2]) P3=0x04; } else { P3=0x10; } delaynms(1); P3=0; flag=0; } delaynms(25); //延时一段时间} void main(void) { while(1) //不断检测并显示温度 { ReadyReadTemp(); //读温度准备 display(); if((temp<25)||(temp>35)) //如果温度超出范围继电器工作控制温度 { jdq=1; } else { jdq=0; } }} 专心---专注---专业。

下载提示
相似文档
正为您匹配相似的精品文档
相关文档