多功能数显温度计的设计设计图和程序.docx

上传人:b****6 文档编号:6359916 上传时间:2023-01-05 格式:DOCX 页数:28 大小:73.71KB
下载 相关 举报
多功能数显温度计的设计设计图和程序.docx_第1页
第1页 / 共28页
多功能数显温度计的设计设计图和程序.docx_第2页
第2页 / 共28页
多功能数显温度计的设计设计图和程序.docx_第3页
第3页 / 共28页
多功能数显温度计的设计设计图和程序.docx_第4页
第4页 / 共28页
多功能数显温度计的设计设计图和程序.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

多功能数显温度计的设计设计图和程序.docx

《多功能数显温度计的设计设计图和程序.docx》由会员分享,可在线阅读,更多相关《多功能数显温度计的设计设计图和程序.docx(28页珍藏版)》请在冰豆网上搜索。

多功能数显温度计的设计设计图和程序.docx

多功能数显温度计的设计设计图和程序

设计图

程序

#include

#include

//#include"LCD1602.h"

//#include"DS1302.h"

#defineuintunsignedint

#defineucharunsignedchar

sbitData=P3^5;//DHT11定义数据线

ucharrec_dat[9];//用于显示的接收数据组

uchara[2]="RH";

//sbitDS1302_CLK=P1^7;//实时时钟时钟线引脚

//sbitDS1302_IO=P1^6;//实时时钟数据线引脚

//sbitDS1302_RST=P1^5;//实时时钟复位线引脚

sbitDS1302_CLK=P1^4;//实时时钟时钟线引脚

sbitDS1302_IO=P1^5;//实时时钟数据线引脚

sbitDS1302_RST=P1^6;//实时时钟复位线引脚

sbitwireless_1=P3^0;

sbitwireless_2=P3^1;

sbitwireless_3=P3^2;

sbitwireless_4=P3^3;

sbitACC0=ACC^0;

sbitACC7=ACC^7;

charhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;//

sbitSet=P2^0;//模式切换键

sbitUp=P2^1;//加法按键

sbitDown=P2^2;//减法按键

sbitout=P2^3;//跳出调整模式按键

//sbitDQ=P1^0;//温度传输数据I/O口

sbitDQ=P1^3;//温度传输数据I/O口

chardone,count,temp,flag,up_flag,down_flag;//

uchartemp_value;//温度值

ucharTempBuffer[5],week_value[2];//

voidDHT11_delay_us(ucharn)

{

while(--n);

}

voidDHT11_delay_ms(uintz)

{

uinti,j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

}

voidDHT11_start()

{

Data=1;

DHT11_delay_us

(2);

Data=0;

DHT11_delay_ms(30);//延时18ms

Data=1;

DHT11_delay_us(30);

}

ucharDHT11_rec_byte()//接收一个字节

{

uchari,dat=0;

for(i=0;i<8;i++)//从高到低依次接受8位数据

{

while(!

Data);//等待50us低电平

DHT11_delay_us(8);//延时60us

dat<<=1;//移位接收8位数据

if(Data==1)

dat+=1;

while(Data);//等待数据拉低

}

returndat;

}

voidDHT11_receive()//接收40位的数据

{

ucharR_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;

DHT11_start();

if(Data==0)

{

while(Data==0);//等待拉高后延迟

DHT11_delay_us(40);//拉高延时80us

R_H=DHT11_rec_byte();//接收湿度高8位

R_L=DHT11_rec_byte();//接收湿度低8位

T_H=DHT11_rec_byte();//接收温度高8位

T_L=DHT11_rec_byte();//接收稳度低8位

revise=DHT11_rec_byte();//接收校正位

DHT11_delay_us(25);//结束

if((R_H+R_L+T_H+T_L)==revise)//校正

{

RH=R_H;

RL=R_L;

TH=T_H;

TL=T_L;

}

/*数据处理,方便显示*/

rec_dat[0]='0'+(RH/10);

rec_dat[1]='0'+(RH%10);

//rec_dat[2]='R';

//rec_dat[3]='H';

//rec_dat[4]='';

//rec_dat[5]='';

//rec_dat[6]='0'+(TH/10);

//rec_dat[7]='0'+(TH%10);

//rec_dat[8]='C';

}

}

voidshow_time();//液晶显示程序

/***********1602液晶显示部分子程序****************/

//PortDefinitions***************************************

sbitLcdRs=P1^2;

sbitLcdRw=P1^1;

sbitLcdEn=P1^0;

sfrDBPort=0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

//内部等待函数*******************************************

unsignedcharLCD_Wait(void)

{

LcdRs=0;

LcdRw=1;_nop_();

LcdEn=1;_nop_();

LcdEn=0;

returnDBPort;

}

//向LCD1602写入命令或数据********************************

#defineLCD_COMMAND0//Command

#defineLCD_DATA1//Data

#defineLCD_CLEAR_SCREEN0x01//清屏

#defineLCD_HOMING0x02//光标返回原点

voidLCD_Write(bitstyle,unsignedcharinput)

{

LcdEn=0;

LcdRs=style;

LcdRw=0;_nop_();

DBPort=input;_nop_();//顺序

LcdEn=1;_nop_();

LcdEn=0;_nop_();

LCD_Wait();

}

//设置显示模式*******************************************

#defineLCD_SHOW0x04//显示开

#defineLCD_HIDE0x00//显示关

#defineLCD_CURSOR0x02//显示光标

#defineLCD_NO_CURSOR0x00//无光标

#defineLCD_FLASH0x01//光标闪动

#defineLCD_NO_FLASH0x00//光标不闪动

voidLCD_SetDisplay(unsignedcharDisplayMode)

{

LCD_Write(LCD_COMMAND,0x08|DisplayMode);

}

//设置输入模式*******************************************

#defineLCD_AC_UP0x02

#defineLCD_AC_DOWN0x00//default

#defineLCD_MOVE0x01//画面平移

#defineLCD_NO_MOVE0x00//default

voidLCD_SetInput(unsignedcharInputMode)

{

LCD_Write(LCD_COMMAND,0x04|InputMode);

}

LCD1602初始化程序如下:

//初始化LCD******************************************

voidLCD_Initial()

{

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38);//8位数据端口,两行显示,5*7点整

LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//开启显示,无光标

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC递增,画面不动

}

//液晶字符输入的位置*********************************

voidGotoXY(unsignedcharx,unsignedchary)

{

if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));

}

//字符数输出到液晶显示*********************************

voidPrint(unsignedchar*str)

{

while(*str!

='\0')//while(*str!

='\0')

{

LCD_Write(LCD_DATA,*str);

str++;

}

}

DS1302时间模块写入数据与传输数据程序如下

typedefstructSYSTEMTIME

{

unsignedcharSecond;

unsignedcharMinute;

unsignedcharHour;

unsignedcharWeek;

unsignedcharDay;

unsignedcharMonth;

unsignedcharYear;

unsignedcharDateString[11];

unsignedcharTimeString[9];

}SYSTEMTIME;//定义的时间类型

SYSTEMTIMECurrentTime;

#defineAM(X)X

#definePM(X)(X+12)//转成24小时制

#defineDS1302_SECOND0x80//时钟芯片的寄存器位置,存放时间

#defineDS1302_MINUTE0x82

#defineDS1302_HOUR0x84

#defineDS1302_WEEK0x8A

#defineDS1302_DAY0x86

#defineDS1302_MONTH0x88

#defineDS1302_YEAR0x8C

voidDS1302InputByte(unsignedchard)//实时时钟写入一字节(内部函数)

{

unsignedchari;

ACC=d;

for(i=8;i>0;i--)

{

DS1302_IO=ACC0;//相当于汇编中的RRC

DS1302_CLK=1;

DS1302_CLK=0;

ACC=ACC>>1;

}

}

unsignedcharDS1302OutputByte(void)//实际时钟读取一字节(内部函数)

{

unsignedchari;

for(i=8;i>0;i--)

{

ACC=ACC>>1;//相当于汇编中的RRC

ACC7=DS1302_IO;

DS1302_CLK=1;

DS1302_CLK=0;

}

return(ACC);

}

voidWrite1302(unsignedcharucAddr,unsignedcharucDa)

{

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

DS1302InputByte(ucAddr);//地址、命令

DS1302InputByte(ucDa);//写1Byte命令

DS1302_CLK=1;

DS1302_RST=0;

}

unsignedcharRead1302(unsignedcharucAddr)//读取DS1302数据

{

unsignedcharucData;

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

DS1302InputByte(ucAddr|0x01);//地址、命令

ucData=DS1302OutputByte();//写1Byte数据

DS1302_CLK=1;

DS1302_CLK=1;

DS1302_RST=0;

return(ucData);

}

voidDS1302_GetTime(SYSTEMTIME*Time)//获取时钟芯片数据到自定义结构型数组

{

unsignedcharReadValue;

ReadValue=Read1302(DS1302_SECOND);

Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_MINUTE);

Time->Minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_HOUR);

Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_DAY);

Time->Day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_WEEK);

Time->Week=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_MONTH);

Time->Month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_YEAR);

Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

}

voidDateToStr(SYSTEMTIME*Time)//将数据转换LCD字符串放在DateString[]

{if(hide_year<2)//输出字符串2007/07/22

{

Time->DateString[0]='2';

Time->DateString[1]='0';

Time->DateString[2]=Time->Year/10+'0';

Time->DateString[3]=Time->Year%10+'0';

}

else

{

Time->DateString[0]='';

Time->DateString[1]='';

Time->DateString[2]='';

Time->DateString[3]='';

}

Time->DateString[4]='/';

if(hide_month<2)

{

Time->DateString[5]=Time->Month/10+'0';

Time->DateString[6]=Time->Month%10+'0';

}

else

{

Time->DateString[5]='';

Time->DateString[6]='';

}

Time->DateString[7]='/';

if(hide_day<2)

{

Time->DateString[8]=Time->Day/10+'0';

Time->DateString[9]=Time->Day%10+'0';

}

else

{

Time->DateString[8]='';

Time->DateString[9]='';

}

if(hide_week<2)

{

week_value[0]=Time->Week%10+'0';//星期另存不跟年月日一起放

}

else

{

week_value[0]='';

}

week_value[1]='\0';

Time->DateString[10]='\0';//字符串末尾加结束字符

}

voidTimeToStr(SYSTEMTIME*Time)//时分秒放入LCD字符串TimeString[]内;

{if(hide_hour<2)

{

Time->TimeString[0]=Time->Hour/10+'0';

Time->TimeString[1]=Time->Hour%10+'0';

}

else

{

Time->TimeString[0]='';

Time->TimeString[1]='';

}

Time->TimeString[2]=':

';

if(hide_min<2)

{

Time->TimeString[3]=Time->Minute/10+'0';

Time->TimeString[4]=Time->Minute%10+'0';

}

else

{

Time->TimeString[3]='';

Time->TimeString[4]='';

}

Time->TimeString[5]=':

';

if(hide_sec<2)

{

Time->TimeString[6]=Time->Second/10+'0';

Time->TimeString[7]=Time->Second%10+'0';

}

else

{

Time->TimeString[6]='';

Time->TimeString[7]='';

}

Time->DateString[8]='\0';

}

voidInitial_DS1302(void)//时钟芯片初始化

{

unsignedcharSecond=Read1302(DS1302_SECOND);

if(Second&0x80)//判断是否关闭

{

Write1302(0x8e,0x00);//写入允许

Write1302(0x8c,0x07);//写入时间07/07/25星期3时间23:

59:

55

Write1302(0x88,0x07);

Write1302(0x86,0x25);

Write1302(0x8a,0x07);//xingqi

Write1302(0x84,0x23);

Write1302(0x82,0x59);

Write1302(0x80,0x55);

Write1302(0x8e,0x80);//关闭写入

}

}

/***********ds18b20子程序*************************/

/***********ds18b20延时子程序12MHz*******/

voiddelay_18B20(unsignedinti)

{

while(i--);

}

/**********ds18b20初始化**********************/

voidInit_DS18B20(void)

{

unsignedcharx=0;

DQ=1;

delay_18B20(8);

DQ=0;

delay_18B20(80);

DQ=1;

delay_18B20(14);

x=DQ;

delay_18B20(20);

}

/***********ds18b20读数据程序如下**************/

unsignedcharReadOneChar(void)

{

uchari=0;

uchardat=0;

for(i=8;i>0;i--)

{

DQ=0;//给脉冲信号

dat>>=1;//数据右移

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;//按位或取最高位

delay_18B20(4);

}

return(dat);

}

/*************ds18b20写数据程序如下****************/

voidWriteOneChar(uchardat)

{

unsignedchari=0;

for(i=8;i>0;i--)

{

DQ=0;

DQ=dat&0x01;//取最低位

delay_18B20(5);

DQ=1;//上升沿将数据送入

dat>>=1;

}

}

/**************ds18b20读取当前温度************/

voidReadTemp(void)

{

unsignedchara=0;

unsignedcharb=0;

unsignedchart=0;

Init_DS18B20();

WriteOneChar(0xCC);//跳过读序列号操作

WriteOneChar(0x44);//启动温度转换

delay_18B20(100);//thismessageisweryimportant

Init_DS18B20();

WriteOneChar(0xCC);//跳过读序列号操作

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1