带显示报警的单片机温度C语言控制程序

合集下载

单片机温控程序

单片机温控程序

单片机温控程序
单片机温控程序是一种用于控制温度的程序,它可以实现对温度的监测和控制。

通过使用单片机及其相关的传感器和执行器,可以实现对温度的精确控制,从而满足不同场景下的温度需求。

在温控程序中,首先需要使用温度传感器来检测当前的环境温度。

传感器将实时采集到的温度值转换成数字信号,并通过单片机进行处理。

单片机会根据预设的温度范围,判断当前温度是否处于合理范围内。

当温度超过预设范围时,单片机将启动执行器,通过控制电磁阀或者风扇等设备,调节环境温度。

当温度下降到合理范围内时,单片机会停止执行器的工作,从而实现温度的控制。

在温控程序中,关键是确定合理的温度范围和控制策略。

温度范围的确定需要根据具体的场景和需求来进行调整,以确保温度的稳定性和安全性。

控制策略的选择也很重要,可以根据不同的情况采用开环控制或闭环控制等不同的方式。

除了温度控制外,温控程序还可以实现其他功能,如温度显示、报警等。

通过在单片机上添加合适的显示模块和报警器,可以实现对温度的实时显示和异常温度的报警功能,从而提高温度监测的效果和准确性。

单片机温控程序是一种重要的技术应用,可以广泛应用于各种领域,
如家庭、工业、医疗等。

通过合理的温度控制,可以提高生活和工作环境的舒适度和安全性,为人们的生活和工作带来便利和保障。

温度测量、报警系统 C程序

温度测量、报警系统  C程序

程序名称:DS18B20温度测量、报警系统简要说明:DS18B20温度计,温度测量范围0~99.9摄氏度可设置上限报警温度、下限报警温度即高于上限值或者低于下限值时蜂鸣器报警默认上限报警温度为38℃、默认下限报警温度为5℃报警值可设置范围:最低上限报警值等于当前下限报警值最高下限报警值等于当前上限报警值将下限报警值调为0时为关闭下限报警功能编写:最后更新:09/04/16晚于寝室******************************************************************/ #include <AT89X52.h>#include "DS18B20.h"#define uint unsigned int#define uchar unsigned char //宏定义#define SET P3_1 //定义调整键#define DEC P3_2 //定义减少键#define ADD P3_3 //定义增加键#define BEEP P3_7 //定义蜂鸣器bit shanshuo_st; //闪烁间隔标志bit beep_st; //蜂鸣器间隔标志sbit DIAN = P2^7; //小数点uchar x=0; //计数器signed char m; //温度值全局变量uchar n; //温度值全局变量uchar set_st=0; //状态标志signed char shangxian=38; //上限报警温度,默认值为38signed char xiaxian=5; //下限报警温度,默认值为38ucharcode LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x ff};/*****延时子程序*****/void Delay(uint num){while( --num );}/*****初始化定时器0*****/void InitTimer(void){TMOD=0x1;TH0=0x3c;TL0=0xb0; //50ms(晶振12M)}/*****定时器0中断服务程序*****/void timer0(void) interrupt 1{TH0=0x3c;TL0=0xb0;x++;}/*****外部中断0服务程序*****/void int0(void) interrupt 0{EX0=0; //关外部中断0if(DEC==0&&set_st==1){shangxian--;if(shangxian<xiaxian)shangxian=xiaxian; }else if(DEC==0&&set_st==2){xiaxian--;if(xiaxian<0)xiaxian=0;}}/*****外部中断1服务程序*****/void int1(void) interrupt 2{EX1=0; //关外部中断1if(ADD==0&&set_st==1){shangxian++;if(shangxian>99)shangxian=99;}else if(ADD==0&&set_st==2){xiaxian++;if(xiaxian>shangxian)xiaxian=shangxian; }}/*****读取温度*****/void check_wendu(void){uint a,b,c;c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差 a=c/100; //计算得到十位数字b=c/10-a*10; //计算得到个位数字m=c/10; //计算得到整数位n=c-a*100-b*10; //计算得到小数位if(m<0){m=0;n=0;} //设置温度显示上限if(m>99){m=99;n=9;} //设置温度显示上限}/*****显示开机初始化等待画面*****/Disp_init(){P2 = 0xbf; //显示-P1 = 0xf7;Delay(200);P1 = 0xfb;Delay(200);P1 = 0xfd;Delay(200);P1 = 0xfe;Delay(200);P1 = 0xff; //关闭显示}/*****显示温度子程序*****/Disp_Temperature() //显示温度{P2 =0xc6; //显示CP1 = 0xf7;Delay(300);P2 =LEDData[n]; //显示个位P1 = 0xfb;Delay(300);P2 =LEDData[m%10]; //显示十位DIAN = 0; //显示小数点P1 = 0xfd;Delay(300);P2 =LEDData[m/10]; //显示百位P1 = 0xfe;Delay(300);P1 = 0xff; //关闭显示}/*****显示报警温度子程序*****/Disp_alarm(uchar baojing){P2 =0xc6; //显示CP1 = 0xf7;Delay(200);P2 =LEDData[baojing%10]; //显示十位P1 = 0xfb;Delay(200);P2 =LEDData[baojing/10]; //显示百位P1 = 0xfd;Delay(200);if(set_st==1)P2 =0x89;else if(set_st==2)P2 =0xc7; //上限H、下限L标示P1 = 0xfe;Delay(200);P1 = 0xff; //关闭显示}/*****报警子程序*****/void Alarm(){if(x>=10){beep_st=~beep_st;x=0;}if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0; else BEEP=1;}/*****主函数*****/void main(void){uint z;InitTimer(); //初始化定时器EA=1; //全局中断开关TR0=1;ET0=1; //开启定时器0IT0=1;IT1=1;check_wendu();check_wendu();for(z=0;z<300;z++){Disp_init();}while(1){if(SET==0){Delay(2000);do{}while(SET==0);set_st++;x=0;shanshuo_st=1;if(set_st>2)set_st=0;}if(set_st==0){EX0=0; //关闭外部中断0EX1=0; //关闭外部中断1check_wendu();Disp_Temperature();Alarm(); //报警检测}else if(set_st==1){BEEP=1; //关闭蜂鸣器EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(shangxian);} }else if(set_st==2){BEEP=1; //关闭蜂鸣器EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(xiaxian);} }}}/*****END*****/DS18B20.h:#include <AT89X52.h>#define DQ P3_6 //定义DS18B20总线I/O/*****延时子程序*****/void Delay_DS18B20(int num){while(num--) ;}/*****初始化DS18B20*****/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位Delay_DS18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低Delay_DS18B20(80); //精确延时,大于480usDQ = 1; //拉高总线Delay_DS18B20(14);x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败Delay_DS18B20(20);}/*****读一个字节*****/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;Delay_DS18B20(4);}return(dat);}/*****写一个字节*****/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;Delay_DS18B20(5);DQ = 1;dat>>=1;}}/*****读取温度*****/unsigned int ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar(); //读低8位b=ReadOneChar(); //读高8位t=b;t<<=8;t=t|a;tt=t*0.0625;t= tt*10+0.5; //放大10倍输出并四舍五入 return(t);}/*****END*****/。

基于51单片机的温度报警系统设计

基于51单片机的温度报警系统设计

基于51单片机的温度报警系统设计温度报警系统是一种常见的安全监控系统,它可以监测环境温度,并在温度达到设定阈值时发出警报。

本文将介绍一个基于51单片机的温度报警系统的设计。

一、系统设计目标和功能本系统的设计目标是实时监测环境温度,并在温度达到预设阈值时发出警报。

具体功能包括:1.温度采集:通过温度传感器实时采集环境温度。

2.温度显示:将采集到的温度值通过数码管显示出来。

3.温度比较:将采集到的温度值与预设的阈值进行比较。

4.报警控制:当温度超过预设的阈值时,触发警报控制器。

5.报警指示:通过蜂鸣器或者LED灯等方式进行报警提示。

二、硬件设计本系统的硬件设计包括主控部分和外围部分。

1. 主控部分:使用51单片机作为主控芯片,通过AD转换器和温度传感器实现温度数据采集。

采用片内RAM和Flash存储器对数据进行处理和存储。

2.外围部分:包括数码管显示和报警指示。

使用数码管模块将温度值进行显示,使用LED灯或者蜂鸣器进行报警指示。

三、软件设计本系统的软件设计包括程序的编写和算法的设计。

1.程序编写:使用C语言编写单片机的程序。

程序主要包括温度采集、温度比较、报警控制和报警指示等功能。

2.算法设计:根据采集到的温度值与预设阈值进行比较,判断是否触发警报控制器。

同时,根据警报控制器的状态,控制报警指示的开关。

四、系统测试完成硬件和软件设计后,需要进行系统测试以验证系统的正确性和稳定性。

1.硬件测试:对硬件电路进行测试,包括电源、信号传输和外围器件等方面。

测试时需要注意电源的稳定性,信号的准确性和外围部件的工作状态。

2.软件测试:进行程序的运行测试,检查各功能是否正常运行。

特别关注温度采集和比较、报警控制和报警指示等功能。

五、系统性能分析对系统的性能进行分析,包括温度采集的准确性、报警控制的响应时间和报警指示的稳定性等方面。

1.温度采集准确性:主要受温度传感器的精度和ADC转换的准确性影响。

在设计中要选择合适的传感器和ADC。

对ds18b20温度控制C语言程序

对ds18b20温度控制C语言程序

{ Init();//初始化DS18B20 Wait();//等待应答 delay(1);//延时 Wrbyte(0xcc);//skip rom命令 Wrbyte(0x44);//convert T命令 } /*读取温度值*/ void Retemp() { Init();//初始化DS18B20 Wait();//等待应答 delay(1);//延时 Wrbyte(0xcc);//skip rom命令 Wrbyte(0xbe);//read scratchpad(读暂存器)命令 tplsb=Rebyte();//温度低位字节(其中第四位为小数部分) tpmsb=Rebyte();//温度高位字节(其中高五位为符号位) temp=(tpmsb*256+tplsb)*0.0625;//转换 } /*LED显示*/ void Display() { uint j=0,k=0,n; for(n=0;n<3;n++) { j=temp/10;//取温度十位 k=temp%10; //取温度个位 P0=wbuf[j];//把要显示的位送入P0口 A=0;C=1; //开第一位数码管,显示十位 delay(10); //com1=1; //关第一位显示 P0=wbuf[k];//把要显示的位送入P0口 A=1;C=0; //开第二位数码管,显示个位 //delay(2); //com2=1;//关第二位显示 } }
{ uint i=100us DQ=1;//拉高电平,产生上升沿 i=4; while(i>0)i--; } /*等待应答脉冲*/ void Wait() { uint i; while(DQ); while(~DQ); //检测到应答脉冲 i=4; while(i>0)i--; } /*读数据一位*/ bit Rebit() { uint i; bit b; DQ=0; i++;//保持低电平至少1us DQ=1; i++;i++;//延时15us以上,读时隙下降沿后15us,DS18B20输出数据才 有效 b=DQ; i=9; while(i>0)i--;//读时隙不低于60us return(b); } /*读一个字节数据*/ uchar Rebyte() { uchar i,j=0,k=0; for(i=0;i<8;i++)

基于C51单片机的数字温度报警器的设计

基于C51单片机的数字温度报警器的设计

中国地质大学(武汉)——基于C51单片机的数字温度报警器的设计指导老师:姓名:班级:072学号:专业:机械设计制造及其自动化院系:机电学院日期:2016.01.10基于单片机的数字温度报警器的设计摘要:随着现代信息化技术的飞速发展和传统工业改造的逐步实现,能独立工作的温度检测系统已广泛应用于各种不同的领域。

本次课程设计是基于AT89C51单片机进行温度传测定及报警等功能的设计,利用数字温度传感器DS18B20的测温系统,通过LED数码管和LCD液晶显示屏同时显示实时温度和报警预设温度,报警指示通过蜂鸣器的声音和16X16点阵屏同时报警,并能采取降温措施(直流电动机启动)。

同时本次设计的报警温度采用键盘输入的方式,确保各种报警温度可以方便的设定和调节。

本次课程设计的系统电路简单、操作简便,能任意设定报警温度,系统具有可靠性高、成本低、功耗小等优点。

关键词:单片机、温度检测、AT89C51、DS18B20目录基于单片机的数字温度报警器的设计 (1)一、引言: (3)二、设计方案 (3)1.基本要求 (3)2.扩展功能 (3)3.方案选定 (3)4.总体设计方案 (4)三、功能模块分析 (4)1.复位电路 (4)2.键盘电路 (5)3.DS18B20温度检测电路 (6)4.显示电路 (7)5.报警电路 (10)6.降温风扇电路 (10)四、软件设计分析 (11)1.主函数模块 (11)2.温度检测模块 (12)3.键盘扫描模块 (13)4.LCD液晶显示模块 (14)5.中断模块 (15)五、课程设计体会 (15)附录: (18)一、引言:随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,各种数字系统的应用也使人们的生活更加舒适。

数字化控制、智能控制为现代人的工作、生活、科研等方面带来方便。

其中数字温度计就是一个典型的例子。

数字温度计与传统的温度计相比,具有读数方便、测温范围广、测温精确、功能多样话等优点。

基于单片机温度报警器的设计

基于单片机温度报警器的设计

基于单片机温度报警器的设计温度报警器是一种常见的安全设备,用于监测环境温度并在温度超过设定阈值时发出警报。

基于单片机的温度报警器可以实现温度监测、报警和数据记录等功能,具有灵敏度高、可靠性好、成本低等优点。

下面将描述一种基于单片机的温度报警器的设计。

设计思路:本设计采用温度传感器、单片机、蜂鸣器和LCD液晶显示器等组成,实现温度监测和报警功能。

温度传感器用于测量环境温度,将温度值传输给单片机进行处理;单片机负责对温度值进行比较和判断,当温度超过设定阈值时,通过控制蜂鸣器发出警报声,并在LCD显示器上显示温度值和警报信息。

硬件设计:1.温度传感器:可以选择数字温度传感器,如DS18B20。

将温度传感器连接到单片机的数字引脚上,通过引脚读取传感器输出的数字信号。

2.单片机:可以选择常见的8位单片机,如STC89C52、单片机具有较强的处理能力和丰富的IO资源,可以用于读取和处理温度传感器数据,并控制蜂鸣器和LCD显示器。

3.蜂鸣器:选择合适的蜂鸣器,并将其连接到单片机的IO引脚上。

当温度超过设定阈值时,单片机将IO引脚置高,使蜂鸣器发出警报声。

4.LCD液晶显示器:选择适配器单片机的LCD显示器,通过单片机的IO引脚与单片机连接。

当温度超过设定阈值时,将警报信息显示在LCD上。

软件设计:1.硬件初始化:设置单片机相关IO引脚为输入输出模式,初始化温度传感器和LCD显示器。

2.温度采集:通过单片机的数字引脚读取温度传感器输出的数字信号,并进行相应的数据转换,得到环境温度值。

3.温度监测:将环境温度值与设定的阈值进行比较,若温度超过阈值则触发报警。

4.报警处理:当温度超过设定阈值时,通过设置单片机的IO引脚,控制蜂鸣器发出警报声,并在LCD显示器上显示警报信息。

5.数据记录:可以选择将温度数据保存到EEPROM中,方便后续查询和分析。

总结:基于单片机的温度报警器是一种简单但实用的安全设备,通过温度传感器和单片机的配合,可以实现对环境温度的实时监测和报警功能。

51单片机汇编语言及C语言经典实例

51单片机汇编语言及C语言经典实例

51单片机汇编语言及C语言经典实例汇编语言是一种用来编写计算机指令的低级语言,它与机器语言十分接近,可以直接控制计算机硬件。

而C语言是一种高级程序设计语言,它具有结构化编程和模块化设计的特点。

本文将介绍51单片机汇编语言和C语言的经典实例,并进行详细解析。

一、LED指示灯的闪烁我们首先来看一个经典的51单片机汇编语言的实例——LED指示灯的闪烁。

我们可以通过控制单片机的IO口来实现LED的闪烁效果。

以下是汇编语言的代码:```assemblyORG 0 ; 程序起始地址MOV P1, #0; 将 P1 置为0,熄灭LEDLJMP $ ; 无限循环```以上代码使用了51单片机的MOV指令和LJMP指令。

MOV指令用来将一个立即数(这里是0)存储到寄存器P1中,控制对应的I/O口输出低电平,从而熄灭LED。

而LJMP指令则是无条件跳转指令,将程序跳转到当前地址处,实现了无限循环的效果。

对应的C语言代码如下:```c#include <reg51.h>void main() {P1 = 0; // 将 P1 置为0,熄灭LEDwhile(1); // 无限循环}```以上代码使用了reg51.h头文件,该头文件提供了对51单片机内部寄存器和外设的访问。

通过将P1赋值为0,控制IO口输出低电平,实现了熄灭LED的效果。

while(1)是一个无限循环,使得程序一直停留在这个循环中。

二、数码管的动态显示接下来我们介绍51单片机汇编语言和C语言实现数码管动态显示的经典实例。

数码管动态显示是通过控制多个IO口的高低电平来控制数码管显示不同的数字。

以下是汇编语言的代码:```assemblyORG 0 ; 程序起始地址MOV A, #0FH ; 设置数码管全亮,A存储数码管控制位MOV P2, A ; 将 A 的值存储到 P2,控制数码管的数码控制位DELAY: ; 延时循环MOV R7, #0FFH ; 设置延时计数值LOOP1: ; 内层循环MOV R6, #0FFH ; 设置延时计数值LOOP2: ; 内部延时循环DJNZ R6, LOOP2 ; 延时计数减1并判断是否为0,不为0则继续循环DJNZ R7, LOOP1 ; 延时计数减1并判断是否为0,不为0则继续循环DJNZ A, DELAY ; A减1并判断是否为0,不为0则继续循环JMP DELAY ; 无限循环,实现动态显示```以上代码中,我们通过MOV指令来将一个立即数(0x0F)存储到寄存器A中,控制数码管显示0-9的数字。

单片机温度报警器程序

单片机温度报警器程序

单片机温度报警器程序单片机温度报警器程序是一种针对特定应用场景的嵌入式系统程序。

该程序可以实现自动感知环境温度并发出警报,以便提醒用户及时采取适当的措施,避免温度对设备或人体造成不良影响。

下面是该程序的具体实现步骤。

一、系统硬件设计首先需要设计温度传感器电路,并将其与单片机相连。

当传感器检测到环境温度变化时,它会发出电信号,单片机通过读取该信号可以获取环境温度数值并进行处理。

同时,还需要在单片机上连接发声器,这样就可以实现在发生温度异常时发出警报的功能。

二、程序代码设计该程序的核心代码是用C语言编写的,主要包括以下几个模块:1. 初始化模块该模块主要完成一些系统初始化工作,如设置各个端口的输入输出状态、设定系统运行模式和时钟频率等。

其中还需要初始化温度传感器,并设置它的输出精度和采样率。

2. 温度读取模块该模块主要负责读取温度传感器的数值,并进行数据处理。

具体实现方式可以采用IIC总线通信协议或SPI通信协议,通过读取传感器的寄存器值来获取环境温度。

为了保证数据的准确性,还需要对传感器读取出来的数据进行校验和处理。

该模块主要负责监控环境温度变化情况,并根据预设的阈值判断是否需要发出警报。

一般来说,当环境温度超出正常范围时,就会发出报警信号。

这里的阈值可以通过程序调整或在系统启动时由用户输入。

4. 报警模块该模块主要负责发出警报信号,以便提醒用户注意安全。

具体实现方式可以使用发声器或LED指示灯等设备。

当温度异常时,程序会自动触发该模块,并按照事先设定的方式发出相应的警报信号。

三、测试与应用系统设计完成后,需要进行系统测试和性能评估。

可以通过模拟环境温度变化情况,检验系统的灵敏度和准确性,并在实际使用时对系统进行调整和优化。

最后,该程序可以应用于各种环境温度监测场景,如家庭、办公室、实验室、医院等场所。

通过监控温度变化情况,可以及时发现问题并采取相应的措施,保证设备和人体的安全和稳定。

温度报警器单片机课程设计

温度报警器单片机课程设计

温度报警器单片机课程设计1. 引言温度报警器是一种常见的应用设备,用于监测环境温度并在温度超过设定阈值时发出警报。

本次课程设计旨在利用单片机技术,设计并实现一个基于温度传感器的温度报警器。

2. 设计要求设计一个温度报警器单片机系统,具体要求如下:1.使用单片机作为控制核心,选择合适的型号和开发工具;2.组装、连接和配置温度传感器,用于实时监测环境温度;3.设定温度阈值,当环境温度超过该阈值时,触发报警;4.报警方式可以是附带蜂鸣器发出声音、或者通过LCD显示器显示警报信息。

3. 系统设计3.1 硬件设计3.1.1 单片机选择根据需求,我们需要选择适合的单片机作为控制核心。

在此推荐使用STM32系列的单片机,如STM32F103C8T6等。

3.1.2 温度传感器选择温度传感器是用于实时监测环境温度的重要组成部分。

常用的温度传感器有LM35、DS18B20等。

3.1.3 蜂鸣器和LCD显示器选择根据报警方式的要求,我们需要选择合适的蜂鸣器和LCD显示器。

一般可选用闹钟蜂鸣器和16x2字符LCD显示器。

3.1.4 电路连接和组装根据硬件设计需求,将单片机、温度传感器、蜂鸣器和LCD显示器等组装并连接成一个完整的电路系统。

3.2 软件设计3.2.1 环境搭建在电脑上安装相应的开发工具,如Keil uVision等,并将其与单片机进行连接。

3.2.2 编写初始化代码首先,我们需要编写初始化代码,用于设置单片机的引脚和外设等。

具体包括设置温度传感器引脚、蜂鸣器引脚和LCD引脚。

3.2.3 编写温度读取代码编写代码以实时读取温度传感器的数值,并将其转换为实际温度值。

常用的温度传感器具有线性输出特性,可以利用单片机的模拟输入引脚进行读取。

3.2.4 编写报警触发代码根据设定的温度阈值,编写代码以实时监测温度数值,并在超过设定阈值时触发报警。

报警可以通过控制蜂鸣器发出声音、或者控制LCD显示器显示警报信息来实现。

基于单片机的温度控制报警系统设计

基于单片机的温度控制报警系统设计

摘要毕业设计基于单片机的温度报警系统设计学校:专业:班级;姓名:摘要近年来随着计算机与控制技术的蓬勃发展与广泛应用,人们从中受益良多,生活中也随处可见电子产品,自动化,智能化成为发展趋势,而以单片机为核心的应用正在不断地走向深入,同时带动传统控制检测的日新月益。

本设计论述了一种以STC89C51单片机为控制单元,以DS18B20为温度传感器的温度控制系统。

该控制系统可以实时存储相关的温度数据并可设置温度上下限值,实现对环境温度测量并在超出范围的情况下发出警告。

系统设计了相关的硬件电路和相关应用程序。

硬件电路主要包括STC89C51单片机最小系统,测温电路、LCD液晶显示电路以及报警电路等。

系统程序主要包括主程序,读出温度子程序,计算温度子程序、按键处理程序、LCD显示程序以及数据存储程序等。

关键词:STC89C51单片机;DS18B20;LCD显示电路AbstractIn recent years, along with the computer and control technology of booming development and wide application, people benefit a lot from it, life also can be seen everywhere electronic products, automation, intelligent become development trend, and with the single chip processor as the core application is continuously to the deepening, and push the traditional control examination on the new victims. This design is discussed in STC89C51 micro control is a control unit, with the temperature sensor DS18B20 for the temperature control system. The control system can store related temperature data real-time and set up and down temperature limits, and to realize the environment temperature measurement and beyond the scope of the warning. The system design of the related hardware circuit and related applications. The hardware circuit STC89C51 mainly includes single chip minimize system, temperature measurement circuit, LCD display circuit, alarm circuit, etc. System program mainly includes the main program, read the temperature procedure, the calculation of temperature procedure, key processing program, LCD display procedures and data storage procedures, etc.key words:STC89C51 single-chip microcomputer ; DS18B20 ; LCD display circuit1 绪论1.1 课题的背景及其意义二十一世纪是科技高速发展的信息时代,电子技术、单片机技术更是得到广泛的应用,伴随着科学技术的发展,需要对仪器设备的各种参数进行测量。

单片机设计的温度检测显示警报程序

单片机设计的温度检测显示警报程序

单片机设计的温度检测显示报警程序设备技术网时间:2010-4-14来源:电子技术网作者:1.温度传感器AD590基本知识AD590产生的电流与绝对温度成正比,它可接收的工作电压为4V-30V,检测的温度范围为-55℃-+150℃,它有非常好的线性输出性能,温度每增加1℃,其电流增加1uA。

AD590温度与电流的关系如下表所示:摄氏温度AD590电流经10KΩ电压0℃273.2 uA 2.732V10℃283.2 uA 2.832 V20℃293.2 uA 2.932 V30℃303.2 uA 3.032 V40℃313.2 uA 3.132 V50℃323.2 uA 3.232 V60℃333.2 uA 3.332 V100℃373.2 uA 3.732 V实验任务:利用AD590温度传感器完成温度的测量,把转换的温度值的模拟量送入ADC0809的其中一个通道进行A/D转换,将转换的结果进行温度值变换之后进行监控。

由于AD590的温度变化范围在-55℃-+150℃之间,经过10KΩ之后采样到的电压变化在2.182V -4.232V之间,不超过5V电压所表示的范围,因此参考电压取电源电压VCC,(实测VCC=4.70V)。

由此可计算出经过A/D转换之后的摄氏温度显示的数据为:如果(D*2350/128)<2732,则显示的温度值为-(2732-)D*2350/128)) 如果(D*2350/128)≥2732,则显示的温度值为+((D*2350/128)-2732)#include "reg52.h"//头文件#include "intrins.h"#define uchar unsigned char//宏定义#define uint unsigned int//宏定义sbit RS=P1^0;//LCD1602定义I/O的硬件接口sbit RW=P1^1;//LCD1602定义I/O的硬件接口sbit E=P1^2;//LCD1602定义I/O的硬件接口sbit key_1=P1^3;//按键1定义I/O的硬件接口////Alarm_Value;//温度报警值+1度sbit key_2=P1^4;//按键2定义I/O的硬件接口////Alarm_Value;//温度报警值-1度sbit key_3=P1^5;//按键3定义I/O的硬件接口sbit key_4=P1^6;//按键4定义I/O的硬件接口sbit AD590_2=P1^7;//A定义I/O的硬件接口,通道选择//C、D接地sbit key_6=P3^7;//按键6定义I/O的硬件接口//控制温度报警标志位//sbit ST=P3^0; //ST和ALE接在一起sbit OE=P3^1;sbit EOC=P3^2;sbit CLK=P3^3;sbit SPK=P3^4; //喇叭,蜂鸣器报警sbit LED1=P3^5; //LED报警sbit LED2=P3^6;#define DPDR P2//LCD1602并行数据输出接口定义#define DPDR_1 P0//ADC0809并行数据输入接口定义uchar temp;//最终温度值unsigned long temp2;//平均温度unsigned long temp1;//温度1,,AD590_1接IN0unsigned long temp2;//温度2,,AD590_2接IN1uchar Alarm_Value;//温度报警值bit Alarm_Value_bit;//温度报警标志位uchar code DispTab_1[]={'0','1','2','3','4','5','6','7','8','9'};//1602:0-9 数字uchar code DispTab_2[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//温度符号uchar DispBuf[6]; //6字节的显示缓冲区char char_char_1[]={" Temperature: "};//定义字符串void delay(uint z)//1ms延时{uchar x,x1;for(;z>0;z--){for(x=0;x<114;x++){for(x1=0;x1<1;x1++);}}}void write_Directive(uchar a)//写LCD指令{RS=0;RW=0;E=0;DPDR=a;delay(5);E=1;delay(5);E=0;delay(5);}void write_Data(uchar a)//写LCD数据{RS=1;RW=0;delay(5);E=0;DPDR=a;delay(5);E=1;delay(5);E=0;delay(5);}void LCD_init()//LCD初始化{ uchar i;delay(15);write_Directive(0x38);delay(5);write_Directive(0x38);write_Directive(0x38);write_Directive(0x01);write_Directive(0x02);//初始化后数据地址为0x80;即第一行,第一个位置write_Directive(0x0c);//不显示光标//write_Directive(0x0f);//显示光标write_Directive(0x80+0x00);//第一行第一位地址for(i=0;i<16;i++){write_Data(char_char_1[i]);//显示字符串" Temperature "}}void write_Data_String()//显示温度函数{uchar i;DispBuf[0]=temp/100;//显示十位temp=temp%100;DispBuf[1]=temp/10;//显示个位temp=temp%10;DispBuf[2]=temp%10;//显示小数点后一位:0.0DispBuf[0]=DispTab_1[i];//查表,取字符i=DispBuf[1];DispBuf[1]=DispTab_1[i];i=DispBuf[2];DispBuf[2]=DispTab_1[i];write_Directive(0x80+0x40);//第二行,第一个位置地址write_Data(DispBuf[0]);//第二行,第一个位置write_Data(DispBuf[1]);//第二行,第二个位置write_Data('.');//第二行,第三个位置write_Data(DispBuf[2]);//第二行,第四个位置write_Data(0x00);//第二行,第五个位置显示温度符号}void ADC0809_init()//ADC0809复位{ST=0;OE=0;SPK=1;LED1=1;TMOD=0x12;TH0=0x216;TL0=0x216;TH1=(65536-40000)/256;TL1=(65536-40000)%256;TR1=0;TR0=1;ET0=1;ET1=1;EA=1;}void t0(void) interrupt 1 using 0{CLK=~CLK;}void t1(void) interrupt 3 using 0{TH1=(65536-40000)/256;TL1=(65536-40000)%256;SPK=~SPK;LED1=~LED1;}void temp1_start()//启动温度1 转换{AD590_2=0;//通道选择ST=1;delay(1);//延时1msST=0;delay(1);//延时1msST=1;delay(1);//延时1msST=0;while(!EOC);//查询转换结束否_nop_();_nop_();OE=1;//OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。

基于单片机的温度显示报警系统设计

基于单片机的温度显示报警系统设计

基础课程设计(论文)基于单片机的温度显示报警系统设计专业:电气工程及其自动化指导教师:任守华小组成员:刘春秋(20114073143)许玖红(20114073159)王锐(20114073105)葛传宇(20114073126)刘冠兵(20114012006)信息技术学院电气工程系2011年11月16前言本文主要设计一种基于AT89S52单片机的温度显示报警系统,在此设计中主要从硬件软件两大方面来进行。

本文又分为四大设计来进行:系统整体方案,主要介绍了本设计的整体方案思想,即以单片机为核心,根据DS18B20温度传感器检测外界温度并转化为数字信号进行处理,把数据传输到显示模块,实现温度的显示,并对温度实施监测,当温度超过给定的最高温度或者低于给定的最低温度时,通过单片机处理发出报警信号;系统的硬件设计,硬件方面按照单片机最小系统电路、显示硬件电路、键盘硬件电路、温度传感器硬件电路、温度执行控制硬件电路、串行通信接口电路、温度报警电路以及给整个系统供电的开关电源电路等八个模块分别进行设计,各个模块电路通过主机电路控制,协调一致的进行工作,完成对被测物体的温度控制;系统的软件设计,软件方面按照软件模块、主程序模块、数据采集模块、中断处理模块、显示模块、报警模块和温度调节等八部分进行设计,软件的设计在很大程度上决定了测控系统的性能,为了满足系统的要求,编制软件达到易理解性、易维护性、实时性、准确性和可靠性;调试和仿真,从硬件、软件的调试到仿真,完成设计的最终要求,当温度过高或者过低时就进行报警。

作者2014年10月摘要温度控制是工业生产过程中经常遇到的过程控制,有些工艺过程对其温度的控制效果直接影响着产品的质量,因而设计一种较为理想的温度控制系统是具有不一般的价值与意义。

在现代化的工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。

因此,单片机对温度的控制问题是一个工业生产中经常会遇到的问题。

单片机温控程序

单片机温控程序

单片机温控程序单片机温控程序是一种用于控制温度的软件程序,它通过对温度传感器的读取和对加热或冷却装置的控制,实现对温度的精确调控。

下面我将以人类的视角来描述一下单片机温控程序的工作原理和应用场景。

让我们想象一下一个寒冷的冬天。

当我们进入室内时,我们希望室内的温度能够舒适,不过于寒冷也不过于炎热。

这时,单片机温控程序就能发挥作用了。

单片机温控程序中的第一步是读取室内的温度。

单片机内部有一个温度传感器,可以实时地感知到室内的温度。

通过读取传感器的数值,单片机可以获得当前的室温。

接下来,单片机将读取到的温度值与设定的目标温度进行比较。

如果当前温度高于目标温度,说明室内温度过高,需要降温。

此时,单片机会发送控制信号给加热装置,让其停止加热。

如果当前温度低于目标温度,说明室内温度过低,需要加热。

单片机会发送控制信号给加热装置,让其开始加热。

通过不断地读取温度、比较温度和发送控制信号的过程,单片机温控程序可以实现对室内温度的精确调控。

当室内温度接近目标温度时,单片机会减小控制信号的幅度,以避免温度的过度波动。

当室内温度达到目标温度时,单片机会停止发送控制信号,维持室内温度的稳定。

单片机温控程序广泛应用于各种场景。

例如,它可以用于家庭的中央空调系统,保持室内温度的舒适;它也可以用于电子设备的散热系统,防止设备过热;此外,它还可以用于实验室的恒温箱、温室的温度控制等等。

通过单片机温控程序,我们可以实现对温度的精确调控,提高室内的舒适度,同时还可以节省能源,减少对环境的影响。

无论是在家庭生活中,还是在工业生产中,单片机温控程序都发挥着重要的作用,使我们的生活更加便利和舒适。

C51单片机 温度计 C语言程序

C51单片机 温度计 C语言程序
disp_buff[0][3]=min%10;
disp_buff[0][4]=sec/10;
disp_buff[0][5]=sec%10;
//
disp_buff[1][0]=f;/*符号位*/
disp_buff[1][1]=TMP/1000;//百位
disp_buff[1][2]=TMP/100%10; /*十位*/
uchar KeyBuff;
code unsigned char Tab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,
0x78,0x00,0x10,0xbf,0xff,0xc6};
{
unsigned int i;
unsigned char j;
bit testb;
for (j=1;j<=8;j++)
ቤተ መጻሕፍቲ ባይዱ
testb = dat & 0x01;
TL0=(unsigned char)(65536-4000);
Count4ms=Count4ms+1;
if (Count4ms==250)
{
Count4ms=0;
SecFlag=1;
}
P2_buff=Tab[disp_cnt];
if (KeyDownFlg)
}
//check data
hour=CheckData(hour,24);
min=CheckData(min,60);
sec=CheckData(sec,60);

8051单片机c语言程序设计与实例解析

8051单片机c语言程序设计与实例解析

8051单片机C语言程序设计与实例解析在现代电子技术领域,单片机是一种应用十分广泛的微处理器,而在单片机的应用中,8051单片机是一种非常经典的代表。

与此C语言作为一种高级编程语言,在单片机的程序开发中也有着广泛的应用。

本文将从8051单片机C语言程序设计的角度,对其进行深度和广度兼具的解析,通过实例来帮助读者更好地理解和掌握这一技术。

1. 8051单片机概述8051单片机是由Intel公司于上世纪80年代推出的一款经典单片机,至今仍然广泛应用于各种领域。

它的特点是体积小、功能强大、接口丰富,以及使用方便等。

在实际应用中,我们可以根据不同的需求选择不同型号的8051单片机,比如常见的AT89S52、AT89C52等。

2. C语言在8051单片机中的应用C语言作为一种高级编程语言,具有结构化、模块化和可移植性等优点,因此在单片机的程序设计中有着广泛的应用。

通过C语言编程,我们可以更轻松地实现对单片机的控制和管理,而且代码的可读性也更好,易于维护和修改。

3. 程序设计与实例解析接下来,我们将结合具体的实例来说明8051单片机C语言程序设计的方法和技巧。

我们可以以LED灯的控制、数码管的显示、蜂鸣器的驱动等为例,详细讲解如何使用C语言编写程序,通过8051单片机实现相应的功能。

我们也可以讲解一些常用的库函数和编程技巧,让读者能够更好地理解和应用这些知识。

4. 个人观点与理解在我看来,8051单片机C语言程序设计是一项非常有趣和有挑战性的工作。

通过编写程序,我们可以将自己的想法转化为现实,实现各种各样的功能,这种成就感是非常有价值的。

掌握了这项技能之后,我们也能够更好地应对各种实际问题,为自己的学习和职业发展打下良好的基础。

总结回顾通过本文的阐述,我们对8051单片机C语言程序设计进行了全面的评估和解析,从基本概念到具体实例,再到个人观点和理解,希望读者能够从中受益。

通过不断地实践和学习,我们相信大家一定能够掌握这一领域的知识,成为优秀的单片机程序设计工程师。

温度报警器单片机程序

温度报警器单片机程序

#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;sbit DQ=P3^7;sbit Beep = P1^5;uchar Ds18b20Init();void Ds18b20WriteByte(uchar com); uchar Ds18b20ReadByte();void Ds18b20ChangTemp();void Ds18b20ReadTempCom();int Ds18b20ReadTemp();void delay(unsigned int i);void Lcd1602_Delay1ms(uint c);void LcdWriteCom(uchar com);void LcdWriteData(uchar dat);void LcdInit();void LcdDisplay();uchar table1[]="the temperature:";int wendu;void delay_50us(uint t);void main(){uchar j; float tp;LcdInit();LcdWriteCom(0x88+0x40);LcdWriteData('C');LcdWriteCom(0x80);for(j=0;j<16;j++)LcdWriteData(table1[j]);while(1){wendu=Ds18b20ReadTemp();{if(wendu< 0){LcdWriteCom(0x80+0x40);LcdWriteData('-');wendu=wendu-1;wendu=~wendu;tp=wendu;wendu=tp*0.0625*100+0.5;}else{LcdWriteCom(0x80+0x40);LcdWriteData('+');tp=wendu;wendu=tp*0.0625*100+0.5;} }LcdDisplay();if(wendu>=3000&wendu!=8500){Beep=0;delay(3);Beep=1;delay(3);}}}void LcdDisplay(int wendu){unsigned char datas[] = {0, 0, 0, 0, 0,0,0,0,0,0,0,};datas[0] = wendu/ 10000;datas[1] = wendu % 10000 / 1000;datas[2] = wendu % 1000 / 100;datas[3] = wendu % 100 / 10;datas[4] = wendu % 10;LcdWriteCom(0x82+0x40);LcdWriteData('0'+datas[0]);LcdWriteCom(0x83+0x40);LcdWriteData('0'+datas[1]);LcdWriteCom(0x84+0x40);LcdWriteData('0'+datas[2]);LcdWriteCom(0x85+0x40);LcdWriteData('.');LcdWriteCom(0x86+0x40);LcdWriteData('0'+datas[3]);LcdWriteCom(0x87+0x40);LcdWriteData('0'+datas[4]); }void Lcd1602_Delay1ms(uint c) {uchar a,b;for (; c>0; c--){for (b=199;b>0;b--){for(a=1;a>0;a--);}}}void LcdWriteCom(uchar com) {LCD1602_E = 0;LCD1602_RS = 0;LCD1602_RW = 0;P0 = com;Lcd1602_Delay1ms(1);LCD1602_E = 1;Lcd1602_Delay1ms(5);LCD1602_E = 0;}void LcdWriteData(uchar dat) {LCD1602_E = 0;LCD1602_RS = 1;LCD1602_RW = 0;P0 = dat;Lcd1602_Delay1ms(1);LCD1602_E = 1;Lcd1602_Delay1ms(5);LCD1602_E = 0;}void LcdInit(){Lcd1602_Delay1ms(2); LcdWriteCom(0x38);Lcd1602_Delay1ms(5); LcdWriteCom(0x38);Lcd1602_Delay1ms(5); LcdWriteCom(0x38); LcdWriteCom(0x38); LcdWriteCom(0x08); LcdWriteCom(0x01); LcdWriteCom(0x06); LcdWriteCom(0x0c);}void Delay1ms(uint y){uint x;for( ; y>0; y--){for(x=110; x>0; x--);}}uchar Ds18b20Init(){uchar i;DQ = 0;i = 70;while(i--);DQ = 1;i = 0;while(DQ){i++;if(i>5){return 0;}Delay1ms(1);}return 1;}void Ds18b20WriteByte(uchar dat) {uint i, j;for(j=0; j<8; j++){DQ = 0;i++;DQ = dat & 0x01;i=6;while(i--);DQ = 1;dat >>= 1;}}uchar Ds18b20ReadByte(){uchar byte, bi;uint i, j;for(j=8; j>0; j--){DQ = 0;i++;DQ = 1;i++;i++;bi = DQ;byte = (byte >> 1) | (bi << 7);i = 4;while(i--);}return byte;}void Ds18b20ChangTemp(){Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); //跳过ROM操作命令Ds18b20WriteByte(0x44); //温度转换命令}void Ds18b20ReadTempCom(){Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); //跳过ROM操作命令Ds18b20WriteByte(0xbe); //发送读取温度命令}int Ds18b20ReadTemp(){int temp = 0;uchar tmh, tml;Ds18b20ChangTemp(); //先写入转换命令Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令tml = Ds18b20ReadByte(); //读取温度值共16位,先读低字节tmh = Ds18b20ReadByte(); //再读高字节temp = tmh;temp <<= 8;temp |= tml;return temp;}void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}void delay(unsigned int i) {char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}。

单片机原理实验5简易温度警报系统程序

单片机原理实验5简易温度警报系统程序

1、MAIN.ASM;====变量及常数定义段====INCLUDE "VARDFN.INC";添加变量等定义模块;===============ORG 0000HLJMP MAINORG 000BHLJMP T0SER ;转T0中断服务子程序ORG 0030HMAIN: INCLUDE "INITIAL.INC";添加初始化模块MLOOP: JNB TF0,$ ;4mS到?CLR TF0 ;清定时标志MOV TH0,#0F0H ;4mS定时重设MOV TL0,#60HLCALL RDKEY ;调用读键状态及去抖处理LCALL DISP ;调用数码管动态显示DJNZ T100MS,ML0MOV T100MS,#19H ;100mS定时器载入初值CLR TR1 ;T1停止计数MOV R3,TL1 ;读计数值,T1清0MOV TL1,#00HMOV R2,TH1MOV TH1,#00HSETB TR1 ;重启计数ACALL FTEMP ;脉冲数转换为温度ML0: MOV A,STA ;根据状态值散转相应模块ANL A,#03HRL AMOV DPTR,#MTABJMP @A+DPTRMTAB: AJMP WORK0 ;转移到待机模块AJMP WORK1 ;转移到赋值模块AJMP WORK2 ;转移到查询模块AJMP WORK0 ;冗余;====待机模块====WORK0: MOV R0,#TEMP0 ;温度送显缓ACALL DSBUDTMOV DSB4,#01H ;LD1亮JB ESW2,WK01JB ESW1,WK02SJMP WK03WK01: MOV STA,#01H;下次主循环WORK1模块SJMP WK03WK02: MOV STA,#02H;下次主循环WORK2模块WK03: AJMP MLOOP;====赋值模块====WORK1: MOV R0,#SNUM0 ;数据2送显缓ACALL DSBUDTMOV DSB4,#02H ;LD2亮JNB ESW2,WK11MOV STA,#00H ;下次主循环WORK0SJMP WK13WK11: CLR A ;查询"0"键JB EK0,WK12INC A ;查询"1"键JB EK1,WK12INC AJB EK2,WK12INC AJB EK3,WK12INC AJB EK4,WK12INC AJB EK5,WK12INC AJB EK6,WK12INC AJB EK7,WK12INC AJB EK8,WK12INC A ;查询"9"键JNB EK9,WK13WK12: XCH A,SNUM1 ;键值从数据2的右边移入,高2位不变SWAP AANL A,#0F0HORL SNUM1,AWK13: AJMP MLOOP;====报警模块====WORK2: MOV A,SNUM1 ;组合数据并送显缓MOV TEMP0,AMOV R0,#TEMP0ACALL DSBUDTMOV TEMP0,#00HMOV DSB4,#04H ;LD3亮CLR CMOV A,TEMP1SUBB A,SNUM1JC WK21SETB LD8WK21: JNB ESW1,WK22 ;有SW1键?MOV STA,#00H ;下次主循环返回WORK0模块WK22: AJMP MLOOP;====其它非通用子程序====DSBUDT: MOV A,@R0ANL A,#0FHMOV DSB2,AMOV A,@R0ANL A,#0F0HSWAP AMOV DSB3,AINC R0MOV A,@R0ANL A,#0FHMOV DSB0,AMOV A,@R0ANL A,#0F0HSWAP AMOV DSB1,ARET;====T0中断服务子程序====T0SER: RETI;====通用子程序段====INCLUDE "RDKEY.INC";添加读键状态及去抖处理子程序INCLUDE "DISP.INC" ;添加数码管动态扫描显示子程序INCLUDE "FTEMP.INC";脉冲计数值转换温度值子程序END2、V ARDFN.INC;====变量定义段====CS0 BIT P2.0 ;个位位选CS1 BIT P2.1 ;十位位选CS2 BIT P2.2 ;百位位选CS3 BIT P2.3 ;千位位选CS4 BIT P2.4 ;LED灯位选ROW0 BIT P2.5 ;K0~3键列选择ROW1 BIT P2.6 ;K4~7键列选择ROW2 BIT P2.7 ;K8~11键列选择DSW EQU 30H ;位选计数DSB0 EQU 31H ;显示缓冲单元个位DSB1 EQU 32H ;显示缓冲单元十位DSB2 EQU 33H ;显示缓冲单元百位DSB3 EQU 34H ;显示缓冲单元千位DSB4 EQU 20H ;显示缓冲单元指示灯状态LD1 BIT DSB4.0 ;指示灯LD1控制位LD2 BIT DSB4.1 ;指示灯LD2控制位LD3 BIT DSB4.2 ;指示灯LD3控制位LD4 BIT DSB4.3 ;指示灯LD4控制位LD5 BIT DSB4.4 ;指示灯LD5控制位LD6 BIT DSB4.5 ;指示灯LD6控制位LD7 BIT DSB4.6 ;指示灯LD7控制位LD8 BIT DSB4.7 ;指示灯LD8控制位KEY1 EQU 21H ;键状态字KEY2 EQU 22HK0 BIT KEY1.0 ;K0键K1 BIT KEY1.1 ;K1键K2 BIT KEY1.2 ;K2键K3 BIT KEY1.3 ;K3键K4 BIT KEY1.4 ;K4键K5 BIT KEY1.5 ;K5键K6 BIT KEY1.6 ;K6键K7 BIT KEY1.7 ;K7键K8 BIT KEY2.0 ;K8键K9 BIT KEY2.1 ;K9键K10 BIT KEY2.2 ;K10键K11 BIT KEY2.3 ;K11键SW1 BIT KEY2.6 ;SW1键SW2 BIT KEY2.7 ;SW2键EKEY1 EQU 23H ;键前沿字EKEY2 EQU 24HEK0 BIT EKEY1.0 ;K0键前沿EK1 BIT EKEY1.1 ;K1键前沿EK2 BIT EKEY1.2 ;K2键前沿EK3 BIT EKEY1.3 ;K3键前沿EK4 BIT EKEY1.4 ;K4键前沿EK5 BIT EKEY1.5 ;K5键前沿EK6 BIT EKEY1.6 ;K6键前沿EK7 BIT EKEY1.7 ;K7键前沿EK8 BIT EKEY2.0 ;K8键前沿EK9 BIT EKEY2.1 ;K9键前沿EK10BIT EKEY2.2 ;K10键前沿EK11 B IT EKEY2.3 ;K11键前沿ESW1 BIT EKEY2.6 ;SW1键前沿ESW2 BIT EKEY2.7 ;SW2键前沿KTMR EQU 35H ;键去抖延时器STA EQU 36H ;模块状态值SNUM0 EQU 37H ;数据2(双字节压缩BCD码) SNUM1 EQU 38HTEMP0 EQU 39HTEMP1 EQU 3AH ;温度存储单元T100MS EQU 3BH ;100mS计时;====常数定义段====;==================3、INITIAL.INCMOV SP,#5FHMOV R0,#20H ;20H-7FH清零MOV R7,#60HCLR AM01: MOV @R0,AINC R0DJNZ R7,M01MOV SBUF,#0FFHMOV DSB0,#02H ;显缓="8952"MOV DSB1,#05HMOV DSB2,#09HMOV DSB3,#08HMOV TMOD,#51H ;方式1定时MOV TH0,#0F0H ;4mS定时MOV TL0,#60HMOV DSB4,#0FFH ;指示灯全亮SETB TR0SETB TR1MOV R7,#0FAH ;显示"8952"1秒M02: JNB TF0,M02 ;4mS到?CLR TF0MOV TH0,#0F0HMOV TL0,#60HLCALL DISPDJNZ R7,M02MOV T100MS,#19H ;100mS定时器载入初值4、RDKEY.INC;====读矩阵、独立按键子程序(延时去抖)====RDKEY: ORL P2,#0FFH ;关闭LED数码显示器CLR ROW0 ;ROW0=0,读K0~3键NOP ;延时,键盘线越长延时越长NOPMOV A,P2ANL A,#0FH ;K0~3键位保留XRL A,#0FH ;求反转正逻辑MOV R6,A ;新的键状态暂存R6ORL P2,#0FFHCLR ROW1 ;ROW1=0,读K4~7键NOPNOPMOV A,P2ANL A,#0FHXRL A,#0FHSWAP AADD A,R6MOV R6,A ;新的键状态暂存R6ORL P2,#0FFHCLR ROW2 ;ROW2=0,读K8~11键NOPNOPMOV A,P2ANL A,#0FHXRL A,#0FHMOV R7,A ;新的键状态暂存R7ORL P2,#0FFH ;关闭矩阵键盘ORL P1,#0C0HMOV A,P1 ;读独立按键ANL A,#0C0H ;接独立键盘的位保留XRL A,#0C0H ;求反转正逻辑ADD A,R7MOV R7,ACJNE A,KEY2,RDK0 ;键状态变化则转移MOV A,R6CJNE A,KEY1,RDK0MOV KTMR,#05H ;去抖延时器加载初值SJMP RDK1RDK0: MOV A,KTMR ;过了延时时间?JZ RDK1DEC KTMR ;延时未结束MOV R6,KEY1 ;放弃不稳定的键状态MOV R7,KEY2RDK1: MOV A,KEY1 ;键前沿提取XRL A,R6ANL A,R6MOV EKEY1,AMOV A,KEY2XRL A,R7ANL A,R7MOV EKEY2,AMOV KEY1,R6 ;启用键的新状态MOV KEY2,R7RET5、DISP.INC====5位数码管扫描子程序====DISP: ORL P2,#1FH ;关闭数码显示器MOV A,DSW ;根据扫描循环变量转移ANL A,#07HRL AMOV DPTR,#DSTABJMP @A+DPTRDSTAB: AJMP DIS0AJMP DIS1AJMP DIS2AJMP DIS3AJMP DIS4AJMP DIS0AJMP DIS0AJMP DIS0DIS0: MOV A,DSB0 ;扫描个位数码管ANL A,#0FHMOV DPTR,#LED7 ;查显缓个位值的七段码表MOVC A,@A+DPTRMOV P0,A ;七段码送P0口CLR CS0 ;点亮个位数码管MOV DSW,#01H ;扫描指针指向下十位RETDIS1: MOV A,DSB1 ;扫描十位数码管ANL A,#0FHMOV DPTR,#LED7MOVC A,@A+DPTRMOV P0,ACLR CS1MOV DSW,#02HRETDIS2: MOV A,DSB2 ;扫描百位数码管ANL A,#0FHMOV DPTR,#LED7MOVC A,@A+DPTRMOV P0,ACLR CS2MOV DSW,#03HRETDIS3: MOV A,DSB3 ;扫描千位数码管ANL A,#0FHMOV DPTR,#LED7MOVC A,@A+DPTRMOV P0,ACLR CS3MOV DSW,#04HRETDIS4: MOV A,DSB4 ;扫描指示灯CPL AMOV P0,ACLR CS4MOV DSW,#00HRET;====LED段码表====LED7: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8HDB80H,90H,88H,83H,86H,0A1H,86H,8EH6、FTEMP.INC;====脉冲计数值查表转换为温度====;入口条件<R2:R3>=当前脉冲计数值;出口<TEMP0:TEMP1>=温度值(压缩BCD码);使用R2~R7,ACC,PSW,B,DPTRFTEMP: CLR AMOV TEMP1,AMOV R6,AMOV R7,AMOV DPTR,#TTABFTP0: MOV A,TEMP1 ;读某温度脉冲数RL AMOVC A,@A+DPTRMOV R4,AMOV A,TEMP1RL AINC AMOVC A,@A+DPTRMOV R5,ACLR C ;<R4:R5>=当前脉冲数-某温度脉冲数MOV A,R3SUBB A,R5MOV R5,AMOV A,R2SUBB A,R4MOV R4,AJC FTP2 ;"当前脉冲数<某温度脉冲数"则转移MOVA,R5 ;<R6:R7>=<R4:R5>MOV R7,AMOV A,R4MOV R6,AMOV A,TEMP1CJNE A,#99,FTP1SJMP FTP3FTP1: INC TEMP1SJMP FTP0FTP2: MOV A,R5ADD A,R7MOV A,R4ADDC A,R6JC FTP3MOV A,TEMP1JZ FTP3DEC TEMP1FTP3: MOV A,TEMP1 ;温度值转换为压缩BCD码MOV B,#10DIV ABSWAP AADD A,BMOV TEMP1,ARETTTAB: DW213,224,235,246,258,270,283,296,310,324DW339,354,370,387,404,421,439,458,477,497DW518,539,561,583,606,630,654,680,705,731DW758,786,814,843,873,903,934,965,997,103DW1063,1097,1131,1166,1202,1238,1274,1311,1348,1386DW1424,1463,1502,1542,1581,1621,1662,1702,1743,1784DW1825,1867,1908,1950,1991,2033,2075,2116,2158,2200DW2241,2283,2324,2365,2406,2447,2487,2527,2567,2607DW2646,2686,2724,2763,2801,2838,2876,2913,2949,2985DW3020,3056,3090,3124,3158,3191,3224,3256,3288,3319。

基于AT89C51单片机温度报警系统设计与制作.

基于AT89C51单片机温度报警系统设计与制作.

一、摘要我们介绍的是一种基于单片机控制的数字温度报警,本温度系统具有多功能性,即可以当数字温度计使用,显示当前环境温度,又可以作为报警器使用,设置报警温度,当温度不在设置范围内时,可以报警,并采取措施使温度下降。

该温度报警系统控制器使用单片机AT89C51,测温传感器使DS18B20,用2位共阳极LED数码管,实现温度显示,能准确达到以上要求。

二、设计方案1、方案一由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。

2、方案二进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。

从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。

温度报警系统电路设计总体设计方框图如图1所示1、单片机主板电路单片机AT89C51具有低电压供电和体积小等特点,该模块包括中央处理CPU -AT89C51、时钟电路及复位电路;图2复位电路图3 时钟电路2、DS18B20温度传感器与单片机的接口电路DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

DS18B20是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。

该电路完成了信号的采集、转换和传输。

图43、上下限报警调整电路分别调整温度的上下限报警设置,有“+“、”“-”、“确定”等键图5上下限报警调整电路4、温度显示电路显示当前测得的温度,数码管采用74LS247驱动图6温度显示电路5、报警电路当环境温度超过设定温度时,蜂鸣器鸣叫,红灯点亮,发生报警;当人员发现警报时,可按图8中的按钮,暂时中断蜂鸣器的鸣叫。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.1602液晶显示程序#include "lcd1602.h"uchar digit[] = "0123456789"; //使用数据的数组;/*****************************以下是对液晶的操作,分为测忙,写状态,写地址和写数据这几步******************************/bit LCD_BusyTest(void){bit result;RS=0;RW=1;EN=1;_nop_();_nop_();result=BF;EN=0;return result;}void LCD_WriteInstruction(uchar dat){while(LCD_BusyTest());RS=0;RW=0;EN=0;_nop_();_nop_();DA TA_PORT=dat;_nop_();_nop_();EN=1;_nop_();_nop_();EN=0;}void LCD_WriteAddress(uchar x){LCD_WriteInstruction(x|0x80);}void LCD_WriteDatas(uchar dat){while(LCD_BusyTest());RS=1;RW=0;EN=0;_nop_();_nop_();DA TA_PORT=dat;_nop_();_nop_();EN=1;_nop_();_nop_();EN=0;_nop_();}void LCD_Init(void){Delay_ms(15);LCD_WriteInstruction(0x38);Delay_ms(5);LCD_WriteInstruction(0x38);Delay_ms(5);LCD_WriteInstruction(0x38);Delay_ms(5);LCD_WriteInstruction(0x0c);Delay_ms(5);LCD_WriteInstruction(0x06);Delay_ms(5);LCD_WriteInstruction(0x01);Delay_ms(5);}void Display_NowTemp(uchar addr,uint dat ) //在指定位置显示出温度数据,需要占领14位空间大小;{uchar n[4] = {0,0,0,0}; //温度数据的缓冲变量;n[0] = dat/1000;n[1] = dat%1000/100;n[2] = dat%100/10;n[3] = dat%10;LCD_WriteAddress(addr); //写入地址数据;LCD_WriteDatas('W'); //显示"WEN DU:"LCD_WriteDatas('E');LCD_WriteDatas('N');LCD_WriteDatas(' ');LCD_WriteDatas('D');LCD_WriteDatas('U');LCD_WriteDatas(':');LCD_WriteDatas(digit[n[0]]); //显示十位;LCD_WriteDatas(digit[n[1]]); //显示个位;LCD_WriteDatas('.'); //显示小数点;LCD_WriteDatas(digit[n[2]]); //显示小数点第一位;LCD_WriteDatas(digit[n[3]]); //显示小数点第二位;LCD_WriteDatas(0XDF); //显示°;LCD_WriteDatas('C'); //显示C;Delay_ms(1);}2.DS18B20驱动程序#include "ds18b20.h"/****************************************************************函数名称:bit DS18B20_Reset(void)函数功能:复位DS18B20,为DS1820产生一个复位信号,为对其操作做好准备; 输入参数:无输出参数:复位状态,返回0成功;返回1失败;****************************************************************/bit DS18B20_Reset(void){uchar x = 0;uchar i = 0;DataPortDS1820NO0 =1;DataPortDS1820NO0 =0;for(i=0;i<10;i++){_nop_();_nop_();_nop_();_nop_();_nop_();//1_nop_();_nop_();_nop_();_nop_();_nop_();//2_nop_();_nop_();_nop_();_nop_();_nop_();//3_nop_();_nop_();_nop_();_nop_();_nop_();//4_nop_();_nop_();_nop_();_nop_();_nop_();//5_nop_();_nop_();_nop_();_nop_();_nop_();//6_nop_();_nop_();_nop_();_nop_();_nop_();//7_nop_();_nop_();_nop_();_nop_();_nop_();//8_nop_();_nop_();_nop_();_nop_();_nop_();//9_nop_();_nop_();_nop_();_nop_();_nop_();//10} //送给DS18B20一个复位脉冲信号,保证480us,本次使用580us,keil仿真测量;DataPortDS1820NO0 =1;_nop_();_nop_();_nop_();_nop_();_nop_();//1_nop_();_nop_();_nop_();_nop_();_nop_();//2_nop_();_nop_();_nop_();_nop_();_nop_();//3_nop_();_nop_();_nop_();_nop_();_nop_();//4_nop_();_nop_();_nop_();_nop_();_nop_();//5_nop_();_nop_();_nop_();_nop_();_nop_();//6_nop_();_nop_();_nop_();_nop_();_nop_();//7_nop_();_nop_();_nop_();_nop_();_nop_();//8//总线拉高,维持15~60us;本次使用40usx=DataPortDS1820NO0; //复位成功while(!DataPortDS1820NO0); //等待复位脉冲的结束;return x; //0:成功;1:复位失败; }/****************************************************************函数名称:uchar DS18B20_ReadSlot(void)函数功能:从DS18B20读取一个时间片的数据;读取一个位;输入参数:无输出参数:读取的时间片的值;****************************************************************/uchar DS18B20_ReadSlot(void){uchar bdat = 0;DataPortDS1820NO0 = 1; //将数据线拉为高电平;_nop_();_nop_();//_nop_();_nop_(); //两次读取数据时间大于1us;DataPortDS1820NO0 = 0; //开始一个读时间片;_nop_();_nop_();//_nop_();_nop_(); //两次读取时间持续1us以上;DataPortDS1820NO0 = 1; //开始读取数据线状态;单片机输入状态;_nop_();_nop_();_nop_();_nop_(); //两次读取数据时间大于1us;_nop_();_nop_();_nop_();_nop_(); //两次读取数据时间大于1us;bdat = DataPortDS1820NO0;_nop_();_nop_();_nop_();_nop_();_nop_();//1_nop_();_nop_();_nop_();_nop_();_nop_();//2_nop_();_nop_();_nop_();_nop_();_nop_();//3_nop_();_nop_();_nop_();_nop_();_nop_();//4_nop_();_nop_();_nop_();_nop_();_nop_();//5_nop_();_nop_();_nop_();_nop_();_nop_();//6_nop_();_nop_();_nop_();_nop_();_nop_();//7_nop_();_nop_();_nop_();_nop_();_nop_();//8//_nop_();_nop_();_nop_();_nop_();_nop_();//9return bdat;}/****************************************************************函数名称:void DS18B20_WriteSlot(uchar bdat)函数功能:向DS18B20写一个时间片的数据;写一个位;输入参数:需要向DS18B20写的数据位;输出参数:无****************************************************************/void DS18B20_WriteSlot(uchar bdat){DataPortDS1820NO0 = 1; //将数据线拉为高电平;_nop_();_nop_();//_nop_();_nop_(); //两次写数据时间大于1us;DataPortDS1820NO0 = 0; //开始一个写时间片;_nop_();_nop_();//_nop_();_nop_(); //两次写数据时间持续1us以上;DataPortDS1820NO0 = bdat; //开始写数据线状态;单片机输入状态;_nop_();_nop_();_nop_();_nop_();_nop_();//1_nop_();_nop_();_nop_();_nop_();_nop_();//2_nop_();_nop_();_nop_();_nop_();_nop_();//3_nop_();_nop_();_nop_();_nop_();_nop_();//4_nop_();_nop_();_nop_();_nop_();_nop_();//5_nop_();_nop_();_nop_();_nop_();_nop_();//6_nop_();_nop_();_nop_();_nop_();_nop_();//7_nop_();_nop_();_nop_();_nop_();_nop_();//8_nop_();_nop_();_nop_();_nop_();_nop_();//9_nop_();_nop_();_nop_();_nop_();_nop_();//10_nop_();_nop_();_nop_();_nop_();_nop_();//11//_nop_();_nop_();_nop_();_nop_();_nop_();//12DataPortDS1820NO0 = 1;}/**************************************************************** 函数名称:void DS18B20_WriteOneByte(uchar dat)函数功能:向DS18B20写一个一个字节的数据;输入参数:需要向DS18B20写的数据字节;输出参数:无****************************************************************/ void DS18B20_WriteOneByte(uchar dat){uchar i=0;for(i=0;i<8;i++){DS18B20_WriteSlot(dat & (1<<i));}}/**************************************************************** 函数名称:uchar DS18B20_ReadOneByte(void)函数功能:从DS18B20读取一个字节的数据;输入参数:无输出参数:读取的数据字节的值;****************************************************************/ uchar DS18B20_ReadOneByte(void){uchar i=0;uchar dat=0;for (i=0;i<8;i++){dat |= (DS18B20_ReadSlot()<<i); //低位开始;}return dat;}/**************************************************************** 函数名称:void DS18B20_SetPrecision(uchar dat)函数功能:设置DS18B20的精度为9,10,11,12精度;输入参数:dat:(0:9位精度;1:10位精度;2:11位精度;3:12位精度;) 输出参数:无****************************************************************/ void DS18B20_SetPrecision(uchar dat){uchar i = 0;i = 0;while(DS18B20_Reset()){if(i>8){break;}} //等待复位成功;DS18B20_WriteOneByte(0X4E); //写暂存器指令;DS18B20_WriteOneByte(0XFF); //写高位数据;DS18B20_WriteOneByte(0XFF); //写低位数据;DS18B20_WriteOneByte((0X1F&(dat<<5))); //0:9; 1:10; 2:11; 3:12;}/****************************************************************函数名称:long DS18B22_GetTempValue(void)函数功能:读取DS18B22的温度数据值;输入参数:无输出参数:返回的测量温度值,将实际数据值放大了1000倍;****************************************************************/long DS18B20_GetTempValue(void){long t = 0;uchar i = 0;i = 0;while(DS18B20_Reset()){i++;if(i>8){break;}} //等待复位成功;DS18B20_WriteOneByte(0xCC); //跳过ROM指令;DS18B20_WriteOneByte(0x44); //开始温度转换;Delay_ms(200);while(!DS18B20_ReadSlot());//等待温度转化结束.判断忙碌;防止85现象;i = 0;while(DS18B20_Reset()){i++;if(i>8)break;}}DS18B20_WriteOneByte(0xCC); //跳过ROMDS18B20_WriteOneByte(0xBE); //读取暂存器指令;t = DS18B20_ReadOneByte(); //读取温度低八位数据;t |= ((uint)(DS18B20_ReadOneByte())<<8); //数据转换;return t*625; //放大10000倍的数据;}///////////////////////////////////////////////////////////////////////////////////////////////////////3.延时程序#include "delay.h"/********************************************************************** 函数名称:void Delay_100us(uint N)函数功能:实现输入多少us的延时;输入参数:输入参数范围0~65535;输出参数:无***********************************************************************/ void Delay_100us(void) //延时函数{_nop_();_nop_();_nop_();_nop_();_nop_(); //1_nop_();_nop_();_nop_();_nop_();_nop_(); //2_nop_();_nop_();_nop_();_nop_();_nop_(); //3_nop_();_nop_();_nop_();_nop_();_nop_(); //4_nop_();_nop_();_nop_();_nop_();_nop_(); //5_nop_();_nop_();_nop_();_nop_();_nop_(); //6_nop_();_nop_();_nop_();_nop_();_nop_(); //7_nop_();_nop_();_nop_();_nop_();_nop_(); //8_nop_();_nop_();_nop_();_nop_();_nop_(); //9_nop_();_nop_();_nop_();_nop_();_nop_(); //10_nop_();_nop_();_nop_();_nop_();_nop_(); //11_nop_();_nop_();_nop_();_nop_();_nop_(); //12_nop_();_nop_();_nop_();_nop_();_nop_(); //13_nop_();_nop_();_nop_();_nop_();_nop_(); //14_nop_();_nop_();_nop_();_nop_();_nop_(); //15_nop_();_nop_();_nop_();_nop_();_nop_(); //16_nop_();_nop_();_nop_();_nop_();_nop_(); //17_nop_();_nop_();_nop_();//_nop_();_nop_(); //18//_nop_();_nop_();_nop_();_nop_();_nop_(); //19//_nop_();_nop_();_nop_();_nop_();_nop_(); //20}/********************************************************************** 函数名称:void Delay_ms(uint N)函数功能:实现输入多少ms的延时;输入参数:输入参数范围0~6553;输出参数:无***********************************************************************/ void Delay_ms(uint N){uchar i = 0;while(N--){for(i=9;i>0;i--){Delay_100us();}}}4.51程序$NOMOD51;------------------------------------------------------------------------------; This file is part of the C51 Compiler package; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.; Version 8.01;; *** <<< Use Configuration Wizard in Context Menu >>> ***;------------------------------------------------------------------------------; STARTUP.A51: This code is executed after processor reset.;; To translate this file use A51 with the following invocation:;; A51 STARTUP.A51;; To link the modified STARTUP.OBJ file to your application use the following; Lx51 invocation:;; Lx51 your object file list, STARTUP.OBJ controls;;------------------------------------------------------------------------------;; User-defined <h> Power-On Initialization of Memory;; With the following EQU statements the initialization of memory; at processor reset can be defined:;; <o> IDATALEN: IDATA memory size <0x0-0x100>; <i> Note: The absolute start-address of IDATA memory is always 0; <i> The IDATA space overlaps physically the DATA and BIT areas. IDATALEN EQU 80H;; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>; <i> The absolute start address of XDA TA memoryXDATASTART EQU 0;; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>; <i> The length of XDATA memory in bytes.XDATALEN EQU 0;; <o> PDATASTART: PDA TA memory start address <0x0-0xFFFF>; <i> The absolute start address of PDATA memoryPDATASTART EQU 0H;; <o> PDATALEN: PDATA memory size <0x0-0xFF>; <i> The length of PDATA memory in bytes.PDATALEN EQU 0H;;</h>;------------------------------------------------------------------------------;;<h> Reentrant Stack Initialization;; The following EQU statements define the stack pointer for reentrant; functions and initialized it:;; <h> Stack Space for reentrant functions in the SMALL model.; <q> IBPSTACK: Enable SMALL model reentrant stack; <i> Stack space for reentrant functions in the SMALL model. IBPSTACK EQU 0 ; set to 1 if small reentrant is used.; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>; <i> Set the top of the stack to the highest location.IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1; </h>;; <h> Stack Space for reentrant functions in the LARGE model.; <q> XBPSTACK: Enable LARGE model reentrant stack; <i> Stack space for reentrant functions in the LARGE model.XBPSTACK EQU 0 ; set to 1 if large reentrant is used.; <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>; <i> Set the top of the stack to the highest location.XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1; </h>;; <h> Stack Space for reentrant functions in the COMPACT model.; <q> PBPSTACK: Enable COMPACT model reentrant stack; <i> Stack space for reentrant functions in the COMPACT model. PBPSTACK EQU 0 ; set to 1 if compact reentrant is used. ;; <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF> ; <i> Set the top of the stack to the highest location.PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1; </h>;</h>;------------------------------------------------------------------------------;; Memory Page for Using the Compact Model with 64 KByte xdata RAM; <e>Compact Model Page Definition;; <i>Define the XDATA page used for PDATA variables.; <i>PPAGE must conform with the PPAGE set in the linker invocation.;; Enable pdata memory page initalizationPPAGEENABLE EQU 0 ; set to 1 if pdata object are used.;; <o> PPAGE number <0x0-0xFF>; <i> uppermost 256-byte address of the page used for PDA TA variables.PPAGE EQU 0;; <o> SFR address which supplies uppermost address byte <0x0-0xFF>; <i> most 8051 variants use P2 as uppermost address bytePPAGE_SFR DA TA 0A0H;; </e>;------------------------------------------------------------------------------; Standard SFR SymbolsACC DATA 0E0HB DATA 0F0HSP DATA 81HDPL DATA 82HDPH DATA 83HNAME ?C_STARTUP?C_C51STARTUP SEGMENT CODE?STACK SEGMENT IDATARSEG ?STACKDS 1EXTRN CODE (?C_START)PUBLIC ?C_STARTUPCSEG AT 0?C_STARTUP: LJMP STARTUP1RSEG ?C_C51STARTUP STARTUP1:IF IDATALEN <> 0MOV R0,#IDA TALEN - 1CLR AIDATALOOP: MOV @R0,ADJNZ R0,IDATALOOPENDIFIF XDA TALEN <> 0MOV DPTR,#XDATASTARTMOV R7,#LOW (XDATALEN)IF (LOW (XDATALEN)) <> 0MOV R6,#(HIGH (XDATALEN)) +1 ELSEMOV R6,#HIGH (XDA TALEN) ENDIFCLR AXDATALOOP: MOVX @DPTR,AINC DPTRDJNZ R7,XDATALOOPDJNZ R6,XDATALOOPENDIFIF PPAGEENABLE <> 0MOV PPAGE_SFR,#PPAGEIF PDA TALEN <> 0MOV R0,#LOW (PDA TASTART)MOV R7,#LOW (PDA TALEN)CLR APDATALOOP: MOVX @R0,AINC R0DJNZ R7,PDA TALOOPENDIFIF IBPSTACK <> 0EXTRN DATA (?C_IBP)MOV ?C_IBP,#LOW IBPSTACKTOPENDIFIF XBPSTACK <> 0EXTRN DATA (?C_XBP)MOV ?C_XBP,#HIGH XBPSTACKTOPMOV ?C_XBP+1,#LOW XBPSTACKTOPENDIFIF PBPSTACK <> 0EXTRN DATA (?C_PBP)MOV ?C_PBP,#LOW PBPSTACKTOPENDIFMOV SP,#?STACK-1; This code is required if you use L51_BANK.A51 with Banking Mode 4;<h> Code Banking; <q> Select Bank 0 for L51_BANK.A51 Mode 4#if 0; <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.EXTRN CODE (?B_SWITCH0)CALL ?B_SWITCH0 ; init bank mechanism to code bank 0#endif;</h>LJMP ?C_STARTEND#include "lcd1602.h"#include "delay.h"#include "ds18b20.h"sbit key1 = P1^4;sbit key2 = P1^5;sbit key3 = P1^6;sbit key4 = P1^7;sbit qq = P3^7;sbit jidianqi = P3^6;/********************************************/uchar quit = 0 ;uchar key2_i = 0 ;void main(void){uint temp = 0;uchar max = 50 , min= 40 ;uchar Min_ge = 0 , Min_shi = 4, Max_ge = 0, Max_shi = 5;jidianqi = 1;LCD_Init(); //液晶初始化;Delay_ms(100); //液晶初始化延时; // Display_NowTemp(0X00,1234);DS18B20_SetPrecision(0); //12位LCD_WriteAddress(0x40); //写入地址数据;LCD_WriteDatas('M');LCD_WriteAddress(0x41); //写入地址数据;LCD_WriteDatas('a');LCD_WriteAddress(0x42); //写入地址数据;LCD_WriteDatas('x');LCD_WriteAddress(0x43); //写入地址数据;LCD_WriteDatas(':');LCD_WriteAddress(0x45); //写入地址数据;LCD_WriteDatas( 0x30 + 5 );LCD_WriteAddress(0x46); //写入地址数据;LCD_WriteDatas( 0x30 + 0 );LCD_WriteAddress(0x48); //写入地址数据;LCD_WriteDatas('M');LCD_WriteAddress(0x49); //写入地址数据;LCD_WriteDatas('i');LCD_WriteAddress(0x4a); //写入地址数据;LCD_WriteDatas('n');LCD_WriteAddress(0x4b); //写入地址数据;LCD_WriteDatas(':');LCD_WriteAddress(0x4d); //写入地址数据;LCD_WriteDatas( 0x30 + 4 );LCD_WriteAddress(0x4e); //写入地址数据;LCD_WriteDatas( 0x30 + 0 );while(1){temp = DS18B20_GetTempValue()/100;Display_NowTemp(0X00,temp);if( key1 == 0 ){Delay_ms(5);if( key1 == 0 ) // 设置模式{LCD_WriteInstruction( 0x0f ); // 开启光标LCD_WriteAddress( 0x45 ); // 位置为Max_shiwhile( quit == 0 ){if( key2 == 0 ){Delay_ms(5);if( key2 == 0 ){key2_i++;if( key2_i == 1 )LCD_WriteAddress( 0x46 );// 位置为Max_geif( key2_i == 2 )LCD_WriteAddress( 0x4d );// 位置为Min_shiif( key2_i == 3 )LCD_WriteAddress( 0x4e );// 位置为Min_shiif( key2_i == 4 ){key2_i = 0;LCD_WriteAddress( 0x45 );// 位置为Max_shi}while( key2 == 0 );}}if( key3 == 0 ){Delay_ms(5);if( key3 == 0 ){uchar shu;if( key2_i ==0 )// Max_shi位置加数{if( Max_shi + 1< 10 )shu = 0x30 + Max_shi + 1 ;elseshu = 0x30 + Max_shi + 1 - 10;LCD_WriteDatas( shu );// 位置为Max_shiLCD_WriteAddress( 0x45 );// 保持原位Max_shi = shu - 0x30;}if( key2_i ==1 )// Max_shi位置加数{if( Max_ge + 1 < 10 )shu = 0x30 + Max_ge + 1;elseshu = 0x30 + Max_ge + 1 - 10;LCD_WriteDatas( shu );// 位置为Max_shiLCD_WriteAddress( 0x46 );// 保持原位Max_ge = shu - 0x30;}if( key2_i ==2 )// Max_shi位置加数{if( Min_shi + 1 < 10 )shu = 0x30 + Min_shi + 1;elseshu = 0x30 + Min_shi + 1 - 10;LCD_WriteDatas( shu );// 位置为Max_shiLCD_WriteAddress( 0x4d );// 保持原位Min_shi = shu - 0x30;}if( key2_i ==3 )// Max_shi位置加数{if( Min_ge + 1 < 10 )shu = 0x30 + Min_ge + 1;elseshu = 0x30 + Min_ge + 1 - 10;LCD_WriteDatas( shu );// 位置为Max_shiLCD_WriteAddress( 0x4e );// 保持原位Min_ge = shu - 0x30;}while( key3 == 0 );}}if( key4 == 0 ){Delay_ms(5);if( key4 == 0 ){quit = 1;}while( key4 == 0 );}}}}LCD_WriteInstruction(0x0c) ; //开显示,关光标quit = 0 ;key2_i = 0;if( (Max_shi*10 + Max_ge - 1 ) < temp/100 ){qq = 1;Delay_ms(2000);qq = 0;Delay_ms(2000);}elseqq = 0;if( (Min_shi*10 + Min_ge - 1 ) > temp/100){jidianqi = 0;}elsejidianqi = 1;}}。

相关文档
最新文档