基于STC89C52单片机的蔬菜大棚实时温度测量控制系统

news/2024/5/5 11:16:08/文章来源:https://blog.csdn.net/newlw/article/details/127314025

目录
摘要 …………………………………………………………………………………I
ABSTRACT II
第一章 设计任务及方案分析 1
1.1 设计任务及要求 1
1.2 设计总体方案及方案论证 1
1.3 温度测量的方案与分析 1
1.31芯片选择 1
1.32实现方法简介 2
1.33 方案设计 2
第二章 芯片简介 4
2.1 STC89C52芯片简介 4
2.11引脚功能说明 4
2.2 DS18B20简介 7
2.21芯片简介 7
2.22 DS18B20外形和内部结构 8
2.24 DS18B20的工作时序 11
2.25 DS18B20与单片机的典型接口设计 12
2.26 DS18B20的各个ROM命令 13
2.3 74HC595简介 15
2.31芯片简介 15
2.32 74HC595特点: 15
2.33 引脚图及各引脚功能 16
第三章 系统硬件电路的设计 17
3.1主控制电路和测温控制电路原理图 17
3.2驱动电路与显示电路模块原理图 17
第四章 软件编程与功能调试 19
4.2 系统软件设计 19
4.2.1 系统软件设计整体思路 19
4.2.2 系统程序流图 20
4.3 系统的程序 23
第四章 仿真分析与实物制作 51
4.1 PROTUES软件简介 51
4.2 实物制作 51
第五章 总结 52
致谢 53
第一章 设计任务及方案分析
1.1 设计任务及要求
设计一个以单片机为核心的蔬菜大棚实时温度测量控制系统,可实现的功能为:
(1)测量温度值精度为±1℃。
(2)系统允许的误差范围为1℃以内。
(3)系统可由用户预设温度值,测温范围为-55℃~+125℃。
(4)到达用户预设温度时,电机转动给大棚降温。
(5)显示当前时间。
1.2 设计总体方案及方案论证
在日常生活及工农业生产中经常要用到温度的检测及控制,传统的测温元件有热电偶和热点阻。而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持,硬件电路复杂,软件调试复杂,制作成本高。
本数字温度计设计采用美国DALLAS半导体公司继DS18B20之后推出的一种改进智能温度传感器DS18B20作为检测元件,测温范围为-55℃~+125℃,最大分辨率可达0.0625℃。DS18B20可以直接读出被测量的温度值,而采用3线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。
按照系统设计功能的要求,确定系统由5个模块组成:主控制器STC89C52,温度传感器DS18B20,驱动显示电路。数字温度计总体电路框图如图1-1所示。
图1-1 总体电路图
在这里插入图片描述

1.3 温度测量的方案与分析
1.31芯片选择
本设计的测温系统采用芯片DS18B20, DS18B20是DALLAS公司的最新单线数字温度传感器,它的体积更小、适用电压更宽、更经济,DS18B20是世界上第一片支持“一线总线”接口的温度传感器,具有一线总线独特而且经济的特点。采用智能温度传感器DS18B20作为检测元件,测温范围为-55℃~+125℃,最大分辨率可达0.0625℃。DS18B20可以直接读出被测量的温度值,而且采用3线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。
1.32实现方法简介
DS18B20采用外接电源方式工作,一线测温的一线与STC89C52[8][9]的P3.7连并加上上拉电阻使其工作,测出的数据存放在寄存器10H–12H中,将数据经过BCD码转换后送LED显示。具体实现步骤见软件设计章节。
1.控制部分
单片机STC89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用,系统应用三节电池供电。
2. 显示部分
显示电路采用6位共阴7段LED数码管,采用74HC595移位寄存器进行驱动,其中一个数码管显示通道数,另外5个数码管显示该通道的温度值,实现实时
测量。
3. 温度采集部分
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温。这一部分主要完成对温度信号的采集和转换工作,本文转载自http://www.biyezuopin.vip/onews.asp?id=13780由DS18B20数字温度传感器及其与单片机的接口部分组成。数字温度传感器DS18B20把采集到的温度通过数据引脚传到单片机的P1.0口,单片机接受温度并存储。此部分只用到DS18B20和单片机,硬件很简单方案设计 。

#include <REG51.H>
#include <intrins.h>
//#include "LCD1602.h"
//#include "DS1302.h"
#define uint unsigned int
#define uchar unsigned char
sbit  DS1302_CLK = P2^2;              //实时时钟时钟线引脚 
sbit  DS1302_IO  = P2^1;              //实时时钟数据线引脚 
sbit  DS1302_RST = P2^0;              //实时时钟复位线引脚
sbit  wireless_1 = P3^0;
sbit  wireless_2 = P3^1;
sbit  wireless_3 = P3^2;
sbit  wireless_4 = P3^3;
sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;
char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;  //秒,分,时到日,月,年位闪的计数
sbit Set = P3^4;       //模式切换键
sbit Up = P3^5;        //加法按钮
sbit Down = P3^6;      //减法按钮
sbit out = P3^7;       //立刻跳出调整模式按钮
sbit DQ = P1^0;        //温度传送数据IO口
char done,count,temp,flag,up_flag,down_flag;
uchar temp_value;      //温度值
uchar TempBuffer[5],week_value[2];void show_time();   //液晶显示程序
/***********1602液晶显示部分子程序****************///Port Definitions**********************************************************
sbit LcdRs		= P2^5;
sbit LcdRw		= P2^6;
sbit LcdEn  	= P2^7;
sfr  DBPort 	= 0x80;		//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口//内部等待函数**************************************************************************
unsigned char LCD_Wait(void)
{LcdRs=0;LcdRw=1;	_nop_();LcdEn=1;	_nop_();LcdEn=0;return DBPort;		
}
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND			0      // Command
#define LCD_DATA			1      // Data
#define LCD_CLEAR_SCREEN	0x01      // 清屏
#define LCD_HOMING  		0x02      // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{LcdEn=0;LcdRs=style;LcdRw=0;		_nop_();DBPort=input;	_nop_();//注意顺序LcdEn=1;		_nop_();//注意顺序LcdEn=0;		_nop_();LCD_Wait();	
}//设置显示模式************************************************************
#define LCD_SHOW			0x04    //显示开
#define LCD_HIDE			0x00    //显示关	  #define LCD_CURSOR			0x02 	//显示光标
#define LCD_NO_CURSOR		0x00    //无光标		     #define LCD_FLASH			0x01    //光标闪动
#define LCD_NO_FLASH		0x00    //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)
{LCD_Write(LCD_COMMAND, 0x08|DisplayMode);	
}//设置输入模式************************************************************
#define LCD_AC_UP			0x02
#define LCD_AC_DOWN			0x00      // default#define LCD_MOVE			0x01      // 画面可平移
#define LCD_NO_MOVE			0x00      //defaultvoid LCD_SetInput(unsigned char InputMode)
{LCD_Write(LCD_COMMAND, 0x04|InputMode);
}//初始化LCD************************************************************
void LCD_Initial()
{LcdEn=0;LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,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递增, 画面不动
}//液晶字符输入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}//将字符输出到液晶显示
void Print(unsigned char *str)
{while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}
}/***********DS1302时钟部分子程序******************/
typedef struct __SYSTEMTIME__
{unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char  Year;unsigned char DateString[11];unsigned char TimeString[9];
}SYSTEMTIME;	//定义的时间类型
SYSTEMTIME CurrentTime;#define AM(X)	X
#define PM(X)	(X+12)            	  // 转成24小时制
#define DS1302_SECOND	0x80          //时钟芯片的寄存器位置,存放时间
#define DS1302_MINUTE	0x82
#define DS1302_HOUR		0x84 
#define DS1302_WEEK		0x8A
#define DS1302_DAY		0x86
#define DS1302_MONTH	0x88
#define DS1302_YEAR		0x8C void DS1302InputByte(unsigned char d) 	//实时时钟写入一字节(内部函数)
{ unsigned char i;ACC = d;for(i=8; i>0; i--){DS1302_IO = ACC0;           	//相当于汇编中的 RRCDS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC >> 1; } 
}unsigned char DS1302OutputByte(void) 	//实时时钟读取一字节(内部函数)
{ unsigned char i;for(i=8; i>0; i--){ACC = ACC >>1;         			//相当于汇编中的 RRC ACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0;} return(ACC); 
}void Write1302(unsigned char ucAddr, unsigned char ucDa)	//ucAddr: DS1302地址, ucData: 要写的数据
{DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr);       	// 地址,命令 DS1302InputByte(ucDa);       	// 写1Byte数据DS1302_CLK = 1;DS1302_RST = 0;
} unsigned char Read1302(unsigned char ucAddr)	//读取DS1302某地址的数据
{unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01);        // 地址,命令 ucData = DS1302OutputByte();         // 读1Byte数据DS1302_CLK = 1;DS1302_RST = 0;return(ucData);
}void DS1302_GetTime(SYSTEMTIME *Time)  //获取时钟芯片的时钟数据到自定义的结构型数组
{unsigned char ReadValue;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);	
}void DateToStr(SYSTEMTIME *Time)    //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
{   if(hide_year<2)                 //这里的if,else语句都是判断位闪烁,<2显示数据,>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';  //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示}else{week_value[0] = ' ';}week_value[1] = '\0';Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
}void TimeToStr(SYSTEMTIME *Time)  //将时,分,秒数据转换成液晶显示字符放到数组 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';
}void Initial_DS1302(void)   //时钟芯片初始化
{   Write1302(0x8e,0x00); //写入允许Write1302(0x8c,0x18); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55Write1302(0x88,0x05);Write1302(0x86,0x13);Write1302(0x8a,0x07);Write1302(0x84,0x10);Write1302(0x82,0x20);Write1302(0x80,0x55);Write1302(0x8e,0x80); //禁止写入}/***********ds18b20子程序*************************//***********ds18b20延迟子函数(晶振12MHz )*******/ void delay_18B20(unsigned int i)
{while(i--);
}/**********ds18b20初始化函数**********************/void Init_DS18B20(void) 
{unsigned char x=0;DQ = 1;          //DQ复位delay_18B20(8);  //稍做延时DQ = 0;          //单片机将DQ拉低delay_18B20(80); //精确延时 大于 480usDQ = 1;          //拉高总线delay_18B20(14);x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败delay_18B20(20);
}/***********ds18b20读一个字节**************/  unsigned char ReadOneChar(void)
{uchar i=0;uchar dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);
}/*************ds18b20写一个字节****************/  void WriteOneChar(uchar dat)
{unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay_18B20(5);DQ = 1;dat>>=1;}
}/**************读取ds18b20当前温度************/void ReadTemp(void)
{unsigned char a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0xCC);    	// 跳过读序号列号的操作WriteOneChar(0x44); 	// 启动温度转换delay_18B20(100);       // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); 	//跳过读序号列号的操作WriteOneChar(0xBE); 	//读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(100);a=ReadOneChar();    	//读取温度值低位b=ReadOneChar();   		//读取温度值高位temp_value=b<<4;temp_value+=(a&0xf0)>>4;               
}
void temp_to_str()   //温度数据转换成液晶字符显示
{TempBuffer[0]=temp_value/10+'0';  //十位TempBuffer[1]=temp_value%10+'0';  //个位TempBuffer[2]=0xdf;   //温度符号TempBuffer[3]='C';TempBuffer[4]='\0';
}
void Delay1ms(unsigned int count)
{unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);
}/*延时子程序*/
void mdelay(uint delay)
{	uint i;for(;delay>0;delay--){for(i=0;i<62;i++) //1ms延时.{;}}
}void outkey()                    //跳出调整模式,返回默认显示
{ uchar Second;if(out==0||wireless_1==1)         { mdelay(8); count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80);          //禁止写入done=0;           while(out==0);while(wireless_1==1);}
}

void Upkey()//升序按键
{	   Up=1;if(Up==0||wireless_2==1){mdelay(8);switch(count){case 1:temp=Read1302(DS1302_SECOND);  //读取秒数temp=temp+1;  //秒数加1up_flag=1;    //数据调整后更新标志if((temp&0x7f)>0x59)   //超过59秒,清零temp=0;								  break;case 2:temp=Read1302(DS1302_MINUTE);  //读取分数temp=temp+1;  //分数加1up_flag=1;if(temp>0x59)          //超过59分,清零temp=0;break;case 3:temp=Read1302(DS1302_HOUR);  //读取小时数temp=temp+1;  //小时数加1up_flag=1;if(temp>0x23)   //超过23小时,清零temp=0;break;case 4:temp=Read1302(DS1302_WEEK);  //读取星期数temp=temp+1;  //星期数加1up_flag=1;if(temp>0x7)  temp=1;break;case 5:temp=Read1302(DS1302_DAY);  //读取日数temp=temp+1;  //日数加1up_flag=1;if(temp>0x31)temp=1;break;case 6:temp=Read1302(DS1302_MONTH);  //读取月数temp=temp+1;  //月数加1up_flag=1;if(temp>0x12)temp=1;break;case 7:temp=Read1302(DS1302_YEAR);  //读取年数temp=temp+1;  //年数加1up_flag=1;if(temp>0x85)temp=0;break;default:break;}while(Up==0);while(wireless_2==1);}
}
void Downkey()//降序按键
{	    Down=1;if(Down==0||wireless_3==1){mdelay(8);switch(count){case 1:temp=Read1302(DS1302_SECOND);  //读取秒数temp=temp-1;						    //秒数减1down_flag=1;       //数据调整后更新标志if(temp==0x7f)     //小于0秒,返回59秒temp=0x59;break;case 2:temp=Read1302(DS1302_MINUTE);  //读取分数temp=temp-1;  //分数减1down_flag=1;if(temp==-1)temp=0x59;      //小于0秒,返回59秒break;case 3:temp=Read1302(DS1302_HOUR);  //读取小时数temp=temp-1;  //小时数减1down_flag=1;if(temp==-1)temp=0x23;break;case 4:temp=Read1302(DS1302_WEEK);  //读取星期数temp=temp-1;  //星期数减1down_flag=1;if(temp==0)temp=0x7;;break;case 5:temp=Read1302(DS1302_DAY);  //读取日数temp=temp-1;  //日数减1down_flag=1;if(temp==0)temp=31;break;case 6:temp=Read1302(DS1302_MONTH);  //读取月数temp=temp-1;  //月数减1down_flag=1;if(temp==0)temp=12;break;case 7:temp=Read1302(DS1302_YEAR);  //读取年数temp=temp-1;  //年数减1down_flag=1;if(temp==-1)temp=0x85;break;default:break;}while(Down==0);while(wireless_3==1);}
}void Setkey()//模式选择按键
{Set=1;if(Set==0||wireless_4==1){mdelay(8);count=count+1;	 //Setkey按一次,count就加1done=1;			 //进入调整模式while(Set==0);while(wireless_4==1);}}void keydone()//按键功能执行
{        uchar Second;if(flag==0)    //关闭时钟,停止计时{ Write1302(0x8e,0x00); //写入允许temp=Read1302(0x80);Write1302(0x80,temp|0x80);Write1302(0x8e,0x80); //禁止写入flag=1;}Setkey();				            //扫描模式切换按键switch(count){case 1:do					        //count=1,调整秒{outkey();			   //扫描跳出按钮Upkey();                //扫描加按钮Downkey();              //扫描减按钮if(up_flag==1||down_flag==1)  //数据更新,重新写入新的数据{Write1302(0x8e,0x00); //写入允许Write1302(0x80,temp|0x80); //写入新的秒数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_sec++;          //位闪计数if(hide_sec>3)hide_sec=0;show_time();         //液晶显示数据}while(count==2);break;  case 2:do					        //count=2,调整分{hide_sec=0;outkey();Upkey();Downkey();if(temp>0x60)temp=0;if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x82,temp); //写入新的分数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_min++;if(hide_min>3)hide_min=0;show_time();}while(count==3);break;case 3:do					        //count=3,调整小时{hide_min=0; outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x84,temp); //写入新的小时数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_hour++;if(hide_hour>3)hide_hour=0;show_time();}while(count==4);break;case 4:do					        //count=4,调整星期{hide_hour=0; outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x8a,temp); //写入新的星期数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_week++;if(hide_week>3)hide_week=0;show_time();}while(count==5);break;case 5:do					        //count=5,调整日{hide_week=0; outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x86,temp); //写入新的日数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_day++;if(hide_day>3)hide_day=0;show_time();}while(count==6);break;case 6:do					        //count=6,调整月{hide_day=0; outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x88,temp); //写入新的月数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_month++;if(hide_month>3)hide_month=0;show_time();}while(count==7);break;case 7:do					        //count=7,调整年{hide_month=0; outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x8c,temp); //写入新的年数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_year++;if(hide_year>3)hide_year=0;show_time();}while(count==8);break;case 8: count=0;hide_year=0;  //count8, 跳出调整模式,返回默认显示状态Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80);          //禁止写入done=0;break; //count=7,开启中断,标志位置0并退出default:break;}}void show_time()   //液晶显示程序
{DS1302_GetTime(&CurrentTime);  //获取时钟芯片的时间数据TimeToStr(&CurrentTime);       //时间数据转换液晶字符DateToStr(&CurrentTime);       //日期数据转换液晶字符ReadTemp();                    //开启温度采集程序temp_to_str();                 //温度数据转换成液晶字符GotoXY(12,1);                  //液晶字符显示位置Print(TempBuffer);             //显示温度GotoXY(0,1);Print(CurrentTime.TimeString); //显示时间GotoXY(0,0);Print(CurrentTime.DateString); //显示日期GotoXY(15,0);Print(week_value);             //显示星期GotoXY(11,0);Print("Week");	//在液晶上显示 字母 weekDelay1ms(400);                 //扫描延时
}main()
{flag=1;           //时钟停止标志LCD_Initial();    //液晶初始化Init_DS18B20( ) ;      //DS18B20初始化Initial_DS1302(); //时钟芯片初始化up_flag=0;down_flag=0;done=0;           //进入默认液晶显示wireless_1=0;wireless_2=0;wireless_3=0;wireless_4=0;while(1){   while(done==1)keydone();    //进入调整模式while(done==0){  show_time();                //液晶显示数据flag=0;                  Setkey();				 //扫描各功能键}}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_23432.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础(二):集合、IO流(Zip压缩输入/输出流等)、File文件类、反射、枚举

Java基础&#xff08;一&#xff09;:编译和解释、数据类型、变量作用域、String常用方法、数组、面向对象、异常 Java基础&#xff08;二&#xff09;:集合、IO流(Zip压缩输入/输出流等)、File文件类、反射、枚举 Java异常、继承结构、处理异常、自定义异常、SpringBoot中全…

数据库学习记录2

数据库学习记录1介绍了DDL (Data Definition Language) 数据定义语言。 在数据库学习记录2中&#xff0c;我们介绍常见的数据类型&#xff1b; 主要分为三类&#xff1a;数值类型、字符串类型、日期时间类型。 数值类型 类型大小有符号范围无符号范围描述TINYINT1byte(-128&…

生成模型笔记(七):自回归模型

有鸟止南方之阜&#xff0c;三年不翅&#xff0c;不飞不鸣&#xff0c;嘿然无声&#xff0c;此为何名&#xff1f; 第七部分 深度自回归模型&#xff08;Deep Autoregressive Model&#xff0c; DARM&#xff09; 参考内容 https://jmtomczak.github.io/blog/2/2_ARM.html A…

第二十三:Fiddler抓包教程(23)-Fiddler如何优雅地在正式和测试环境之间来回切换-上篇

一.简介 1.在开发或者测试的过程中&#xff0c;由于项目环境比较多&#xff0c;往往需要来来回回地反复切换&#xff0c;那么如何优雅地切换呢&#xff1f; 二.实际工作场景 1.问题场景 1.1.已发布线上APP出现接口错误&#xff0c;如何测试线上APP访问本地请求&#xff1f;…

QFramework v1.0 使用指南 介绍篇:01. 简介

01. 简介 大家好&#xff0c;我是 QFramework 的作者 凉鞋&#xff0c;QFramework 从第一次代码提交到现在快 7 年了&#xff08;2015 年 12 月 ~ 2022 年 10 月&#xff09;了&#xff0c;而经过了 7 年时间的打磨&#xff0c;我们终于迎来了 v1.0 版本。 此教程&#xff0c…

Macos/linux g++ 安装OpenCV环境

本文前半部分主要翻译官方文档的东西 https://docs.opencv.org/4.x/d0/db2/tutorial_macos_install.html 依赖&#xff1a; CMake 3.9 or higher Git Python 2.7 or later and Numpy 1.5 or later大家都是程序员自己安装一下吧 在 relese 这里下载一下源代码&#xff1a; htt…

第三章:为组件库添加规范【前端工程化入门-----从零实现一个react+ts+vite+tailwindcss组件库】

第三章&#xff1a;为组件库添加规范 本章我们会用 eslint、prettier以及Husky 为组件库添加规范&#xff1b; 前置知识&#xff1a; eslint、prettier和husky各有什么作用&#xff1f; eslint是代码检查工具&#xff0c;你可以配置eslint&#xff0c;然后通过lint命令检测…

打游戏哪款蓝牙耳机好?四款适合打游戏的蓝牙耳机推荐

现在年轻人最离不开的就是手游&#xff0c;蓝牙耳机可谓是手机游戏的最佳搭档&#xff0c;一副好的蓝牙耳机可以为游戏带来很完美的助力&#xff0c;延迟低的蓝牙耳机可以实现更好的游戏体验感&#xff0c;那么接下来推荐四款适合打游戏的蓝牙耳机。 1、南卡小音舱蓝牙耳机 佩…

2022年全国大学生数学建模美赛E题NPP数据获取

今年的数学建模美赛终于开始了&#xff01;令我感到欣喜的是&#xff0c;今年E题竟然和地理遥感专业息息相关。E题是分析生态环境方面的&#xff01;因此&#xff0c;有很多小伙伴来询问咨询如何解决这道题目。有些小伙伴&#xff0c;还咨询如何使用CASA软件来计算NPP数据&…

Flink SQL使用Catalog消费Kafka时,多个Source读取同一主题解决方案

一、Catalog定义 Catalog 提供了元数据信息&#xff0c;例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。数据处理最关键的方面之一是管理元数据。 元数据可以是临时的&#xff0c;例如临时表、或者通过 TableEnvironment 注册的 UDF。 元数据也可以是…

apollo在虚拟机下部署遇到的坑

目录问题描述解决方法编译问题总结问题描述 ​   其实在虚拟机下部署apollo网上是有线程教程的。可以参考在虚拟机上安装运行百度Apollo 6.0&#xff0c;Apollo 6.0 安装完全指南。我依靠这两个指南准备部署的是apollo 7.0&#xff0c;事实证明虽然版本不同&#xff0c;但部…

1、6边距复合属性

提示&#xff1a;文章写完后&#xff0c;padding可以有到四个值。 1、语法&#xff1a; div{ padding&#xff1a;“50px”&#xff1b; padding&#xff1a;“5px 10px”&#xff1b; padding&#xff1a;“5px 10px 20px”&#xff1b; padding&#xff1a;“5…

flex竖排列元素排列方向

flex竖排列元素排列方向一、flex-direction: (元素排列方向) ※ flex-direction:row (横向从左到右排列==左对齐)※ flex-direction:row-reverse (与row 相反)※ flex-direction:column (从上往下排列==顶对齐)※ flex-direction:column-reverse (与column 相反) 二…

基于导频的信道估计实现

目录 零、前言 一、为什么要信道估计 二、导频的概念 &#xff08;1&#xff09;为什么要有导频 &#xff08;2&#xff09;导频在信道估计中作用 &#xff08;3&#xff09;关于导频序列的补充 三、最小二乘法估计 &#xff08;1&#xff09;LS信道估计算法分析 &…

24.登录form的显示

1.概括 本次博客的代码就不自己去写输入框了&#xff0c;直接去引用element官网中的就好。 具体如何实现可以去订阅Vue专栏中的最后两节课噢&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;2.操作方法 打开element官网 https://element.eleme.cn/…

TRC丨艾美捷TRC 那非那韦亚砜说明书

艾美捷TRC Nelfinavir Sulfoxide 是 Nelfinavir Mesylate (N389750) 的杂质。Nelfinavir USP 相关化合物 A。 艾美捷TRC 那非那韦亚砜化学性质&#xff1a; 目录号N389770 化学名称那非那韦亚砜 同义词(3S,4aS,8aS)-N-(1,1-二甲基乙基)十氢-2-[(2R,3R)-2-羟基-3-[(3-羟基-2-…

合宙AIR32F103CBT6刷回CMSIS-DAP固件以及刷ST-LINK V2-1固件方法

合宙AIR32F103CBT6刷回CMSIS DAP固件以及刷ST-LINK V2-1固件方法&#x1f4cc;官方介绍文档:https://wiki.luatos.com/chips/air32f103/index.html&#x1f4cd;原理图&#xff1a;https://cdn.openluat-luatcommunity.openluat.com/attachment/20220605164915340_AIR32CBT6.pd…

从零备战蓝桥杯——动态规划(递推篇)

双非刷leetcode备战2023年蓝桥杯&#xff0c;qwq加油吧&#xff0c;无论结果如何总会有收获&#xff01;一起加油,我是跟着英雄哥的那个思维导图刷leetcode的&#xff0c;大家也可以看看所有涉及到的题目用leetcode搜索就可以哦&#xff0c;因为避让添加外链&#xff0c;一起加…

简历石沉大海?来围观月薪 20k 的软件测试工程师真实简历...

​前言&#xff1a;面试的重要性 在互联网公司&#xff0c;你面试的时候能拿到多少 k 薪资&#xff0c;基本上决定了你未来 1-2 年的工资&#xff0c;这个非常现实。软件测试工程师在企业中俩内年想涨工资非常难的&#xff0c;就算有涨&#xff0c;涨幅也不大。当然不排除你待…

前置句与倒装句练习题

1. 特殊语序&#xff1a;前置 1.All the information you need I am putting in the post today. 2.Any item in our catelogue we can supply and deliver 3.How she got the gun through customs they never found out. 4.The kitchen we are planning to redecorate in the…