微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于18B20和单片机89C52的测温程序

基于18B20和单片机89C52的测温程序

时间:11-29 来源:互联网 点击:
#include
#include#include"KEY.h"#include"IIC.h"#define uint unsigned int#define uchar unsigned char#define IICADDR 0x20  //存储地址#define LEDIO    P0             //P0扫描段码,P2扫描位选信号 #define LEDCHIP   P2sbit  DQ=P3^2; //18B20接口sbit BEEP=P3^7; // 蜂鸣器接口uchar i=0,mod=0; //扫描变量uchar key1,key2=20;    //按键寄存uchar Tmp_max=10,Tmp_min=5,Tmp;    //温度寄存uint k=0,p=0,num=5000;    //有关扫描的变量/****************温度小数部分用查表法*********************/uchar code LedTab[14]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x063};/***共阴数码管段码表  0    1    2    3    4    5    6    7    8    9    不亮  -    °  */uchar code selchip[6]={0x01,0x02,0x04,0x08,0x10,0x20};//列扫描位选信号uchar data temp_data[2]={0x00,0x00};//读出温度暂放uchar data display[3][7]={{0x00,0x3f,0x3f,0x3f,0x3f,0x3f,0x00},  //显示单元数据,共6个数据一个用作运算                   {0x00,0x3f,0x3f,0x3f,0x3f,0x76,0x00},  //显示H设置最大值{0x00,0x3f,0x3f,0x3f,0x3f,0x38,0x00}};  //显示L设置最小值///////////////////////////////////////////////////////////////////////////////void Delay_tmp(uchar time)   //延时10us  {while(time--){_nop_();_nop_();}}void Delay_2s()    //延时两秒开机检测数码管{unsigned char a,b,c;for(c=23;c>0;c--)for(b=216;b>0;b--)for(a=184;a>0;a--);}/*********************定时器初始化***********************************/void TimerInit(){TMOD=0x01; //定时器1定时扫描ET0=1;EA=1;TH0=0xfc;TL0=0xd8;TR0=1;}/******************定时器中断扫描程序**********************/void timedis() interrupt 1{if(mod) //闪烁程序,提醒用户正在设置{if(num--)  //自动退出闪烁,返回主界面{if(k++<190){P2=0x00;}else{LEDIO=display[mod][i];LEDCHIP=selchip[i];if(i>=5)i=0;else i++;if(p++>190){p=0;k=0;}}}elsemod=0;}else   //正常数码管扫描显示{LEDIO=display[mod][i];LEDCHIP=selchip[i];if(i>=5)i=0;else i++;}TH0=0xfc;TL0=0xd8;}/*********************DS18B20复位函数*****************************/void Temp_Reset(void){EA=0;CY = 1;while (CY){DQ = 0;                     //送出低电平复位信号Delay_tmp(48);              //延时至少480usDQ = 1;                     //释放数据线Delay_tmp(6);               //等待60usCY = DQ;                    //检测存在脉冲Delay_tmp(42);              //等待设备释放数据线}EA=1;}/************************写一字节********************/void Temp_Write_byte(uchar val){uchar i;EA=0;for (i=8;i>0;i--){DQ=0;_nop_();_nop_();val >>=1;; //写数据DQ=CY;Delay_tmp(6); //延时66us等待采样结束DQ=1; //右移一位}EA=1;}/***********************读一字节****************************/char Temp_Read_byte(){uchar i;uchar value=0;EA=0;for(i=0;i<8;i++){value >>=1; //18B20右移一位DQ=0;_nop_();_nop_();   //2usDQ=1;_nop_();_nop_(); //2usif(DQ) //读出来的是1value |=0x80;Delay_tmp(6);    //66us}DQ=1;EA=1;return value;}/***********************读出温度函数*****************************************/void Read_temp(){Temp_Reset();  //总线复位Temp_Write_byte(0xcc);//发skip ROM命令Temp_Write_byte(0xbe);//发读命令temp_data[0]=Temp_Read_byte();//读低8位temp_data[1]=Temp_Read_byte();//读高8位Temp_Reset();Temp_Write_byte(0xcc);//发skip ROM命令Temp_Write_byte(0x44); //温度变换while(!DQ);}/************************温度数据处理函数************************************/void Temp_Change(){bit n=0,n1=0,n2=0;Tmp= ((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<4); //记录当前的温度值,用于比较if(temp_data[1]>127) // 温度为负时{temp_data[1]=(256-temp_data[1]);  //负温度求补码temp_data[0]=(256-temp_data[0]);n=1;}                                                                  display[0][6]=temp_data[0]&0x0f;display[0][4]=LedTab[(uchar)display[0][6]*5/8]; //小数部分display[0][6]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<4);  //整数部分display[0][1]=LedTab[display[0][6]/100]; //十六进制转BCD码display[0][6]=display[0][6]%100;display[0][2]=LedTab[display[0][6]/10]; //十位段码display[0][3]=LedTab[(display[0][6]%10)]|0x80;    //个位段码带小数点display[0][5]=LedTab[12]; //显示度if(display[0][1]==LedTab[0]) //最高位为零时都不显示{display[0][1]=LedTab[10];if(display[0][2]==LedTab[0]) //次高位处理{display[0][2]=LedTab[10];}}         				   if(n)  //负温度时最高位显示“-”display[0][0]=LedTab[11];else display[0][0]=LedTab[10];//////////////////////////////////////////////////处理键盘值if(Tmp_max>127) //最高温度上限处理{n1=1;display[1][6]=(256-Tmp_max);  //负数去反}elsedisplay[1][6]=Tmp_max;display[1][1]=LedTab[display[1][6]/100];  //求最高位display[1][6]=display[1][6]%100;   //求次高位display[1][2]=LedTab[display[1][6]/10];display[1][3]=LedTab[display[1][6]%10]|0x80;         //求个位段码带小数点if(display[1][1]==LedTab[0]) //最高位为0不显示{display[1][1]=LedTab[10];if(display[1][2]==LedTab[0])  //最高位为0次高位为0不显示{display[1][2]=LedTab[10];}}                                                            if(n1)  //负温度时最高位显示“-”display[1][0]=LedTab[11];else {display[1][0]=LedTab[10];   //不显示正}//////////////////////////////////////////////////////////////if(Tmp_min>127) //最低温度下限处理{n2=1;display[2][6]=(256-Tmp_min);  //取反}elsedisplay[2][6]=Tmp_min;display[2][1]=LedTab[display[2][6]/100];   //求最高位display[2][6]=display[2][6]%100;    //求次高位display[2][2]=LedTab[display[2][6]/10];display[2][3]=LedTab[display[2][6]%10]|0x80;    //求个位段码带小数点if(display[2][1]==LedTab[0]) //最高位为0不显示{display[2][1]=LedTab[10];if(display[2][2]==LedTab[0]) //最高位为0次高位为0不显示{display[2][2]=LedTab[10];}}                                                            if(n2)   display[2][0]=LedTab[11];      //负温度时最高位显示“-”else{display[2][0]=LedTab[10]; //不显示正}   }/***************************键盘扫描***************************************/void Key_scanf(){key1=KeyTab[KeyRvs()]; //读取键盘值if(key2!=key1)   //防止连续跳动,释放按键{if(key1==*) //mod选择{mod=mod%2+1;num=5000;}if((key1==0)&&(mod)) //按键加{num=5000;if(mod==1){if(Tmp_max==125) //最高上限温度Tmp_max=202;  //最低温度下限elseTmp_max++;}if(mod==2){if(Tmp_min==125)   //最高上限温度Tmp_min=202;  //最低温度下限elseTmp_min++;}}if((key1==#)&&(mod))   //按键减{num=5000;if(mod==1){if(Tmp_max==202)      //最低温度下限Tmp_max=125;   //最高上限温度elseTmp_max--;}if(mod==2){if(Tmp_min==202)      //最低温度下限Tmp_min=125; //最高上限温度elseTmp_min--;}}if(key1==D)    //确定以后把修改的数据保存起来{mod=0;  //恢复正常显示EA=0;   //IIC写时候保护while(!Write_Byte_iic(IICADDR,0xaa));      //写判断是否设置标志while(!Write_Byte_iic(IICADDR+2,Tmp_max));   //写温度上限while(!Write_Byte_iic(IICADDR+4,Tmp_min));   //写温度下限EA=1;}}key2=key1;   //键值保存。释放按键用}/**************************蜂鸣器报警***************************/void Beep(){char a,b,c;a=Tmp;b=Tmp_max;c=Tmp_min;if((a>=b)||(a				            

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top