【51单片机】温度传感器DS18B20程序 LCD1602显示

【51单片机】温度传感器DS18B20程序 LCD1602显示
【51单片机】温度传感器DS18B20程序 LCD1602显示

仿真截图:

//仿真文件网盘地址:https://www.360docs.net/doc/73777618.html,/s/1qW8sGQK

//程序:

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit P00 = P0^0;

sbit P01 = P0^1;

sbit P02 = P0^2;

sbit P03 = P0^3;

sbit P04 = P0^4;

sbit P05 = P0^5;

sbit P06 = P0^6;

sbit P07 = P0^7;

sbit P10 = P1^0;

sbit P11 = P1^1;

sbit P12 = P1^2;

sbit P13 = P1^3;

sbit P14 = P1^4;

sbit P15 = P1^5;

sbit P16 = P1^6;

sbit P17 = P1^7;

sbit P20 = P2^0;

sbit P21 = P2^1;

sbit P22 = P2^2;

sbit P23 = P2^3;

sbit P24 = P2^4;

sbit P25 = P2^5;

sbit P26 = P2^6;

sbit P27 = P2^7;

sbit P30 = P3^0;

sbit P31 = P3^1;

sbit P32 = P3^2;

sbit P33 = P3^3;

sbit P34 = P3^4;

sbit P35 = P3^5;

sbit P36 = P3^6;

sbit P37 = P3^7;

//****** DS18B20 ******

#define DQ P17

/*************精确延时函数*****************/ void delay10us(void) //误差0us

{

unsigned char a,b;

for(b=1;b>0;b--)

for(a=2;a>0;a--);

}

void delay20us(void) //误差0us

{

unsigned char a,b;

for(b=1;b>0;b--)

for(a=7;a>0;a--);

}

void delay30us() //误差0us

{

unsigned char a,b;

for(b=3;b>0;b--)

for(a=3;a>0;a--);

}

void delay100us() //误差0us

{

unsigned char a,b;

for(b=1;b>0;b--)

for(a=47;a>0;a--);

}

void delay200us(void) //误差0us

{

unsigned char a,b;

for(b=1;b>0;b--)

for(a=97;a>0;a--);

}

void delay500us() //误差0us

{

unsigned char a,b;

for(b=71;b>0;b--)

for(a=2;a>0;a--);

}

void DS18B20_init() //DS18B20初始化复位

{

DQ = 1;

_nop_();

_nop_();

_nop_();

_nop_(); //延时几个时钟周期保证DQ引脚稳定在高电平

DQ = 0;

delay500us(); //最短为480us的低电平信号复位

DQ = 1; //拉高总线15-60us

delay30us();

delay200us(); //延时足够时间复位基本上都会成功因此不必再判断是否复位成功

DQ = 1; //释放总线

}

uchar Read_One_Byte()

{

uchar i;

uchar byte = 0;

for(i = 0;i < 8;i++)

{

DQ = 1;

_nop_();

_nop_();

_nop_();

_nop_(); //延时几个时钟周期保证DQ引脚稳定在高电平

DQ = 0;

byte >>= 1;

delay20us();

DQ = 1; //给脉冲产生读时间间隙

delay10us(); //延时一定时间后,读DQ的值

if(DQ)

{ byte |= 0x80;} //读得DQ为1 将1写到dat最高位;读得DQ为0 不必处理

delay100us();

DQ = 1;

}

return(byte);

}

void Write_One_Byte(uchar byte)

{

uchar i = 0;

for(i = 0;i < 8;i++)

{

DQ = 1;

_nop_();

_nop_();

_nop_();

_nop_(); //延时几个时钟周期保证DQ引脚稳定在高电平

DQ = 0;

DQ = byte & 0x01; //写所给数据最低位

delay30us();

byte >>= 1;

}

}

int Read_Temp() ////////***读取温度值***********///// 每次读写均要先复位

{

int t;

float tep;

uchar a,b;

DS18B20_init();

Write_One_Byte(0xcc); //跳过ROM命令单个传感器所以不必读取ROM里的序列号Write_One_Byte(0x44); //开始转换

DS18B20_init();

Write_One_Byte(0xcc); //跳过ROM命令

Write_One_Byte(0xbe); //读寄存器,共九字节,前两字节为转换值

a = Read_One_Byte(); //a存低字节

b = Read_One_Byte(); //b存高字节

t = b;

t <<= 8;//高字节转换为10进制

t = t|a;

tep = t*0.0625;//转换精度为0.0625/LSB

t = tep*10 + 0.5;//保留1位小数并四舍五入****后面除10还原正确温度值)

return(t);

}

/*********** LCD ************/

#define RS P22

#define RW P21

#define LCDEN P20

#define LCD_DATA P0 //P0口接LCD数据口

#define LCD_BUSY P07 //lcd1602忙碌标志位

uchar idata lcd_code[10];//用来标记lcd1602 什么时候清显示每个页面都设一个code,code 不想同时清显示

//*****************************************延时函数***************************************//

void delayms(uint ms)//延时?个ms

{

uchar a,b,c;

while(ms--)

{

for(c=1;c>0;c--)

for(b=142;b>0;b--)

for(a=2;a>0;a--);

}

}

/*

//**********字符串复制函数**********

void string_copy(uchar *target,uchar *source)//字符串复制target:目标source:源

{

uchar i = 0;

for(i = 0;source[i] != '\0';i++)//注意target的长度无保护措施!

{

target[i] = source[i];

}

target[i] = '\0';

}

//**********字符串比较函数**********

uchar string_cmp(uchar *target,uchar *source)//字符串比较target:目标source:源

{

uchar revalue;

uchar i = 0;

for(i = 0;target[i] != '\0' && source[i] != '\0';i++) //两个都不等于'\0'才执行出现一个等于'\0'就跳出

{

if(target[i] == source[i])

{

revalue = 1;

}

else

{

revalue = 0;

break;

}

}

if(revalue == 1)

{

if(target[i] == '\0' && source[i] == '\0')

revalue = 1;

else

revalue = 0;

}

return(revalue);

}

*/

//**************** LCD ********************

//LCD基本函数:

void busy_check() //忙碌检测

{

/* RW = 1; //读

RS = 0; //指令寄存器

LCD_DATA = 0xFF;//实验证明读数时要将I/O口要置1

LCDEN = 0;

_nop_();

_nop_();

_nop_();

_nop_();

LCDEN = 1;// EN高电平读信息负跳变执行指令

_nop_();

_nop_();

_nop_();

while(1)

{

if(LCD_BUSY == 0)//P07 == 0跳出循环

break;

} */

delayms(2);//仿真时用延时法下载到真实单片机上时,将这句注释掉,采用上面的语句。}

void lcdwrcom(uchar command)//写指令

{

busy_check();

RW = 0;//写

RS = 0;//指令寄存器

LCD_DATA = command;

LCDEN = 1;//负跳变写入指令

_nop_();

_nop_();

_nop_();

_nop_();

LCDEN = 0;

}

void lcdwrdata(uchar lcd_data)//写数据数字、字母、标点符号都是数据

{

busy_check();

RW = 0;//写

RS = 1;//数据寄存器

LCD_DATA = lcd_data;

LCDEN = 1;//负跳变写入指令

_nop_();

_nop_();

_nop_();

_nop_();

LCDEN = 0;

}

void lcd_init()

{

delayms(15);//必要lcd1602上电到电压稳定需要时间

RW = 0;//写

RS = 0;//指令寄存器

LCD_DATA = 0x38;// 0x38设置显示模式为:16X2 显示,5X7 点阵,8 位数据接口'

LCDEN = 1;

_nop_();

_nop_();

_nop_();

LCDEN = 0;

delayms(5);

lcdwrcom(0x0c);//打开显示无光标不闪烁

lcdwrcom(0x06);//指令3 光标右移屏幕所有文字移动无效

lcdwrcom(0x01);// 清显示,光标复位到地址00H位置。

}

//LCD扩展函数:

void address(uchar x,uchar y) //定位下一步要写数的地址

{

uchar location;

if(x == 0)

location = 0x80|y;

else

location = 0xC0|y;

lcdwrcom(location);

}

void printchar(uchar x,uchar y,uchar letter)//显示字母、单个字符

{

address(x,y);

lcdwrdata(letter);

}

void printword(uchar x,uchar y,uchar *word) //显示单词(字符数组)

{

uchar i = 0;

for(i = 0;word[i] != '\0';i++)

{

address(x,y + i);

lcdwrdata(word[i]);

}

}

/*

void printuint(uchar x,uchar y,uchar num_ws_max,uint num)//显示无符号整形0~65535 x:行y:列num_ws_max 变量的最大位数

{

uchar i = 0;

uchar str[5] = {0x20,0x20,0x20,0x20,0x20};

if(num >= 10000)

{

str[0] = num/10000 + '0';

str[1] = num%10000/1000 + '0';

str[2] = num%1000/100 + '0';

str[3] = num%100/10 + '0';

str[4] = num%10 + '0';

// str[5] = '\0'; //手动加字符串结束标志

}

else if(num >= 1000)

{

str[0] = num/1000 + '0';

str[1] = num%1000/100 + '0';

str[2] = num%100/10 + '0';

str[3] = num%10 + '0';

str[4] ='\0';

}

else if(num >= 100)

{

str[0] = num/100 + '0';

str[1] = num%100/10 + '0';

str[2] = num%10 + '0';

str[3] = '\0';

}

else if(num >=10)

{

str[0] = num/10 + '0';

str[1] = num%10 + '0';

str[2] = '\0';

}

else if(num >= 0)

{

str[0] = num + '0';

str[1] = '\0';

}

for(i = 0;i <= 5;i++) //uint类型最大值65535 为5位数{

if(str[i] != '\0' && i < num_ws_max)

{

address(x,y + i);

lcdwrdata(str[i]);

}

else if(str[i] == '\0' && i < num_ws_max)

{

address(x,y+i);

lcdwrdata(' ');//空格// 实现功能:在此变量的位数范围内,把没数字的位存0x20(空格)

//例如:最大有3位:999 当变为99时,存为9+'0' 9+'0' 0x20

}

}

}

*/

void printtemp(uchar x,uchar y ,uint temp) //显示温度显示一位小数【显示效果相当于将一个数除以10并保存一位小数】

{

if(temp < 100)

{

address(x,y);

lcdwrdata(temp/10 + '0');

address(x,y + 1);

lcdwrdata('.');

address(x,y + 2);

lcdwrdata(temp%10 + '0');

address(x,y + 3);

lcdwrdata(' ');

address(x,y + 4);

lcdwrdata(' ');

}

else if(temp < 1000)

{

address(x,y);

lcdwrdata(temp/100 + '0');

address(x,y + 1);

lcdwrdata(temp%100/10 + '0');

address(x,y + 2);

lcdwrdata('.');

address(x,y + 3);

lcdwrdata(temp%10 + '0');

address(x,y + 4);

lcdwrdata(' ');

}

else if(temp < 10000)

{

address(x,y);

lcdwrdata(temp/1000 + '0');

address(x,y + 1);

lcdwrdata(temp%1000/100 + '0');

address(x,y + 2);

lcdwrdata(temp%100/10 + '0');

address(x,y + 3);

lcdwrdata('.');

address(x,y + 4);

lcdwrdata(temp%10 + '0');

}

}

void main()

{

int temp; //温度值

lcd_init();

printword(0,0,"temp:");

while(1)

{

temp = Read_Temp();

if(temp > 0 )

{

printchar(0,5,'+');

printtemp(0,6,temp);

}

else if(temp == 0)

{

printchar(0,5,' ');

printchar(0,6,'0');

}

else

{

temp = -temp;

printchar(0,5,'-');

printtemp(0,6,temp);

}

}

}

基于51单片机及DS18B20温度传感器的数字温度计程序(详细注释)

基于51单片机及DS18B20温度传感器的数字温度计程序(详细注释)

电路实物图如下图所示: C 语言程序如下所示: /******************************************************************** zicreate ----------------------------- Copyright (C) https://www.360docs.net/doc/73777618.html, -------------------------- * 程序名; 基于DS18B20的测温系统 * 功 能: 实时测量温度,超过上下限报警,报警温度可手动调整。K1是用来 * 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限 * 调节模式。在正常模式下,按一下K2进入查看上限温度模式,显示1s 左右自动 * 退出;按一下K3进入查看下限温度模式,显示1s 左右自动退出;按一下K4消除 * 按键音,再按一下启动按键音。在调节上下限温度模式下,K2是实现加1功能, * K1是实现减1功能,K3是用来设定上下限温度正负的。 * 编程者:Jason * 编程时间:2009/10/2 *********************************************************************/ #include //将AT89X52.h 头文件包含到主程序 #include //将intrins.h 头文件包含到主程序(调用其中的_nop_()空操作函数延时) #define uint unsigned int //变量类型宏定义,用uint 表示无符号整形(16位) #define uchar unsigned char //变量类型宏定义,用uchar 表示无符号字符型(8位) uchar max=0x00,min=0x00; //max 是上限报警温度,min 是下限报警温度 bit s=0; //s 是调整上下限温度时温度闪烁的标志位,s=0不显示200ms ,s=1显示1s 左右 bit s1=0; //s1标志位用于上下限查看时的显示 void display1(uint z); //声明display1()函数 #include"ds18b20.h" //将ds18b20.h 头文件包含到主程序 #include"keyscan.h" //将keyscan.h 头文件包含到主程序 #include"display.h" //将display.h 头文件包含到主程序

基于AT89C51单片机的温度传感器

基于AT89C51单片机的温度传感器 目录 摘要.............................................................. I ABSTRACT........................................................... I I 第一章绪论 (1) 1.1 课题背景 (1) 1.2本课题研究意义 (2) 1.3本课题的任务 (2) 1.4系统整体目标 (2) 第二章方案论证比较与选择 (3) 2.1引言 (3) 2.2方案设计 (3) 2.2.1 设计方案一 (3) 2.2.2 设计方案二 (3) 2.2.3 设计方案三 (3) 2.3方案的比较与选择 (4) 2.4方案的阐述与论证 (4) 第三章硬件设计 (6) 3.1 温度传感器 (6) 3.1.1 温度传感器选用细则 (6) 3.1.2 温度传感器DS18B20 (7) 3.2.单片机系统设计 (13)

3.3显示电路设计.................................错误!未定义书签。 3.4键盘电路设计................................错误!未定义书签。 3.5报警电路设计.................................错误!未定义书签。 3.6通信模块设计.................................错误!未定义书签。 3.6.1 RS-232接口简介..............................错误!未定义书签。 3.6.2 MAX232芯片简介.............................错误!未定义书签。 3.6.3 PC机与单片机的串行通信接口电路.............错误!未定义书签。 第四章软件设计..................................错误!未定义书签。 4.1 软件开发工具的选择..........................错误!未定义书签。 4.2系统软件设计的一般原则.......................错误!未定义书签。 4..3系统软件设计的一般步骤......................错误!未定义书签。 4.4软件实现....................................错误!未定义书签。 4.4.1系统主程序流程图.........................错误!未定义书签。 4.4.2 传感器程序设计...........................错误!未定义书签。 4.4.3 显示程序设计.............................错误!未定义书签。 4.4.4 键盘程序设计.............................错误!未定义书签。 4.4.5 报警程序设计.............................错误!未定义书签。 4.4.6 通信模块程序设计.........................错误!未定义书签。 第五章调试与小结..................................错误!未定义书签。致谢...............................................错误!未定义书签。参考文献...........................................错误!未定义书签。附录...............................................错误!未定义书签。系统电路图.......................................错误!未定义书签。系统程序.........................................错误!未定义书签。

51单片机中断程序大全

//实例42 :用定时器T0 查询方式 P2 口8 位控制LED 闪烁 //#include单片机寄存器定义的头文件 51包含 /******************************************************* *******函数功能:主函数 ******************************************************** ******/void main(void){ // EA=1;开总中断// 中断允许T0 // 定时器// ET0=1; 1的模式TMOD=0x01;// 使用定时器T0 位赋初值定时器T0 的高8 TH0=(65536-46083)/256; // 位赋初值的高8 TL0=(65536-46083)%6; // 定时器T0 T0启动定时器TR0=1;// TF0=0;P2=0xff; 无限循环等待查询while(1)// {while(TF0==0); TF0=0;P2=~P2; 位赋初值的高8 定时器TH0=(65536-46083)/256; // T0 位赋初值T0 TL0=(65536-46083)%6; //

定时器的高8 }} 1KHzT1:用定时器43 实例// 音频查询方式控制单片机发出 #include 单片机寄存器定义的头文件51 // 包含sbit sound=P3^7;将// 引脚sound P3.7 位定义为 /********************************************************** **** 函数功能:主函数 ******************************************************** ******/void main(void){// EA=1;开总中断// 中断允许ET0=1;// // 定时器T0 1的模式使用定时器// T1 TMOD=0x10; 位赋初值// TH1=(65536-921)/256; T1 定时器的高8 TL1=(65536-921)%6; // 定时器T1 的高8 位赋初值 TR1=1;// 启动定时器T1TF1=0; while(1)// 无限循环等待查询{while(TF1==0); TF1=0;

(完整word版)基于51单片机的温度控制系统设计

基于51单片机的水温自动控制系统 0 引言 在现代的各种工业生产中 ,很多地方都需要用到温度控制系统。而智能化的控制系统成为一种发展的趋势。本文所阐述的就是一种基于89C51单片机的温度控制系统。本温控系统可应用于温度范围30℃到96℃。 1 设计任务、要求和技术指标 1.1任务 设计并制作一水温自动控制系统,可以在一定范围(30℃到96℃)内自动调节温度,使水温保持在一定的范围(30℃到96℃)内。 1.2要求 (1)利用模拟温度传感器检测温度,要求检测电路尽可能简单。 (2)当液位低于某一值时,停止加热。 (3)用AD转换器把采集到的模拟温度值送入单片机。 (4)无竞争-冒险,无抖动。 1.3技术指标 (1)温度显示误差不超过1℃。 (2)温度显示范围为0℃—99℃。 (3)程序部分用PID算法实现温度自动控制。 (4)检测信号为电压信号。 2 方案分析与论证 2.1主控系统分析与论证 根据设计要求和所学的专业知识,采用AT89C51为本系统的核心控制器件。AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压,高性能CMOS 8位微处理器。其引脚图如图1所示。 2.2显示系统分析与论证 显示模块主要用于显示时间,由于显示范围为0~99℃,因此可采用两个共阴的数码管作为显示元件。在显示驱动电路中拟订了两种设计方案: 方案一:采用静态显示的方案 采用三片移位寄存器74LS164作为显示电路,其优点在于占用主控系统的I/O口少,编程简单且静态显示的内容无闪烁,但电路消耗的电流较大。 方案二:采用动态显示的方案 由单片机的I/O口直接带数码管实现动态显示,占用资源少,动态控制节省了驱动芯片的成本,节省了电 ,但编程比较复杂,亮度不如静态的好。 由于对电路的功耗要求不大,因此就在尽量节省I/O口线的前提下选用方案一的静态显示。

基于51单片机SHT11温湿度传感器检测程序.doc

基于51单片机SHT11温湿度传感器检测程序(含电路图) ? 下面是原理图: 下面是SHT11与MCU连接的典型电路:

下面是源代码: #include #include /******************************************************** 宏定义 ********************************************************/ #define uint unsigned int #define uchar unsigned char #define noACK 0 #define ACK 1 #define STATUS_REG_W 0x06 #define STATUS_REG_R 0x07 #define MEASURE_TEMP 0x03 #define MEASURE_HUMI 0x05 #define RESET 0x1e enum {TEMP,HUMI}; typedef union //定义共用同类型 { unsigned int i; float f; } value; /******************************************************** 位定义 ********************************************************/ sbit lcdrs=P2^0; sbit lcdrw=P2^1; sbit lcden=P2^2; sbit SCK = P1^0; sbit DATA = P1^1; /******************************************************** 变量定义 ********************************************************/ uchar table2[]="SHT11 温湿度检测"; uchar table3[]="温度为:℃"; uchar table4[]="湿度为:"; uchar table5[]="."; uchar wendu[6]; uchar shidu[6]; /******************************************************** 1ms延时函数 ********************************************************/ void delay(int z) {

单片机中断程序大全

单片机中断程序大全公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

//实例42:用定时器T0查询方式P2口8位控制L E D闪烁#include // 包含51单片机寄存器定义的头文件void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频

#include // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚 void main(void) {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0); TF1=0; sound=~sound; //将P3.7引脚输出电平取反 TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%256; //定时器T0的高8位赋初值 } } //实例44:将计数器T0计数的结果送P1口8位LED显示 #include // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚

基于51单片机DS18B20温度传感器的C语言程序和电路

基于51单片机DS18B20温度传感器的C语言程序和电路 DS18B20在外形上和三极管很像,有三只脚。电压范围为3.0 V至5.5 V 无需备用电源测量温度位温度转换为12位数字格式最大值为750毫秒用户可定义的非易失性温度报警设置应用范围包敏感系统。 下面是DS18B20的子程序,本人用过完全可行的: #include #include #define uchar unsigned char #define uint unsigned int sbit DQ=P2^0; void reset(); //DS18B20 void write_byte(uchar val); //DS18B20写命令函数 uchar read_byte(void); //DS18B20读1字节函数 void read_temp(); //温度读取函数 void work_temp(); //温度数据处理函数 uchar data temp_data[2]={0x00,0x00}; uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //对于温度显示值值 uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x0数部分查表 main() { while(1) { 自己添加; } } void delay1(uint t) { for(;t>0;t--); } ///////温度控制子函数 void reset() { uchar presence=1; while(presence) { while(presence) {

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

基于单片机的温度控制系统设计 1.设计要求 要求设计一个温度测量系统,在超过限制值的时候能进行声光报警。具体设计要求如下: ①数码管或液晶显示屏显示室内当前的温度; ②在不超过最高温度的情况下,能够通过按键设置想要的温度并显示;设有四个按键,分别是设置键、加1键、减1键和启动/复位键; ③DS18B20温度采集; ④超过设置值的±5℃时发出超限报警,采用声光报警,上限报警用红灯指示,下限报警用黄灯指示,正常用绿灯指示。 2.方案论证 根据设计要求,本次设计是基于单片机的课程设计,由于实现功能比较简单,我们学习中接触到的51系列单片机完全可以实现上述功能,因此可以选用AT89C51单片机。温度采集直接可以用设计要求中所要求的DS18B20。报警和指示模块中,可以选用3种不同颜色的LED灯作为指示灯,报警鸣笛采用蜂鸣器。显示模块有两种方案可供选择。 方案一:使用LED数码管显示采集温度和设定温度; 方案二:使用LCD液晶显示屏来显示采集温度和设定温度。 LED数码管结构简单,使用方便,但在使用时,若用动态显示则需要不断更改位选和段选信号,且显示时数码管不断闪动,使人眼容易疲劳;若采用静态显示则又需要更多硬件支持。LCD显示屏可识别性较好,背光亮度可调,而且比LED 数码管显示更多字符,但是编程要求比LED数码管要高。综合考虑之后,我选用了LCD显示屏作为温度显示器件,由于显示字符多,在进行上下限警戒值设定时同样可以采集并显示当前温度,可以直观的看到实际温度与警戒温度的对比。LCD 显示模块可以选用RT1602C。

3.硬件设计 根据设计要求,硬件系统主要包含6个部分,即单片机时钟电路、复位电路、键盘接口模块、温度采集模块、LCD 显示模块、报警与指示模块。其相互联系如下图1所示: 图1 硬件电路设计框图 单片机时钟电路 形成单片机时钟信号的方式有内部时钟方式和外部时钟方式。本次设计采用内部时钟方式,如图2所示。 单片机内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别为此放大器的输入端和输出端,其频率范围为~12MHz ,经由片外晶体振荡器或陶瓷振荡器与两个匹配电容一 起形成了一个自激振荡电路,为单片机提供时钟源。 复位电路 复位是单片机的初始化操作,其作用是使CPU 和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作,以防止电源系统不稳定造成CPU 工作不正常。在系统中,有时会出现工作不正常的情况,为了从异常状态中恢复,同时也为了系统调试方便,需要设计一个复位电路。 单片机的复位电路有上电复位和按键复位两种形式,因为本次设计要求需要有启动/复位键,因此本次设计采用按键复位,如图3。复位电路主要完成系统 图2 单片机内部时钟方式电路 图3 单片机按键复位电路

51单片机热敏电阻测温程序

//本程序是通过热敏电阻测温度(30c-50c),采用六位串行数码管显示,前三位显示ds18b20测得数据,后三位是热敏电阻测得数据 #include #include #include #define uchar unsigned char #define uint unsigned int uchar smg[]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x08,0x09}; uchar b,d; uint shuju; int a,temp; sbit start=P2^7; sbit ale=P2^7; sbit addc=P2^6; sbit addb=P2^5; sbit adda=P2^4; sbit eoc=P2^3; sbit oe=P2^2; sbit clk=P3^2;//0809时钟脚 sbit dat=P3^0; //串行数码管数据端 sbit clock=P3^1; //串行数码管时钟端 sbit DQ=P2^0; /******************delay**************************/ void delay(uint x) { while(x--); } void delay1(uint x) { uint i,j; for(i=0;i

51单片机中断程序大全

//实例42:用定时器T0查询方式P2口8位控制LED闪烁#include // 包含51单片机寄存器定义的头文件 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 } } //实例43:用定时器T1查询方式控制单片机发出1KHz音频#include // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为P3.7引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值

基于51单片机的数字温度报警器

摘要:随着传感器在生产生活中更加广泛的应用,一种新型的数字式温度传感器实现对温度的测试与控制得到了更快的开发。本文设计了一种基于单片机AT89C52的温度检测及报警系统。该系统将温度传感器DS18B20接到单片机的一个端口上,单片机对温度传感器进行循环采集。将采集到的温度值与设定的上下限进行比较,当超出设定范围的上下限时,通过单片机控制的报警电路就会发出报警信号,从而实现了本次课程设计的要求。该系统设计和布线简单、结构紧凑、体积小、重量轻、抗干扰能力较强、性价比高、扩展方便,在工农业等领域的温度检测中有广阔的应用前景。本次课程设计的测量范围为0℃--99℃,测量误差为±2℃。 关键字:温度传感器、单片机、报警、数码管显示 一、概述 本次设计可以应用到许多我们用过的软件设计,将前面所学的知识融汇在一起实现温度监测及其报警的功能,来提醒农民当前大棚内温度是否适合农作物的生长。 电子技术是在十九世纪末、二十世纪初开始发展起来的新兴技术,在二十世纪发展最迅速,应用最广泛,成为近代科学技术发展的一个重要标志。 随着电子技术的飞速发展,电子技术在日常生活中得到了广泛的应用,各类转换电路的不断推出以及电子产品的快速更新,电子技术已成为世界发展和人们生活中必不可少的工具。 本次课设应用Protues软件设计一个温度检测报警系统,用温度传感器DS18B20采集大棚内的温度,当大棚内的温度高于30℃。或低于15℃。时,电路发出报警信号并显示当前温度,达到提醒农民的效果。 本次课设要求设计一个温度监测报警显示电路,要求温度范围:0℃--99℃;测量误差为±2℃;报警下限温度为:15℃;报警上限温度为:30℃。 二、方案论证 设计一个用于温室大棚温度监测系统。大棚农作物生长时,其温度不能太低,也不能太高,太低或太高均不适合农作物生长。该系统可实时测量、显示大棚的温度,当大棚温度超过农作物生长的温度范围时,报警提醒农民。 方案一: 方案一原理框图如图1所示。 图1 大棚温度检测系统的原理框图 方案二: 方案二原理框图如图2所示。

基于51单片机的心率体温测试系统

摘要 本文介绍了一种基于51单片机的心率体温采集系统。首先介绍了51系列单片机的内部相关配置、工作原理以及编程方法,其次介绍了温度传感器PT100的相关测温方法以及通过红外光电传感器TCRT5000对射的方法来抓取人体脉搏信号。此次设计的电路部分主要包括:传感测量电路、放大电路、滤波整形电路、AD转换电路、计数显示电路、控制电路、电源供电电路等。通过按键开始测试,将PT100及TCRT5000输入的微弱信号进行放大整形,最后AD采集转换传送给单片机,在LCD1602上显示相关体温及心率信息。 本次硬件设计基于比较稳定可行、低成本的设计思想,软件设计采用模块化的设计方法,并且详细分析了红外传感器TCRT5000应用于心率测量上以及PT100应用于温度测量上的原理及优点,阐述了其他各配合电路的组成与工作特点,并且通过仿真进行电路的可行性验证,最后完成实物电路的设计,使得本次课题的预期结果得以实现。 关键词:51单片机;传感器;仿真;AD转换 -I

Abstract This paper introduced a heart rate and body temperature acquisition system that based on 51 single chip microcomputer. First the internal configurations of 51 single chip microcomputer are introduced. And the paper also tell how 51 single chip microcomputer works and how can we program on it. Then the method of using temperature sensor PT100 to get body temperature is introduced, and we use infrared photoelectric sensor TCRT5000 to get the pulse signal of human body.The design of the circuit mainly comprises sensing circuit , amplifying circuit, filtering and shaping circuit, AD converting circuit, counting and displaying circuit, controlling circuit, power supplying circuit and so on. When the keyboard is pressed, the system starts to get signal. The small signal from PT100 and TCRT5000 will be amplified and shaped. Then ad converter will change the analog signal into digital signal and send to 51 single chip microcomputer . At last LCD1602 will display the information of body temperature and heart rate. Keywords: Piezoelectric sensors;control circuit;counters;Multisim2001 simulation software control circuit. -II

基于51单片机温湿度检测+电子万年历的毕业设计论文

毕业设计论文 基于51单片机温湿度检测+电子万年历的设计

[摘要]:温湿度检测是生活生产中的重要的参数。本设计为基于51单片机的温湿度检测与控制系统,采用模块化、层次化设计。用新型的智能温湿度传感器SHT10主要实现对温度、湿度的检测,将温度湿度信号通过传感器进行信号的采集并转换成数字信号,再运用单片机STC89C52RC进行数据的分析和处理,为显示提供信号,显示部分采用LCD1602液晶显示所测温湿度值。系统电路简单、集成度高、工作稳定、调试方便、检测精度高,具有一定的实用价值。 [关键字]:STC89C52RC SHT10 LCD1602 按键指示灯蜂鸣器电子万年历Based on 51 single chip microcomputer temperature and humidity detection + electronic calendar design Abstract:Temperature and humidity detection is important parameters in the production of life. This design is based on 51 single chip microcomputer temperature and humidity detection and control system, adopting modular, hierarchical design. With new type of intelligent temperature and humidity sensor SHT10 main realization about the detection of temperature, humidity, temperature humidity signal acquisition is converted into digital signals through the sensor signal, using SCM STC89C52RC for data analysis and processing, provides the signal for display, display part adopts LCD1602 LCD display the measured temperature and humidity values. Simple circuit, high integration, work stability, convenient debugging, high detection precision, has certain practical value. Key words:STC89C52RC SHT10 LCD1602 key indicator light buzzer The electronic calendar

基于单片机的温度传感器的设计说明

基于单片机的温度传感器 的设计 目录 第一章绪论-------------------------------------------------------- ---2 1.1 课题简介 ----------------------------------------------------------------- 2 1.2 设计目的 ----------------------------------------------------------------- 3 1.3 设计任务 ----------------------------------------------------------------- 3 第二章设计容与所用器件 --------------------------------------------- 4第三章硬件系统设计 -------------------------------------------------- 4 3.1单片机的选择------------------------------------------------------------- 4 3.2温度传感器介绍 ---------------------------------------------------------- 5 3.3温度传感器与单片机的连接---------------------------------------------- 8 3.4单片机与报警电路-------------------------------------------------------- 9 3.5电源电路----------------------------------------------------------------- 10 3.6显示电路----------------------------------------------------------------- 10 3.7复位电路----------------------------------------------------------------- 11 第四章软件设计 ----------------------------------------------------- 12 4.1 读取数据流程图--------------------------------------------------------- 12 4.2 温度数据处理程序的流程图 -------------------------------------------- 13 4.3程序源代码 -------------------------------------------------------------- 14

基于51单片机的温度检测系统程序及仿真

//**************************************** //**用DS18B20进行测量,lcd1602显示** //**************************************** #include "reg51.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int uchar code table1 []={"ID: "}; //欢迎显示,包括空格在内<=16 uchar code table2 []={"Name: "};//欢迎显示,包括空格在内<=16 uchar code str1 []={" Temperature "}; uchar code str2 []={" "}; //************管脚定义************************ sbit lcd_rs = P3^0; //液晶数据命令选择端 sbit lcd_en = P3^1; //液晶使能 sbit DQ = P3^6; //液晶使能 //************参数定义************************ uint tvalue;//温度值 uchar tflag;//温度正负标志 uchar data disdata[5]; //************子函数定义************************

void delay(uchar z); //delay延时子程序 void init_lcd(); //LCD1602初始化函数 void write_com(uchar com); //LCD1602写指令函数 void write_data(uchar date); //LCD1602写数据函数 void lcd1602_display(uchar *q,uchar *p);//LCD1602显示函数 void welcome(); //LCD1602显示欢迎函数 void delay_DS18B20(uint i); //delay_DS18B20函数 void Init_DS18B20_display(); //DS18B20初始化显示 void Init_DS18B20(); //DS18B20初始化 uchar ReadOneByte(); //DS18B20读一字节 void WriteOneByte(uchar dat); //DS18B20写一字节 Read_Temperature(); //DS18B20读取温度值并转换 void DS18B20_display(); //DS18B20温度显示 //************主函数************************ void main() { welcome(); delay(2000); Init_DS18B20_display(); while(1) { Read_Temperature(); DS18B20_display(); } } //************delay延时子程序************************ void delay(uchar z) { uchar x,y; for(x=0;x

51单片机中断程序大全

//实例42 :用定时器TO查询方式P2 口8位控制LED闪烁#include // 包含 51 单片机寄存器定义的头文件/************************************************************** 函数功能:主函数 void main(void) { // EA=1; // 开总中断 // ETO=1; // 定时器 TO 中断允许 TMOD=OxO1; // 使用定时器 TO 的模式 1 THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值 TLO=(65536-46O83)%256; // 定时器 TO 的高 8 位赋初值 TRO=1; // 启动定时器 TO TFO=O; P2=Oxff; while(1)// 无限循环等待查询 { while(TFO==O) TFO=O; P2=~P2; THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值

TL0=(65536-46083)%256; // 定时器 T0 的高 8 位赋初值 } // 实例43 :用定时器T1 查询方式控制单片机发出1KHz 音频#include // 包含 51 单片机寄存器定义的头文件 sbit sou nd=P3^7; // 将 sound 位定义为 P3.7 引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; // 开总中断 // ET0=1; // 定时器 T0 中断允许 TMOD=0x10; // 使用定时器 T1 的模式 1 TH1=(65536-921)/256; // 定时器 T1 的高 8 位赋初值 TL1=(65536-921)%256; // 定时器 T1 的高 8 位赋初值 TR1=1; // 启动定时器 T1 TF1=0; while(1)// 无限循环等待查询 {

相关文档
最新文档