【单片机课程设计报告基于单片机的温控系统】 单片机课程设计报告模板
职业学院 机械与电子工程学院 基于单片机温控系统课程设计报告 班 级 电信班 学生姓名 学 号 指导教师 时 间 2011 目录 摘 要 I 1系统方案设计及组成 I 2系统设计 1 2.1温度传感器的工作原理与单片机的连接 1 2.2 DS1302原理及管脚 2 2.3单片机与报警电路 3 2.4显示电路 3 2.41基本操作时序 4 3系统软件设计 4 摘 要 本课题主要介绍基于AT89C51单片机和DS18B20数字温度传感器的温度测量系统。该系统利用AT89C51单片机分别采集各个温度点的温度,实现温度显示、报警等功能以及用DS1302时钟芯片在液晶显示当前时间日期。直观,实用。它以AT89C51单片机为主控制芯片,采用数字温度传感器DS18B20实现温度的检测,测量精度可以达到0.5℃。该系统采用了1602显示模块,形象直观的显示测出的温度值。基于AT89C51单片机的单总线温度测控系统具有硬件组成简单、读数方便、精度高、测温范围广等特点,在实际工程中得到广泛应用。
关键词:温度传感器;
单片机;
温度控制;
DS1302; LCD 1系统方案设计及组成 该方案使用了AT89C51单片机作为控制核心,以智能温度传感器DS18B20为温度测量元件,对各点温度进行检测,设置温度上下限,超过其温度值就报警。以及用DS1302时钟芯片在液晶显示当前时间日期。显示电路采用1602液晶模块显示,使用三极管,电阻和蜂鸣器组成的报警电路,按钮处理模块等。具有温度控制,实时时钟,报警等功能。
89C52CPU 控制模块 按键处理模块 温度采集模块 报警电路 LCD显示模块 DS1302时钟 采集模块 图2-1温度控制系统方案框 2系统设计 2.1温度传感器的工作原理与单片机的连接 温度传感器的单总线(1-Wire)与单片机的P2.7连接,P2.7是单片机的高位地址线。P2端口是一个带内部上拉电阻的8位双向I/O,其输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对该端口写“1”,可通过内部上拉电阻将其端口拉至高电平,此时可作为输入口使用,这是因为内部存在上拉电阻,某一引脚被外部信号拉低时会输出一个电流。
如1所示:DS18B20与单片机的接口电路非常简单。DS18B20只有三个引脚,一个接地,一个接电源,一个数字输入输出引脚接单片机I/O口,电源与数字输入输出脚间需要接一个4.7K的电阻。
图1温度传感器与单片机的连接图 DS18B20的工作原理 DS18B20的工作过程 a.初始化:
DS18B20所有的数据交换都由一个初始化序列开始。由主机发出的复位脉冲和跟在其后的由DS18B20发出的应答脉冲构成。当DS18B20发出响应主机的应答脉冲时,即向主机表明它已处在总线上并且准备工作。
b. ROM命令:
ROM命令通过每个器件64-bit的ROM码,使主机指定某一特定器件(如果有多个器件挂在总线上)与之进行通信。DS18B20的ROM如表3-6所示,每个ROM命令都是8 bit长。
c. 功能命令:
主机通过功能命令对DS18B20进行读/写Scratchpad存储器,或者启动温度转换。
DS18B20的信号方式 DS18B20采用严格的单总线通信协议,以保证数据的完整性。该协议定义了几种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。除了应答脉冲所有这些信号都由主机发出同步信号。总线上传输的所有数据和命令都是以字节的低位在前。
a.初始化序列:复位脉冲和应答脉冲 b.读和写时序 在写时序期间,主机向DS18B20写入指令;
而在读时序期间,主机读入来自DS18B20的指令。在每一个时序,总线只能传输一位数据。读/写时序如图3-4所示。
写时序 存在两种写时序:“写1”和“写0”。主机在写1时序向DS18B20写入逻辑1,而在写0时序向DS18B20写入逻辑0。所有写时序至少需要60µs,且在两次写时序之间至少需要1µs的恢复时间。两种写时序均以主机拉低总线开始。
读时序 DS18B20只能在主机发出读时序时才能向主机传送数据。所以主机在发出读数据命令后,必须马上产生读时序,以便DS18B20能够传送数据。所有读时序至少60µs,且在两次独立的读时序之间至少需要1µs的恢复时间。
2.2 DS1302原理及管脚 1、DS1302引脚排列:如下图 2、 DS1302的控制字节 DS1302 的控制字如下图所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 3、数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
2.3单片机与报警电路 系统中的报警电路是由三极管,蜂鸣器,发光二极管和限流电阻组成,并与单片机的P2.3端口连接。当温度超过预设的最高温度或最低温度时,蜂鸣器发出响声。
报警电路 2.4显示电路 采用技术成熟,价格便宜的1602液晶显示器做为输出显示。本次设计使用的1602液晶显示器为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置128个字符的ASCII字符集字库,只有并行接口,无串行接口。
2.41基本操作时序 读状态 输入:RS=L, R/W=H,E=H 输出:D0~D7=状态字。
读数据 输入:RS=H, R/W=H,E=H 输出:无。
写指令 输入:RS=L, R/W=L,D0~D7=指令码,E=高脉冲 输出:D0~D7=数据。
写数据 输入:RS=H, R/W=L, ,D0~D7=数据,E=高脉冲 输出:无 2.5 按键处理模块 按键处理可以调整当前准确时间,日期,可以调整所需要监控温度的上下限,达到温度的上下限是,蜂鸣器报警,如图所示就是按键的分布图 还有在硬件上安装了两个继电器,当温度报警时,触发继电器控制外围电路 3系统软件设计 本次软件是采用模块化编程,就是把程序中的函数,定义等代码进行分类,实际上是两个文件.C与.h,它们的文件名通常是相同的,.h文件用于声明与定义;
.C文件用于函数的实现。采用模块化编程的好处是:
1、 整个工程脉络清晰,代码规划合理。
2、 程序模块化,有利于代码的积累,重复使用,快速建立工程 3、 可以将程序模块编译未LIB库文件,有利于源代码的保密。
3.1主程序及流程图 _MAIN_H_ #ifndef _MAIN_H_ #define _MAIN_H_ #include “reg52.h“ #include “INTRINS.H“ #include “STRING.H“ #include “Delay.h“ #include “Lcd.h“ #include “DS1302.h“ #include “DS18B20.h“ #include “Key.h“ #include “DispMeau.h“ #define uchar unsigned char #define uint unsigned int extern char DispFlag; extern uint LTemper; extern uint HTemper; extern uchar Temper[10]; extern uchar Time[10]; extern uchar Date[10]; #endif _MAIN_C_ #include “Main.h“ char DispFlag; //允许显示标志 0:不允许 ,1:允许 uchar Temper[10]=““; //保存温度数据 uchar Time[10]=“ : : “; //保存时分秒数据 uchar Date[10]=“ / / “; //保存年月日数据 uint LTemper=2000; uint HTemper=5000; //uchar TimeStatus=0; sbit bell=P2^3; sbit led1=P2^4; sbit led2=P2^5; sbit led3=P2^6; void WarnDisp(uint tpTmp) { if(tpTmp<=LTemper) { led1=1; led2=0; led3=0; bell=0; } else if(tpTmp>=HTemper) { led1=0; led2=0; led3=1; bell=0; } else { led1=0; led2=1; led3=0; bell=1; } } void main() { uint Tmp=0; Init1302(); //初始化 DS1302 Int_lcd(); //初始化 lcd ET0=1; // 时间中断0 允许中断 EA=1; // 中断 允许 TMOD=0x01; // 使用 时间0 记数 TH0=(65536-15536)/256; // TL0=(65536-15536)%256; // TR0=1; // 允许记数0记数 DispFlag=0; //不允许显示 led1=0; led2=0; led3=0; bell=1; Tmp=readtmp(); //取温度 delay(40000); Tmp=readtmp(); //取温度 delay(40000); //TimeStatus = 0; while(1) { if(DispFlag==0) { //if(TimeStatus==0) //不在时间调整状态 { DealTime(Time , Date); //获取需要显示的时间数据 } DealKey(); //按键处理 Tmp=readtmp(); //取温度 WarnDisp(Tmp); //警报指示 DealTemper(Tmp, Temper); //将温度值转化成显示数据 DispFlag=1; //允许显示 } } } void t(void) interrupt 1 using 0 { TH0=(65536-15530)/256; TL0=(65536-15530)%256; if(DispFlag==1) { ScrDisp(0x80,Date); //显示 日期(位置,数据) ScrDisp(0xc0,Time); //显示 时间 ScrDisp(0x89,Temper); //显示 温度 DispFlag=0; } } 3.2 各子程序及流程图 一、DS1302 _DS1302_H_ #ifndef _DS1302_H_ #define _DS1302_H_ #include “Main.h“ void v_WTInputByte(unsigned char ucDa); unsigned char uc_RTOutputByte(void); void v_W1302(unsigned char ucAddr, unsigned char ucDa); unsigned char uc_R1302(unsigned char ucAddr); void Init1302(void); void DealTime(unsigned char *tpTime , unsigned char *tpDate); void SaveDate(unsigned char *tpDate); void SaveTime(unsigned char *tpTime); #endif _DS1302_C_ #include “Main.h“ sbit T_RST = P2^0; /*实时时钟复位线引脚 */ sbit T_IO = P2^1; /*实时时钟数据线引脚 */ sbit T_CLK = P2^2; /*实时时钟时钟线引脚 */ sbit ACC0=ACC^0; sbit ACC7=ACC^7; /******************************************************************** * * 名称: v_RTInputByte * 说明: * 功能: 往DS1302写入1Byte数据 * 调用: * 输入: ucDa 写入的数据 * 返回值: 无 ***********************************************/ void v_WTInputByte(uchar ucDa) { uchar i; ACC= ucDa; for(i=8; i>0; i--) { T_IO = ACC0; //*相当于汇编中的 RRC T_CLK = 1; T_CLK = 0; ACC =ACC>> 1; } } /*********************************************** * * 名称: uchar uc_RTOutputByte * 说明: * 功能: 从DS1302读取1Byte数据 * 调用: * 输入: * 返回值: ACC ***********************************************/ uchar uc_RTOutputByte(void) { uchar i; for(i=8; i>0; i--) { ACC = ACC>>1; //*相当于汇编中的 RRC ACC7 = T_IO; T_CLK = 1; T_CLK = 0; } return(ACC); } /*********************************************** * * 名称: v_W1302 * 说明: 先写地址,后写命令/数据 * 功能: 往DS1302写入数据 * 调用: v_RTInputByte() * 输入: ucAddr: DS1302地址, ucDa: 要写的数据 * 返回值: 无 ***********************************************/ void v_W1302(uchar ucAddr, uchar ucDa) { T_RST = 0; T_CLK = 0; T_RST = 1; v_WTInputByte(ucAddr); /* 地址,命令 */ v_WTInputByte(ucDa); /* 写1Byte数据*/ T_CLK = 1; T_RST =0; } /*********************************************** 名称: uc_R1302 * 说明: 先写地址,后读命令/数据 * 功能: 读取DS1302某地址的数据 * 调用: v_RTInputByte() , uc_RTOutputByte() * 输入: ucAddr: DS1302地址 * 返回值: ucDa :读取的数据 *********************************************/ uchar uc_R1302(uchar ucAddr) { uchar ucDa; T_RST = 0; T_CLK = 0; T_RST = 1; v_WTInputByte(ucAddr); /* 地址,命令 */ ucDa = uc_RTOutputByte(); /* 读1Byte数据 */ T_CLK = 1; T_RST =0; return(ucDa); } /*********************************************** * 名称: Init1302 * 说明: * 功能: 初始化DS1302 * 调用: * 输入: * 返回值: 无 ***********************************************/ void Init1302(void) { v_W1302(0x8e,0x00); //控制写入WP=0 v_W1302(0x90,0xa5); } //+48是为了转换为ACSII 码 void DealTime(uchar *tpTime , uchar *tpDate) { uchar d; //时间处理 tpTime[8] = 0x00; //数组结束符 '\0' tpDate[8] = 0x00; //数组结束符 '\0' d=uc_R1302(0x81); //读取时间 秒 tpTime[6]=(d>>4&0x0f)+48; //处理十秒 tpTime[7]=(d&0x0f)+48; //处理 秒 d=uc_R1302(0x83); //读取时间 秒 tpTime[3]=(d>>4&0x0f)+48; //处理十分 tpTime[4]=(d&0x0f)+48; //处理 分 d=uc_R1302(0x85); //读取 时 tpTime[0]=(d>>4&0x0f)+48; //处理十时 tpTime[1]=(d&0x0f)+48; //处理 时 d=uc_R1302(0x8D); //读取 年 tpDate[0]=(d>>4&0x0f)+48; //处理十年 tpDate[1]=(d&0x0f)+48; //处理 年 d=uc_R1302(0x89); //读取 月 tpDate[3]=(d>>4&0x0f)+48; //处理十月 tpDate[4]=(d&0x0f)+48; //处理 月 d=uc_R1302(0x87); //读取 日 tpDate[6]=(d>>4&0x0f)+48; //处理十日 tpDate[7]=(d&0x0f)+48; //处理 日 } void SaveDate(uchar *tpDate) { uchar y,m,d; y = (((tpDate[0]-48)<<4)&0xf0)+(tpDate[1]-48); m = (((tpDate[3]-48)<<4)&0xf0)+(tpDate[4]-48); d = (((tpDate[6]-48)<<4)&0xf0)+(tpDate[7]-48); v_W1302(0x8e,0x00); //控制写入WP=0 v_W1302(0x90,0xa5); v_W1302(0x86,d); //日 v_W1302(0x88,m); //月 v_W1302(0x8c,y); //年 } void SaveTime(uchar *tpTime) { uchar h,m,s; h = (((tpTime[0]-48)<<4)&0xf0)+(tpTime[1]-48); m = (((tpTime[3]-48)<<4)&0xf0)+(tpTime[4]-48); s = (((tpTime[6]-48)<<4)&0xf0)+(tpTime[7]-48); v_W1302(0x8e,0x00); //控制写入WP=0 v_W1302(0x90,0xa5); v_W1302(0x80,s); //秒 v_W1302(0x82,m); //分 v_W1302(0x84,h); //时 //delay(100); } 二、DS18B20 DS18B20读取温度过程 _DS18B20_H_ #define _DS18B20_H_ void reset(void); unsigned char readbyte(void); void writebyte(unsigned char indata); unsigned int readtmp(void); void DealTemper(unsigned int tpTemper, unsigned char *tpStr); #endif _DS18B20_C #include “Main.h“ sbit DQ=P3^7; /******************复位********************/ void reset(void) { uchar flag=0; DQ=1; delay_10us(1); DQ=0; delay_10us(70); //至少延时22us DQ=1; delay_10us(8); flag=DQ; delay_10us(15); } /****************读一字节*********************/ uchar readbyte(void) { uchar i,outdata=0; for(i=0;i<8;i++) { DQ=1; delay_10us(1); DQ=0; outdata>>=1; //必须在15us内读取 DQ=1; if(DQ) outdata|=0x80; delay_10us(4); } return(outdata); } /*****************写一字节********************/ void writebyte(uchar indata) { uchar i; for(i=0;i<8;i++) { DQ=1; delay_10us(1); DQ=0; DQ=indata&0x01; //必须在15us内写入 delay_10us(5); DQ=1; indata>>=1; } delay_10us(4); } /****************读温度***********************/ uint readtmp(void) { uint tmp; uchar tl,th,temp,temp1; reset(); writebyte(0xcc); // 跳过序列号 writebyte(0x44); // 启动温度转换 reset(); writebyte(0xCC); writebyte(0xBE); //读9个寄存器,前两个为温度 tl=readbyte(); //低位 th=readbyte(); //高位 temp=tl&0x0f; //取低四位 temp=temp*6.25; //小数部分 tl>>=4; th<<=4; temp1=tl|th; //整数部分 tmp=temp1*100+temp; //四位数,高两位为整数,低两位为小数 delay(200); return (tmp); } /******************************************* 功能: 温度数据处理 输入: uint tpTempe : 温度值 高字节为温度整位,低字节为温度小数位 uchar *tpStr : 把整形数据转化为显示数据输出: uchar *tpStr: 把整形数据转化为显示数据,并返回 返回:无 ***********************************************/ void DealTemper(uint tpTemper, uchar *tpStr) { tpStr[7] = 0x00; //数组结束符 '\0' tpStr[6] = 'C'; tpStr[5] = 0xdf; //'度' 符号 tpStr[4]=tpTemper%10+48; //取个位 小数位第二位 tpTemper/=10; tpStr[3]=tpTemper%10+48; //取十位 小数位第一位 tpStr[2]='.'; //小数点 tpTemper/=10; tpStr[1]=tpTemper%10+48; //取百位 个位 tpStr[0]=tpTemper/10+48; //取千位 十位 } 三、LCD1602 _LCD_H_ #ifndef _LCD_H_ #define _LCD_H_ void Int_lcd(void); //初始化 unsigned char lcd_r_start(void); void lcd_w_cmd(unsigned char com); void lcd_w_dat(unsigned char dat); #endif _LCD_C_ #include “Main.h“ sbit RS=P3^4; sbit RW=P3^5; sbit E=P3^6; void Int_lcd(void) { lcd_w_cmd(0x3c); //设置工作方式 lcd_w_cmd(0x0c); //设置光标 lcd_w_cmd(0x01); //设置清屏 lcd_w_cmd(0x06); //设置输入方式 lcd_w_cmd(0x00); //设置初始显示位置 } unsigned char lcd_r_start(void) { unsigned char s; RW=1; //RW=1,RS=0,读lcd状态 delay1(); RS=0; delay1(); E=1; //E端时序 从低到高再到低 delay1(); s=P1; //从lcd的数据口读状态 E=0; delay1(); RW=0; delay1(); return(s); //返回读取的lcd状态字 } void lcd_w_cmd(unsigned char com) { unsigned char i; do //查lcd忙操作 { i=lcd_r_start(); //调用读状态字函数 i=i&0x80; //“与“操作屏蔽掉低7位 delay(2); } while(i!=0); //lcd忙,继续查询,否则退出循环 RW=0; delay1(); RS=0; //RW=1,RS=0,写lcd命令字 delay1(); E=1; //E端时序 delay1(); P1=com; //将com中的命令字写入lcd数据口 delay1(); E=0; delay1(); RW=1; delay(255); } void lcd_w_dat(unsigned char dat) { unsigned char i; do //查忙操作 { i=lcd_r_start(); //调用读状态字函数 i=i&0x80; //“与“操作屏蔽掉低7位 delay(2); } while(i!=0); RW=0; delay1(); RS=1; //RW=1,RS=0,写lcd命令字 delay1(); E=1; //E端时序 delay1(); P1=dat; //将dat中的命令字写入lcd数据口 delay1(); E=0; delay1(); RW=1; delay(255); } 四.延时函数 _DELAY_H #ifndef _DELAY_H_ #define _DELAY_H_ void delay_10us(unsigned int time); void delay(unsigned int t); void delay1(void); #endif _DELAY_C #include “Main.h“ /******************10us延时***************************** 名称:
delay_10us 功能:
延时10us 1---27us 2---37us 3---45us 4---56us 5---66us 6---76us 7---86us 10--115us 100---1ms **********************************************/ } void delay_10us(unsigned int time) { while(time--); } void delay(unsigned int t) { unsigned int n; n=0; while(n<t) n++; return; void delay1(void) { _nop_(); _nop_(); _nop_(); } 五.按键控制 _KEY_H_ #ifndef _KEY_H_ #define _KEY_H_ unsigned char DealKey(void); #endif _KEY_C_ #include “Main.h“ sbit key1=P2^7; //调整时间 时 或 年 sbit key2=P3^0; //调整时间 分 或 月 sbit key3=P3^1; //保存时间 秒 或 日 sbit key4=P3^2; //确定保存/或进入菜单选择模式 sbit key5=P3^3; //取消 uchar TimeStatus = 0; uchar GetKey(void) { if (0==key1) { if(TimeStatus == 0) return 0; delay(100); if (0==key1) { while(1) { if(1==key1) { delay(50); if(1==key1) break; } } return 1; } } else if (0==key2) { if(TimeStatus == 0) return 0; delay(100); if (0==key2) { while(1) { if(1==key2) { delay(50); if(1==key2) break; } } return 2; } } else if (0==key3) { if(TimeStatus == 0) return 0; delay(100); if (0==key3) { while(1) { if(1==key3) { delay(50); if(1==key3) break; } } return 3; } } else if (0==key4) { delay(100); if (0==key4) { while(1) { if(1==key4) { delay(50); if(1==key4) break; } } return 4; } } else if (0==key5) { delay(100); if (0==key5) { while(1) { if(1==key5) { delay(50); if(1==key5) break; } } return 5; } } return 0; } uchar SetDate(uchar *tpDate) { uchar DispFlag=0; ClrScr(); DispSetDate(0x80); ScrDisp(0xc0,tpDate); while(1) { switch(GetKey()) { case 0: break; case 1: //调整年 if(tpDate[0]=='9') { if(tpDate[1]<'9') { tpDate[1]++; } else { tpDate[0] = '0'; tpDate[1] = '0'; } } else { if(tpDate[1]<'9') { tpDate[1]++; } else { tpDate[0]++; tpDate[1] = '0'; } } DispFlag = 1; break; case 2: //调整月 if (tpDate[3]<'1') { tpDate[4]++; if(tpDate[4]>'9') { tpDate[3]++; tpDate[4]='0'; } } else { if (tpDate[3]=='1') { if(tpDate[4]<='1') { tpDate[4]++; } else { tpDate[3]='0'; tpDate[4]='0'; } } else { tpDate[3]='0'; tpDate[4]='0'; } } DispFlag = 1; break; case 3: //调整日 if(tpDate[6]<'3') { tpDate[7]++; if(tpDate[7]>'9') { tpDate[6]++; tpDate[7]='0'; } } else { if(tpDate[6]>='3') { if(tpDate[7]<'1') { tpDate[7]++; } else { tpDate[6]='0'; tpDate[7]='0'; } } } DispFlag = 1; break; case 4: SaveDate(tpDate); return 4; //保存时间 break; case 5: return 5; //取消 break; default: break; } if(DispFlag==1) { DispFlag = 0; ScrDisp(0xc0,tpDate); } } } uchar SetTime(uchar *tpTime) { uchar DispFlag=0; ClrScr(); DispSetTime(0x80); ScrDisp(0xc0,tpTime); while(1) { switch(GetKey()) { case 0: break; case 1: //调整时间 时 位 if(tpTime[0]>='2') { if(tpTime[1]<'3') { tpTime[1]++; } else { tpTime[0] = '0'; tpTime[1] = '0'; } } else { if(tpTime[1]<'9') { tpTime[1]++; } else { tpTime[0]++; tpTime[1] = '0'; } } DispFlag = 1; break; case 2: //调整时间 分 位 if(tpTime[4]<'9') { tpTime[4]++; } else { if(tpTime[3]<'5') { tpTime[3]++; tpTime[4] = '0'; } else { tpTime[3] = '0'; tpTime[4] = '0'; } } DispFlag = 1; break; case 3: if(tpTime[7]<'9') { tpTime[7]++; } else { if(tpTime[6]<'5') { tpTime[6]++; tpTime[7] = '0'; } else { tpTime[6] = '0'; tpTime[7] = '0'; } } DispFlag = 1; break; case 4: SaveTime(tpTime); return 4; //保存时间 break; case 5: return 5; //取消 break; default: break; } if(DispFlag==1) { DispFlag = 0; ScrDisp(0xc0,tpTime); } } } uchar SetTMP(uchar LHmode,uint *tpTEMP) { uchar DispFlag=0; uchar tpTMP[10]; uint tpTemper=0; ClrScr(); switch(LHmode) { case 1: DispSetLTMP(0x80); break; case 2: default: DispSetHTMP(0x80); break; } DealTemper(tpTemper,tpTMP); ScrDisp(0xc0,tpTMP); while(1) { switch(GetKey()) { case 0: break; case 1: //调整温度 整数 位 if(tpTemper<10000) tpTemper += 100; else tpTemper = tpTemper%100; DispFlag = 1; break; case 2: //调整温度 小数 位 if(tpTemper%100<99) tpTemper ++; else tpTemper = tpTemper/100*100; DispFlag = 1; break; case 3: break; case 4: *tpTEMP = tpTemper; return 1; //保存时间 break; case 5: return 0; //取消 break; default: break; } if(DispFlag==1) { DispFlag = 0; DealTemper(tpTemper,tpTMP); ScrDisp(0xc0,tpTMP); } } return 0; } uchar DealKey(void) { uchar MenuDeep=0; while(1) { switch(GetKey()) { case 0: //TimeStatus = 0; break; case 1: //向上移动光标 if(TimeStatus == 0) break; if(MenuDeep>0) { MenuDeep--; DispMeau(MenuDeep); } break; case 2: //向下移动光标 if(TimeStatus == 0) break; if(MenuDeep<3) { MenuDeep++; DispMeau(MenuDeep); } break; case 3: break; case 4: //确定 if(TimeStatus == 1) { switch(MenuDeep) { case 0: SetDate(Date); break; case 1: SetTime(Time); break; case 2: SetTMP(1,<emper); break; case 3: SetTMP(2,&HTemper); break; } TimeStatus = 0; } else { DispMeau(MenuDeep); TimeStatus = 1; } break; case 5: //取消 TimeStatus = 0; break; default: break; } if(TimeStatus == 0) return 0; } return 0; } 六.菜单显示 功能:把菜单显示出来,人性化,易操作 _DISPMEAU_H_ #ifndef _DISPMEAU_H_ #define _DISPMEAU_H_ void ScrDisp(unsigned char tpAddr , unsigned char *tpStr); void DispSetDate(unsigned char tpAddr); void DispSetTime(unsigned char tpAddr); void DispSetLTMP(unsigned char tpAddr); void DispSetHTMP(unsigned char tpAddr); void DispCursor(unsigned char tpAddr); void DispMeau(unsigned char tpDeep); void ClrScr(void); #endif _DISPMEAU_C_ #include “Main.h“ /****************************** 功能:把tpStr数组数据在tpAddr位置开始显示 输入参数: uchar tpAddr : 显示起始位置 uchar *tpStr : 显示内容 输出: 无 返回: 空 ************************************/ void ScrDisp(uchar tpAddr , uchar *tpStr) { uchar i,len; len = strlen((char*)tpStr); //获取显示内容字节数 lcd_w_cmd(tpAddr); //设置显示位置 for(i=0;i<len;i++) //显示字符串 { lcd_w_dat(tpStr[i]); } } void ClrScr(void) //清除屏幕 { ScrDisp(0x80,“ “); ScrDisp(0xc0,“ “); } void DispSetDate(uchar tpAddr) { ScrDisp(tpAddr,“Set Date “); } void DispSetTime(uchar tpAddr) { ScrDisp(tpAddr,“Set Time “); } void DispSetLTMP(uchar tpAddr) { ScrDisp(tpAddr,“Set Low TMP “); } void DispSetHTMP(uchar tpAddr) { ScrDisp(tpAddr,“Set High TMP “); } void DispCursor(uchar tpAddr) //显示尖头指示符号 { lcd_w_cmd(tpAddr); //设置显示位置 lcd_w_dat(0x7f); } void DispMeau(uchar tpDeep) { //DispCursor(0x8d); switch(tpDeep/2) { case 0: DispSetDate(0x80); DispSetTime(0xc0); if(tpDeep%2==0) DispCursor(0x8d); else DispCursor(0xcd); break; case 1: DispSetLTMP(0x80); DispSetHTMP(0xc0); if(tpDeep%2==0) DispCursor(0x8d); else DispCursor(0xcd); break; default: break; } }
相关热词搜索:单片机 课程设计 报告 单片机课程设计报告基于单片机的温控系统 单片机课程设计报告模板 单片机课程设计报告
- 范文大全
- 说说大全
- 学习资料
- 语录
- 生肖
- 解梦
- 十二星座
-
主题党日活动交流发言8篇
主题党日活动交流发言8篇主题党日活动交流发言篇13月13日,东城区党史学习教育动员大会召开。市委
【活动总结】 日期:2022-12-23
-
2022年4月主题党日活动记录范文15篇
2022年4月主题党日活动记录范文15篇2022年4月主题党日活动记录范文篇1一个崇尚阅读的民族,必然精神饱满、意气风发、活力四射。习近平总书记强调:“学习
【活动总结】 日期:2022-08-01
-
少先队的光荣历史故事 队前教育-光辉历程
2017-2018学年队前教育1光辉历程一、劳动童子团1924——1927二、三十年代年的中国是一个
【法律文书】 日期:2020-06-23
-
家乡赋|最美的家乡赋
家乡赋 孙传志 今安康市,白河双丰镇,吾之家乡也。三环沃土,山水环抱。其北依山,山系五岭,山
【调研报告】 日期:2020-04-01
-
【人教版1-6年级数学上册知识点精编】1-6年级数学人教版教材
人教版二年级数学上册知识点汇总第一单元长度单位一、米和厘米1、测量物体的长度时,要用统一的标准去测量
【调研报告】 日期:2020-11-08
-
党支部1-12月全年主题党日活动计划表
2022年党支部主题党日活动计划表序号活动时间活动方式活动内容12022年1月专题学习研讨集中观看2022年新年贺词,积极开展学习研讨交流。组织生活会组织党员认真对照党章...
【活动总结】 日期:2022-10-14
-
2022年2月份主题党日活动记录5篇
2022年2月份主题党日活动记录5篇2022年2月份主题党日活动记录篇1尊敬的党组织:在今年的开学初,本人积极参加教研室组织的教研活动,在学校教研员的指
【活动总结】 日期:2022-08-12
-
2023年平安校园建设方案13篇
平安校园建设方案“平安校园”创建工作,我们幼儿园全体教职员工一直把它当作头等大事来抓。领导高度重视,以“平安校园”创建活动为抓手,建立和规范校园安全工作机制
【规章制度】 日期:2023-11-02
-
医院最佳主题党日活动11篇
医院最佳主题党日活动11篇医院最佳主题党日活动篇1 医院最佳主题党日活动篇2为隆重纪念中国共产党成立100周年,进一步巩固党的群众路线教育实践活动成果,切实
【活动总结】 日期:2022-10-29
-
主题党日活动记录202210篇
主题党日活动记录202210篇主题党日活动记录2022篇12021年是中国共产党成立100周年,为广泛开展爱国主义宣传教育,铭记党的历史,讴歌党的光辉历程,
【活动总结】 日期:2022-08-02
-
正式的晚宴邀请函 公司晚宴邀请函
尊敬的先生 女士: 我公司谨定于xxxx年xx月xx日xx:xx在xxxx店隆重举行xx市xx届xxxx晚宴(宴会地址:xx区xx路xxxx) 敬请届时光临!xxxxxx集团股份有限公司xxxx有限公司敬邀xxxx年xx月xx日
【简历资料】 日期:2019-08-03
-
一年级新学期目标简短_一年级学生新学期打算
新学期到了,我是一年级下册的小学生了。 上课的时候,我要认真学习,不做小动作,认真听讲。我要认真学习,天天向上,努力学习,耳朵要听老师讲课,眼睛要瞪得大大的看老...
【简历资料】 日期:2019-10-26
-
[信访复查复核制度作用探讨]信访复查复核有用吗
作为我国特有的一项制度,信访制度的出现并长期存在不是偶然的,虽然一些法学专家认为信访制度具有“人治”
【职场指南】 日期:2020-02-16
-
[党员干部2019年主题教育个人问题检视清单及整改措施2篇] 党员干部
2019年主题教育问题检视清单及整改措施根据主题教育领导小组办公室《关于认真做好主题教育检视问题整改
【求职简历】 日期:2019-11-08
-
网络维护工作内容_(精华)国家开放大学电大专科《网络系统管理与维护》形考任务1答案
国家开放大学电大专科《网络系统管理与维护》形考任务1答案形考任务1理解上网行为管理软件的功能【实训目
【职场指南】 日期:2020-07-17
-
入少先队员改正的缺点有哪些_少先队申请书
敬爱的少先队组织:我们是共产主义接班人,继承革命先辈的光荣传统,爱祖国,爱人民,鲜艳的红领巾飘扬在前胸 我叫xx,是一年级(x)班的小学生。每当听到这首...
【简历资料】 日期:2019-07-28
-
党委会与局长办公会的区别_局长办公会制度
为进一步加强xxx局工作的规范化、制度化建设,提高行政效能,规范议事程序,特制定本制度。一、会议形式1、局长办公会议由局长、副局长参加。由局长召集和主持。根据工作需要...
【求职简历】 日期:2019-07-30
-
学生会组织部部长竞选稿5篇
学生会组织部部长竞选稿以“三制”为统领推进农村党的建设中共**市委组织部近年来,**市认真落实中央、省和徐州市委的部署,积极适应发展要求,从加强领导体制、运
【求职简历】 日期:2023-11-06
-
如何凝心聚力谋发展【坚定信心谋发展凝心聚力促跨越】
当前,清河正处于在苏北实现赶超跨越基础上全面腾飞的战略机遇期,处于在全市率先实现全面小康基础上率先实
【简历资料】 日期:2020-03-17
-
《铁拳砸碎“黑警伞”》警示教育片观后感
影片深刻剖析了广西北海市公安局海西派出所原所长张枭杰蜕变堕落的轨迹。观看警示教育片后,做为一名党员教
【简历资料】 日期:2020-08-17
-
2022市委书记在全市党务工作会议上的讲话(2022年)
市委书记在全市党务工作会议上的讲话同志们:今天,我们把宣传、组织、统战、党委办公室以及老干部、党校、机关党委七个方面的年度工作会议进行合并,召开一个综合性的党务工...
【其他范文】 日期:2022-11-10
-
【在推进全面从严治党工作座谈会上的讲话】
在推进全面从严治党工作座谈会上的讲话同志们:这次推进全面从严治党工作座谈会,主要任务是,围绕促进干部
【节日庆典】 日期:2021-03-16
-
印象童年
■湖南省益阳市第一中学 刘翔鸥我有一本画册,画着我的童年。有一条小溪,溪水一旁是茂密的树林,遮住了小
【其他范文】 日期:2023-01-08
-
班子党史学习教育专题民主生活会,班子对照检查材料13篇
班子党史学习教育专题民主生活会班子对照检查材料13篇班子党史学习教育专题民主生活会班子对照检查材料篇
【其他范文】 日期:2022-12-24
-
廉政党课:运用“四种形态”,切实加强党风廉政建设和反腐败工作
廉政党课:运用四种形态切实加强党风廉政建设和反腐败工作今天,给大家上一堂廉政教育党课,其一是落实党风廉政建设责任制的相关要求;其二是为了引导大家正确认清形势,自觉...
【其他范文】 日期:2022-08-25
-
党建点燃国潮复兴,文创点亮美好生活–XXX公司实现“党建+业务”共赢的结题报告
摘要:为了纪念建党一百周年这一重要的历史时刻,我们带着敬意回顾历史,采用创意留下印记。2021年,是中国成立100周年,是“十四五”开局之年,是乘势而上开启全面建设社会主...
【其他范文】 日期:2022-10-17
-
0W-20,发动机油节能效果及影响因素研究
李程中国石化润滑油有限公司北京研究院使用低黏度发动机油是提高燃油经济性的有效方法。本文选取4款150
【其他范文】 日期:2023-01-28
-
政治立场坚定6篇
政治立场坚定6篇政治立场坚定篇1我时刻在谋划工作方法努力做到工作科学化高效化精细化。一是创新时间,安排每天早上7点至9点,晚上8点至10点处理内部事务,上午9点
【其他范文】 日期:2022-08-07
-
特殊教育老师个人总结【特殊教育教师工作总结】
怀着对教育的梦想,我捧着一颗火热的心踏上了神圣的讲台。过在这半年里我深刻体会到了做老师的艰辛和快乐,我把自己的青春倾注于我所钟爱的特殊教育事业上,倾注于每一个学生...
【评语寄语】 日期:2019-11-12
-
2022党员第一季度思想情况汇报
敬爱的党组织:一季度来,在党支部的正确领导下,在领导和同志们的关心支持和帮助下,我自觉加强学习,认真履行职责,从严要求自我,较好地完成了各项工作任务。现将一季度思...
【其他范文】 日期:2022-11-07
-
军转座谈会交流发言4篇
军转座谈会交流发言4篇军转座谈会交流发言篇1大家好,我叫贺丽,2015届选调生,来自康定市委组织部,现在省委编办跟班学习。今天,非常荣幸向大家汇报我的学习收
【发言稿】 日期:2022-10-27
-
12岁生日小寿星发言4篇
12岁生日小寿星发言4篇12岁生日小寿星发言篇1各位来宾、各位朋友:大家好!今天,我们欢聚在这里,共同庆祝**十二周岁生日。首先,我代表**的父母以
【发言稿】 日期:2022-07-31
-
廉政大会总结发言稿7篇
廉政大会总结发言稿7篇廉政大会总结发言稿篇1各位领导,同志们:根据会议安排,我就党风廉政建设工作做表态发言,不妥之处,请批评指正。一、提高认识,切实
【发言稿】 日期:2022-10-30
-
我最敬佩的人开头_我敬佩的一个人作文20篇2020年
我敬佩的一个人作文20篇 我敬佩的一个人作文一): 我身边有很多值得我们敬佩的人,但我最敬佩的一
【发言稿】 日期:2020-11-10
-
纪委书记工作表态发言4篇
纪委书记工作表态发言4篇纪委书记工作表态发言篇1在镇党委政府正确领导下,在全村干部和群众的共同努力下,紧紧围绕建设社会主义新农村工作为重点,尽职尽责,与时俱
【发言稿】 日期:2022-09-30
-
党员教育培训总结交流发言12篇
党员教育培训总结交流发言12篇党员教育培训总结交流发言篇1根据市委组织部《关于开展我市〈20XX
【发言稿】 日期:2022-12-19
-
[钻井队队长(副队长、指导员)岗位HSE应知应会试题(1863)]
钻井队队长(副队长、指导员)岗位HSE应知应会试题(判断题:771;单选题:626;多选题:466)
【贺词】 日期:2020-09-23
-
【企业疫情风险控制方案】 2020企业复工疫情方案
企业疫情风险控制方案2020新冠病毒肺炎疫情防控工作总结汇报3篇 关于新型冠状病毒感染的肺炎疫
【演讲稿】 日期:2020-02-27
-
话剧《家》剧本 话剧剧本:爱的空间
找文章到更多原创-(http: www damishu cn)人物介绍:刘伟,男,32岁,某购物广
【演讲稿】 日期:2020-01-21
-
五言绝句大全500首古诗_五言绝句144首
五言绝句144首 五言绝句(一): 1《春夜喜雨》唐朝·杜甫 好雨知时节,当春乃发生。随风潜入
【祝福语】 日期:2021-03-13
-
2023年中国行政区划调整方案(设想优秀3篇
中国行政区划调整方案(设想优秀民政部第二次行政区划研讨会会议内容一、缩省的意义与原则1.意义1)利于减少中间层次中国行政区划层级之多为世界之最,既使管理成本
【周公解梦】 日期:2024-02-20
-
2023年和儿媳妇在一起幸福的句子3篇
和儿媳妇在一起幸福的句子1、假如人生不曾相遇,我还是那个我,偶尔做做梦,然后,开始日复一日的奔波,淹没在这喧嚣的城市里。我不会了解,这个世界还有这样的一个你
【格言】 日期:2023-11-10
-
XX老干局推进党建与业务深度融合发展工作情况调研报告:党建调研报告
XX老干局推进党建与业务深度融合 发展工作情况的调研报告 党建工作与业务工作融合发展始终是一个充满生
【成语大全】 日期:2020-08-28
-
中国共产党第三代中央领导集体的卓越贡献
中国共产党第三代中央领导集体的卓越贡献 --------------继往开来铸就辉煌 【摘要】改
【成语大全】 日期:2020-03-20
-
信息技术2.0能力点 [全国中小学教师信息技术应用能力提升工程试题题库及参考答案「精编」]
全国中小学教师信息技术应用能力提升工程试题题库及答案(复习资料)一、判断题题库(A为正确,B为错误)
【格言】 日期:2020-11-17
-
党建工作运行机制内容有哪些_构建基层党建工作运行机制探讨
党的基层组织是党在社会基层组织中的战斗堡垒,是党的全部工作和战斗力的基础。加强和改进县级以下各类党的
【经典阅读】 日期:2020-01-22
-
电大现代教育原理_最新国家开放大学电大《现代教育原理》形考任务2试题及答案
最新国家开放大学电大《现代教育原理》形考任务2试题及答案形考任务二一、多项选择题(共17道试题,共3
【成语大全】 日期:2020-07-20
-
集合推理_七,推理与集合
七推理与集合1 期中考试数学成绩出来了,三个好朋友分别考了88分,92分,95分。他们分别考了多少分
【名人名言】 日期:2020-12-18
-
基层党务工作基本内容_党建基本工作有哪些
党建基本工作有哪些(一) 基层党建工作包括哪些内容 选择了大学生村官这条路,你就与农村基层党
【名人名言】 日期:2020-08-06
-
【2020-2021学年高一英语外研版(2019)选择性必修第一册Unit3Faster,higher,strongerSectionⅠ导学讲义】
Unit3 Faster,higher,stronger背景导学MichaelJordan—Head
【歇后语】 日期:2021-04-19
-
关于三农工作重要论述心得体会3篇
关于三农工作重要论述心得体会3篇关于三农工作重要论述心得体会篇1习近平总书记指出:“建设现代化国家离不开农业农村现代化,要继续巩固脱贫攻坚成果,扎实推进乡村
【学习心得体会】 日期:2022-10-29
-
【福生庄隧道坍塌处理方案】 福生庄隧道在哪里
(呼和浩特铁路局大包电气化改造工程指挥部,内蒙古呼和浩特010050)摘要:文章介绍了福生庄隧道
【学习心得体会】 日期:2020-03-05
-
五个一百工程阅读心得体会13篇
五个一百工程阅读心得体会13篇五个一百工程阅读心得体会篇1凡益之道,与时偕行。在全国网络安全和信
【学习心得体会】 日期:2022-12-07
-
城管系统警示教育心得体会9篇
城管系统警示教育心得体会9篇城管系统警示教育心得体会篇1各党支部要召开多种形式的庆七一座谈会,组织广大党员进行座谈,回顾党的光辉历程,畅谈党的丰功伟绩,
【学习心得体会】 日期:2022-10-09
-
发展对象培训主要内容10篇
发展对象培训主要内容10篇发展对象培训主要内容篇1怀着无比激动的心情,我有幸参加了__新区区委党校20__年第四期(区级机关)党员发展对象培训班。这次的学习
【培训心得体会】 日期:2022-09-24
-
凝聚三种力量发展全过程人民民主心得体会12篇
凝聚三种力量发展全过程人民民主心得体会12篇凝聚三种力量发展全过程人民民主心得体会篇1新民主主义革命是指在帝国主义和无产阶级革命时代,殖民地半殖民地国家中的
【学习心得体会】 日期:2022-08-31
-
2022年全国检察长会议心得7篇
2022年全国检察长会议心得7篇2022年全国检察长会议心得篇1眼睛是心灵上的窗户,我们通过眼睛才能看到世间万物,才能看到眼前这美好的一切。拥有一双明亮的眼
【学习心得体会】 日期:2022-10-31
-
在街道深化作风建设推动高质量发展走在前列动员会上讲话
在2023年街道深化作风建设推动高质量发展走在前列动员会上的讲话同志们:今天我们召开“街道深化作风建设推动高质量发展走在前列动员会”,这次会议是街道三季度召开的第一场...
【军训心得体会】 日期:2024-03-17
-
全面从严治党的心得体会800字7篇
全面从严治党的心得体会800字7篇全面从严治党的心得体会800字篇1中国特色社会主义是我们党领导
【学习心得体会】 日期:2022-12-14
-
矫正心得体会6篇
矫正心得体会6篇矫正心得体会篇1今天,是自己出监后第一次参加阳光中途之家组织的社区矫正方面的教育
【学习心得体会】 日期:2022-12-24
-
2024年主题教育民主生活会批评与自我批评意见(38条)(范文推荐)
2023年主题教育民主生活会六个方面个人检视、相互批评意见:1 理论学习系统性不强。学习习近平新时代中国特色社会主义思想不深不透,泛泛而学的时候多,深学细照的时候少,特...
【邓小平理论】 日期:2024-03-19
-
2024年交流发言:强化思想理论武装,增强奋进力量(完整)
习近平总书记指出:“一个民族要走在时代前列,就一刻不能没有理论思维,一刻不能没有思想指引。”党的十八大以来,伴随着新时代中国特色社会主义思想在实践中形成发展的历程...
【三个代表】 日期:2024-03-19
-
2024年度镇年度县乡人大代表述职评议活动总结
xx镇20xx年县乡人大代表述职评议活动总结为响应县级人大常委会关于开展县乡两级人大代表述职评议活动,进一步激发代表履职活力,加强代表与人民群众的联系,提高依法履职水平...
【马克思主义】 日期:2024-03-19
-
“千万工程”经验学习体会(研讨材料)
“千万工程”是总书记在浙江工作时亲自谋划、亲自部署、亲自推动的一项重大决策,也是习近平新时代中国特色社会主义思想在之江大地的生动实践。20年来,“千万工程”先后经历...
【三个代表】 日期:2024-03-19
-
2024年在市政协机关工作总结会议上讲话
同志们:刚才,XX同志对市政协机关20XX年工作进行了很好的总结,很精炼,很到位,可以感受到去年机关工作确实可圈可点。XX同志宣读了表彰决定,机关优秀人员代表、先进集体代...
【邓小平理论】 日期:2024-03-18
-
在全区防汛防涝动员暨河长制工作推进会上讲话提纲【完整版】
区长,各位领导,同志们:汛期已经来临,我区城区防涝工作面临强大考验,形势不容乐观。年初,区城区防涝排渍指挥部已经召开专题调度会,修订完善应急预案,建立网格化管理机...
【马克思主义】 日期:2024-03-18
-
2024年镇作风整治工作实施方案(完整文档)
XX镇作风整治工作实施方案为深入贯彻落实党的二十大精神及省市区委深化作风建设的最新要求,突出重点推进干部效能提升,坚持不懈推动作风整治工作纵深发展,根据《关于印发《2...
【毛泽东思想】 日期:2024-03-18
-
2024市优化法治化营商环境规范涉企行政执法实施方案【优秀范文】
xx市优化法治化营商环境规范涉企行政执法实施方案为持续优化法治化营商环境,激发市场主体活力和社会创造力,规范行政执法行为,创新行政执法方式,提升行政执法质效,着力解...
【毛泽东思想】 日期:2024-03-18
-
2024年度关于开展新一轮思想状况摸底排查工作通知(完整)
关于开展新一轮思想状况摸底排查工作的通知为深入贯彻落实关于各地开展干部职工思想状况大摸底大排查情况上的批示要求和改革教育第二次调度会议精神,有针对性做好队伍教育管...
【三个代表】 日期:2024-03-18
-
2024年公路养护中心主任典型事迹材料(完整文档)
“中心的工作就是心中的事业”——公路养护中心主任典型事迹材料**,男,1976年6月出生,1993年参加工作,2000年4月调入**区交通运输局工作,大学本科学历,中共党员,现任**...
【马克思主义】 日期:2024-03-17