目录
摘要 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();                 //扫描各功能键}}
}









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

  1. 基于STM32的多点温湿度无线传输检测及控制(基于单片机的蔬菜大棚温湿度智能控制系统)

    基于STM32的多点温湿度无线传输检测及控制(基于单片机的蔬菜大棚温湿度智能控制系统) 一前言(含研究目的及意义) 1.研究目的 2.研究意义 二.研究工作的主要内容 三.理论创新成果 四.实践创新成 ...

  2. 基于51单片机的智能大棚光温控制系统

    目录 文章目录 前言 一.器件 51单片机 1602lcd显示屏 ds18b20温度传感器 继电器 hs0038红外模块 二.部分代码展示 1.头文件 2.main.c 3.obj.c 总结 前言 这 ...

  3. 89c51控制小车运行c语言,基于STC89C52单片机和STM32的智能小车控制系统

    摘要:针对智能车的控制系统, 选用STC89C52作为整个系统的主控芯片, 并进行硬件电路设计;以NREF24L01作为无线接收模块, 选取E18-D80NK-N红外光电传感器作为避障模块的核心器件; ...

  4. 基于STC89C52单片机的智能车控制系统设计

    目 录 1系统概述 1 1.1设计目的和意义 1 1.2设计思路 2 1.3系统需求分析 2 1.3.1市场需求 2 1.3.2实现功能 2 1.4开发环境 3 1.5运行环境 3 2总体设计 4 2 ...

  5. C语言智能窗帘编码,基于STC89C52单片机智能窗帘控制系统.doc

    基于STC89C52单片机智能窗帘控制系统 基于STC89C52单片机智能窗帘控制系统 [摘要] 本设计以STC89C52单片机为主控芯片,接收并处理BH1750FVI光照传感器的光强信号.DS18B ...

  6. stc89c51单片机音乐盒系统设计_基于STC89C52单片机的七彩迷你音乐盒

    基于STC89C52单片机的七彩迷你音乐盒.在单片机最小系统的基础上,对其他两个I/O口连接硬件电路.P1.0接一个七彩快闪LED灯.P1.5口接一个NPN型三极管的放大电路,再连接一个无源蜂鸣器(用 ...

  7. 基于STC89C52单片机的霓虹灯

    基于STC89C52单片机的霓虹灯 1.设计要求 使用PWM驱动8个LED灯         人眼不能观察到灯光全灭         灯光要有动画效果 2.设计概述         本实验所用芯片为S ...

  8. 温度警报c语言,基于STC89C52单片机温度报警器.doc

    基于STC89C52单片机温度报警器 摘 要 温度的检测与控制是工业生产过程中比较典型的应用之一,随着传感器在生产和生活中的更加广泛的应用,利用新型单总线式数字温度传感器实现对温度的测试与控制得到更快 ...

  9. Stc单片机写一个简易计算机,基于STC89C52单片机的简易计算器.doc

    PAGE 基于STC89C52单片机的简易计算器 目录 TOC \o "1-2" \h \z \u 内容摘要 2 关键词 2 Abstract 2 1绪论 2 2系统设计 4 2. ...

最新文章

  1. iOS正则表达式验证
  2. 关于Ubuntu20.04 sudo vi找不到命令解决方法
  3. Spring Boot-@PropertySource注解
  4. 在新建android工程的时候出现This template depends on the Android Support library!
  5. Windows安装ActiveMQ记录
  6. 浪曦视频在线的ASP.NET AJAX视频教程下载(转载)
  7. CSS半透明边框效果
  8. SVN分支合并冲突解决
  9. 萤石云摄像头方向操控前端代码
  10. 计算机桌面文档全丢,电脑重启后桌面文件全部丢失怎么办
  11. 愿你永远像个boy,找到自己的光亮
  12. 企业微信的渠道活码怎么用?到底有什么好处?
  13. 桂 林 理 工 大 学实 验 报 告实验四 选择结构程序设计
  14. transform:translate
  15. 子豪兄-YOLOv3
  16. QT驾校科目考试系统——从实现到发布
  17. hrbust 2155 钱多多【水题】
  18. 嵌入式开发——brctl命令实现桥接上网
  19. Games101----Transformation(2)
  20. 基于FPGA+SDRAM+BT656视频解码移植总结

热门文章

  1. html 文字右侧属性,HTML标签及属性大全
  2. 1.如何实现MT4帐号同步交易?
  3. gc方法写法_云风的 BLOG
  4. SAP S4 HANA 安装部署记事七.SAP S4 ON HANA 的部署准备
  5. 爱他美英国和德国价格查询_德国,以色列和英国转向开源,新的无人驾驶汽车技术以及更多新闻...
  6. 【云原生之Docker实战】使用Docker部署Flarum开源论坛
  7. vue表单验证插件 vuerify
  8. tomcat 在线一键安装
  9. 苏州大学信息与通信工程837考研上岸经验分享
  10. openscad螺栓数据生成