您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于51单片机的数字频率计
基于89S51的实时数字温度计(DS130218B20)2010-09-0117:22#includereg51.h#includeintrins.h#includemath.h#defineucharunsignedchar#defineuintunsignedint#defineS_RSTDS_RST=1#defineC_RSTDS_RST=0#defineS_CLKDS_CLK=1#defineC_CLKDS_CLK=0#defineWrite_DisableRW_DS1302(0x8e,0x80)//写保护#defineWrite_EnableRW_DS1302(0x8e,0x00)//允许写入sbitSET=P1^5;//设置按键sbitADD=P1^4;//调整加sbitDEC=P1^6;//调整减#defineRdefineT1TH1=0;TL1=0;TR1=0;a=0;//初始化超时检测//#defineDelay2us()_nop_();_nop_();//延时2us,每nop1us//#defineDelay8us()_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();#defineReDetectTime20//设置重复检测次次数,超出次数则超时//ds18b20命令#defineSkipROM0xCC#defineMatchROM0x55#defineReadROM0x33#defineSearchROM0xF0#defineAlarmSearch0xEC#defineConvert0x44//启动温度转换#defineWriteScr0x4E#defineReadScr0xBE#defineCopyScr0x48#defineRecallEE0xB8#defineReadPower0xB4#definemdcollect_time[0]&0x0f#definemg(collect_time[0]&0x70)/16#definefdcollect_time[1]&0x0f#definefg(collect_time[1]&0x70)/16#definesdcollect_time[2]&0x0f#definesg(collect_time[2]&0x30)/16sbitDS_RST=P1^2;//DS复位端sbitDS_CLK=P1^0;//SCLK端sbitDS_IO=P1^1;//IO端sbitDS18B20=P1^3;//温度传感器接口bitkeyboard,flash,STA=1;ucharchoose,a;ucharcollect_time[3]={0x45,0x23,0x11};//定义变量秒分时ucharcollect_temperature[2]={0};ucharnum[10]={0x7e,0x48,0x3d,0x6d,0x4b,0x67,0x77,0x4c,0x7f,0x6f};//七段数码管显示的段码uchardisplay[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};voiddelay(uinti){uintk;while(i--){for(k=0;k120;k++){;}}}voidDat_Int(void)//数据初始化{P0=0xff;P1=0xff;P2=0xff;choose=0;flash=1;}voidTime01_Int(void){TMOD=0x12;//定时器0为8位自动重载定时采样,定时器1为16位超时检测处理TCON=0x00;TH0=0x60;TL0=0x60;TR0=1;IE=0x0a;//允许定时器0、1中断IP=0x00;}/***********************************************************DS18B20温度传感器程序段***********************************************************//***********11微秒延时函数**********///voiddelayus(uintt){for(;t0;t--);}/***********18B20复位函数**********/voidow_reset(void){charpresence=1;while(presence){while(presence){DS18B20=1;_nop_();_nop_();DS18B20=0;delayus(50);//550usDS18B20=1;delayus(6);//66uspresence=DS18B20;//presence=0继续下一步}delayus(45);//延时500uspresence=~DS18B20;}DS18B20=1;}/**********18B20写命令函数*********///向1-WIRE总线上写一个字节voidwrite_byte(ucharval){uchari;for(i=8;i0;i--)//{DS18B20=1;_nop_();_nop_();DS18B20=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5usDS18B20=val&0x01;//最低位移出delayus(6);//66usval=val/2;//右移一位}DS18B20=1;delayus(1);}///*********18B20读1个字节函数********///从总线上读取一个字节ucharread_byte(void){uchari;ucharvalue=0;for(i=8;i0;i--){DS18B20=1;_nop_();_nop_();value=1;DS18B20=0;//_nop_();_nop_();_nop_();_nop_();//4usDS18B20=1;_nop_();_nop_();_nop_();_nop_();//4usif(DS18B20)value|=0x80;delayus(6);//66us}DS18B20=1;return(value);}///***********读出温度函数**********///voidDs18b20_ReadEE(void){ow_reset();write_byte(SkipROM);//SkipROMwrite_byte(Convert);//发转换命令ow_reset();//总线复位write_byte(SkipROM);//发SkipROM命令write_byte(ReadScr);//发读命令collect_temperature[0]=read_byte();//温度低8位collect_temperature[1]=read_byte();//温度高8位}/***********************************************************DS1302时钟芯片程序段***********************************************************/voidDS1302_InputByte(ucharbyte)//往DS1302写入1Byte数据{uchari;uchartemp;temp=byte;for(i=8;i0;i--){DS_IO=temp&0x01;S_CLK;C_CLK;temp=temp1;}}ucharDS1302_OutputByte(void)//从DS1302读取1Byte数据{uchari;uchartemp=0;for(i=0;i8;i++){C_CLK;if(DS_IO!=0)temp|=(1i);S_CLK;}return(temp);}voidRW_DS1302(ucharreg,ucharbyte)//向DS1302寄存器写数据{C_RST;C_CLK;S_RST;DS1302_InputByte(reg);DS1302_InputByte(byte);S_CLK;C_RST;}ucharRead_DS1302(ucharreg)//从DS1302寄存器读数据{ucharbyte;C_RST;C_CLK;S_RST;DS1302_InputByte(reg);byte=DS1302_OutputByte();S_CLK;C_RST;return(byte);}voidGetTime_DS1302(uchar*ucCurtime)//读取DS1302当前时间{ucCurtime[0]=Read_DS1302(0x81);//格式为:秒分时ucCurtime[1]=Read_DS1302(0x83);ucCurtime[2]=Read_DS1302(0x85);}voidSet_Time(uchar*receive)//写时间{Write_Enable;//控制命令,允许写操作RW_DS1302(0x80,receive[0]);RW_DS1302(0x82,receive[1]);RW_DS1302(0x84,receive[2]);Write_Disable;//控制命令,写保护}/***********************************************************数码管显示程序段***********************************************************/voiddeal(void)//送显前的数据处理{uinttimer2;uintlstemp;timer2++;if(STA){GetTime_DS1302(collect_time);}if(flash)//用于闪动效果的控制的{display[0]=num[sg];display[1]=num[sd];display[2]=num[fg];display[3]=num[fd];display[4]=num[mg];display[5]=num[md];}else{switch(choose){case1:display[0]=0;break;case2:display[1]=0;break;case3:display[2]=0;break;case4:display[3]=0;break;case5:display[4]=0;break;case6:display[5]=0;break;}}if(timer2==3000)//间断性获取温度{timer2=0;if(STA){TR0=0;Ds18b20_ReadEE();TR0=1;}}if(collect_temperature[1]127){collect_temperature[0]=255-collect_temperature[0];collect_temperature[1]=255-collect_temperature[1];}lstemp=((collect_temperature[0])4)|((collect_temperature[1])4);display[6]=num[(uchar)((lstemp)/10)];display[7]=num[(uchar)((lstemp)%10)];}/***********************************************************按键控制程序段***********************************************************/voidScan(void){if(SET==0&&keyboard==1)//检测设置键有无按下,并进行相应操作{if(SET==0&&keyboard==1){RdefineT1;/
本文标题:基于51单片机的数字频率计
链接地址:https://www.777doc.com/doc-2567843 .html