多功能数显温度计的设计设计图和程序.docx
《多功能数显温度计的设计设计图和程序.docx》由会员分享,可在线阅读,更多相关《多功能数显温度计的设计设计图和程序.docx(28页珍藏版)》请在冰豆网上搜索。
![多功能数显温度计的设计设计图和程序.docx](https://file1.bdocx.com/fileroot1/2023-1/5/f0bb3490-a721-401a-aa21-cd07b44633c8/f0bb3490-a721-401a-aa21-cd07b44633c81.gif)
多功能数显温度计的设计设计图和程序
设计图
程序
#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);//跳过读序列号操作