当前位置:文档之家› 基于NRF24L01+温度无线传输51单片机

基于NRF24L01+温度无线传输51单片机

基于NRF24L01+温度无线传输51单片机
基于NRF24L01+温度无线传输51单片机

温度无线传输

南阳理工周渴望本次所做是基于2.4GNRF24L01+芯片的温度的无线传输,甲机作为发射机有DS18B20温度传感器、LCD1602液晶和NRE24L01+2.4G无线传输芯片。乙机作为接收端有LCD1602液晶和NRE24L01+2.4G无线传输芯片。甲机和乙机在硬件上是完全分开的。

工作过程:甲机将温度检测出来并显示在液晶上,然后通过NRF24L01将温度数据发送出去,然后乙机通过本机上的NRF24L01芯片将甲机发射的程序接手过来通过单片机处理显示在本机液晶上面。

实物图

引脚图

程序:

注:本次程序基于之前所做“1602LCD液晶显示DS18B20温度”程序。

发射端

#include

#include

#define uchar unsigned char

#define uint unsigned int

//************************************************************************* ****************

sbit ds18b20=P2^3; //定义DS18B20的数据引脚

bit crrent=1; //定义DS18B20初始化返回值,表示初始化是否成功

sbit BEE=P3^5;

sbit AD=P2^5;

sbit DC=P2^7;

sbit lcdrs=P2^0; //定义LCD引脚

sbit lcdrw=P2^1;

sbit lcden=P2^2;

sbit LED=P1^0;

uint HT=340;

uint value=0;

uchar code str[]={"Tempe:"};

uchar code str1[]={"DS18B20 Error!!!"};

uchar code str2[]={"Please Check"};

uchar tflag; // 是否正负

uchar data disdat[6];

uchar data setdat[4];

void writelcdcmd(uchar);

void writelcddat(uchar);

//************************************************************************* ****************

#define TX_ADR_WIDTH 5 // 发射地址的字节个数

#define TX_PLOAD_WIDTH 2 //发射字节

uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x55,0x10,0x10,0x01};

uchar rx_buf[TX_PLOAD_WIDTH];

uchar tx_buf[TX_PLOAD_WIDTH];

uchar distance_data[2];

uchar flag;//标志

sbit CE=P1^0; //发射高电平大于10MS 接收高电平

sbit CSN=P1^1; //低电平ISP使能

sbit SCK=P1^2; //下降沿

sbit MOSI=P1^3; //MCU出

sbit MISO=P1^4; //MCU入

sbit IRQ=P1^5; //中断

uchar bdata sta;

sbit RX_DR =sta^6; //接收数据准备就绪

sbit TX_DS =sta^5; //已发送数据

sbit MAX_RT =sta^4;

sbit DQ=P2^3;

unsigned char time; //设置全局变量,专门用于严格延时

//*********************************************NRF24L01******************* ******************

//***************************************NRF24L01寄存器指令*******************************************************

#define READ_REG 0x00 // 读寄存器指令

#define WRITE_REG 0x20 // 写寄存器指令

#define RD_RX_PLOAD 0x61 // 读取接收数据指令

#define WR_TX_PLOAD 0xA0 // 写待发数据指令

#define FLUSH_TX 0xE1 // 冲洗发送FIFO指令

#define FLUSH_RX 0xE2 // 冲洗接收FIFO指令

#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令

#define NOP 0xFF // 保留

//*************************************SPI(nRF24L01)寄存器地址****************************************************

#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式

#define EN_AA 0x01 // 自动应答功能设置

#define EN_RXADDR 0x02 // 可用信道设置

#define SETUP_AW 0x03 // 收发地址宽度设置

#define SETUP_RETR 0x04 // 自动重发功能设置

#define RF_CH 0x05 // 工作频率设置

#define RF_SETUP 0x06 // 发射速率、功耗功能设置

#define STATUS 0x07 // 状态寄存器

#define OBSERVE_TX 0x08 // 发送监测功能

#define CD 0x09 // 地址检测

#define RX_ADDR_P0 0x0A // 频道0接收数据地址

#define RX_ADDR_P1 0x0B // 频道1接收数据地址

#define RX_ADDR_P2 0x0C // 频道2接收数据地址

#define RX_ADDR_P3 0x0D // 频道3接收数据地址

#define RX_ADDR_P4 0x0E // 频道4接收数据地址

#define RX_ADDR_P5 0x0F // 频道5接收数据地址

#define TX_ADDR 0x10 // 发送地址寄存器

#define RX_PW_P0 0x11 // 接收频道0接收数据长度

#define RX_PW_P1 0x12 // 接收频道0接收数据长度

#define RX_PW_P2 0x13 // 接收频道0接收数据长度

#define RX_PW_P3 0x14 // 接收频道0接收数据长度

#define RX_PW_P4 0x15 // 接收频道0接收数据长度

#define RX_PW_P5 0x16 // 接收频道0接收数据长度

#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置

//************************************************************************* *************

void init_io(void)

{

CE=0;

CSN=1;

SCK=0;

}

void delay_ms(unsigned int x)

{

unsigned int i,j;

for(i=0;i

{

j=108;

while(j--);

}

}

uchar SPI_RW(uchar byte)//发送指令,接受状态,返回值为状态值

{

uchar bit_ctr;

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

{

MOSI = (byte&0x80);

byte = (byte<<1);

SCK = 1;

byte|=MISO;

SCK=0;

}

return(byte);

}

uchar SPI_RW_Reg(uchar reg, uchar value)

{

uchar status;

CSN = 0;

status = SPI_RW(reg);

SPI_RW(value);

CSN = 1;

return(status);

}

uchar SPI_Read(uchar reg)

{

uchar reg_val;

CSN = 0;

SPI_RW(reg); //写指令

reg_val = SPI_RW(0); //读reg的内容

CSN = 1;

return(reg_val);

}

uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)

{

uchar status,byte_ctr;

CSN = 0;

status = SPI_RW(reg);

for(byte_ctr=0; byte_ctr

SPI_RW(*pBuf++);

CSN = 1;

return(status);

}

void TX_Mode(void)

{

CE=0;

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); /*接收模块的地址*/

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); /*通道0 接收数据地址*/

SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); /*写待发数据指令a0*/

SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //数据通道0应答允许

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //接收数据通道0允许

SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);//等待500+86us 自动重发10次

SPI_RW_Reg(WRITE_REG + RF_CH,40);

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //数据传输率1Mbps ,发射功率0dBm

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); //配置寄存器

CE=1;

}

void checkflag()

{ sta=SPI_Read(STA TUS);//读状态寄存器

if(MAX_RT)

{

SPI_RW_Reg(FLUSH_TX,0); /*冲洗发送FIFO指令*/

}

SPI_RW_Reg(WRITE_REG+STA TUS,sta);//清除中断

}

//以下是DS18B20的操作程序

//************************************************************************/ void delay_18B20(unsigned int i)//延时1微秒

{

while(i--);

}

set18b20()/*ds1820复位*/

{

EA=0;

ds18b20= 1; //复位

delay_18B20(4); //延时

ds18b20 = 0; //拉低

delay_18B20(100); //精确延时大于480us

ds18b20 = 1; //拉高

delay_18B20(10);

crrent=ds18b20;

while(!ds18b20);

EA=1;

return(crrent); //返回值

}

uchar read18b20() /*读数据*/

{ uchar i;

uchar dat = 0;

EA=0;

for(i=0x01; i!=0; i<<=1)

{

ds18b20 = 0;

_nop_();

_nop_();

ds18b20 = 1;

_nop_();

_nop_();

if(!ds18b20)

dat &= ~i;

else

dat |= i;

delay_18B20(8);

}

EA=1;

return dat;

}

void write18b20(uchar wdata) /*写数据*/

{unsigned char i=0;

EA=0;

for (i=8; i>0; i--)

{ ds18b20 = 0;

_nop_();

_nop_();

ds18b20=wdata&0x01;

delay_18B20(10);

ds18b20 = 1;

wdata>>=1;

}

EA=1;

}

//******************************LCD1602*********************************** *****************************

void delayms(uint z) //不精确延时

{

uchar x;

uint y;

for(x=z;x>0;x--)

for(y=125;y>0;y--);

}

void LCD_BUSY() //LCD忙检测

{ uchar sta;

P0=0xff;

lcdrs=0;

lcdrw=1;

do{

lcden=1;

sta=P0;

lcden=0;

}while(sta & 0x80);

}

void writelcdcmd(uchar cmd) //LCD写命令{

LCD_BUSY();

delayms(1);

lcdrs=0;

lcdrw=0;

lcden=0;

P0=cmd;

delayms(1);

lcden=1;

delayms(1);

lcden=0;

}

void writelcddat(uchar dat) //LCD写数据{

LCD_BUSY();

delayms(1);

lcdrs=1;

lcdrw=0;

lcden=0;

P0=dat;

delayms(1);

lcden=1;

delayms(1);

lcden=0;

}

void inilcd() //LCD初始化

{ delayms(15);

writelcdcmd(0x38);

delayms(5);

writelcdcmd(0x0c);

delayms(5);

writelcdcmd(0x06);

delayms(5);

writelcdcmd(0x01);

delayms(5);

}

void play(unsigned char *p)//显示//

{

while(*p!='\0')

{

writelcddat(*p);

p++;

delayms(1);

}

}

//************************************************************************* *****************

void readtemperature(void)

{ uchar TL; //储存暂存器的温度低位

uchar TH; //储存暂存器的温度高位

set18b20();

write18b20(0xcc);

write18b20(0x44);

set18b20();

write18b20(0xcc);

write18b20(0xbe);

TL=read18b20(); //先读的是温度值低位

TH=read18b20(); //接着读的是温度值高位

distance_data[0]=TH ; //测量结果的高8位

distance_data[1]=TL; //放入16位的高8位

value=TH;

value<<=8;

value=value|TL;

}

/***********************************温度显示****************************************************/

void disp18b20() //液晶显示温度

{

uint i,t;

if(value<0x0fff) //是否是负值

tflag=0;

else

{

value=~value+1;

tflag=1;

}

value=value*(0.625)+0.5; //扩大10倍方便读取小数

i=65000;t=220;

LED=1;

if((value>HT)&&(crrent=0)) //这里设置温度上限值,来控制继电器,需加crrent=0,不然DS18B20在拔掉后会出错

{

while(t--)

while(i--) //这里是继电器导通为3分钟左右,中间不读取温度

{

set18b20();

LED=0;

if((value

LED=0;

}

}

/*改变设定温度*/

DC=1;AD=1;

if(AD==0) //设定温度加

{

HT++;

while(!AD);

}

if(DC==0) //设定温度减

{

HT--;

while(!DC);

}

/*************************/

/*读取上限值温度*/

setdat[0]=HT/100+'0'; //十位

setdat[1]=HT%100/10+0x30; //个位

setdat[2]=HT%10+'0';

/*************************/

/*读取当前温度*/

disdat[0]=value/1000+0x30;//百位数

disdat[1]=value%1000/100+0x30;//十位数

disdat[2]=value%100/10+0x30;//个位数

disdat[3]=value%10+0x30;//小数位

if(tflag==0)

disdat[4]=0x20;

else

disdat[4]=0x2d; //当最高位为0时,最高位不显示

if(disdat[0]==0x30)

{

disdat[0]=0x20;

if(disdat[1]==0x30)

disdat[1]=0x20;

}

/*显示当前温度*/

writelcdcmd(0x86);

writelcddat(disdat[4]); //符号位

writelcdcmd(0x87);

writelcddat(disdat[0]);

writelcdcmd(0x88);

writelcddat(disdat[1]);

writelcdcmd(0x89);

writelcddat(disdat[2]);

writelcdcmd(0x8a);

writelcddat(0x2e); //小数点

writelcdcmd(0x8b);

writelcddat(disdat[3]);

writelcdcmd(0x8d); //单位℃

writelcddat(0xdf);

writelcdcmd(0x8e);

writelcddat('C');

/*显示设定温度温度*/

writelcdcmd(0xc0);

writelcddat('H');

writelcdcmd(0xc1);

writelcddat('T');

writelcdcmd(0xc2);

writelcddat(':');

writelcdcmd(0xc3);

writelcddat(setdat[0]);

writelcdcmd(0xc4);

writelcddat(setdat[1]);

writelcdcmd(0xc5);

writelcddat('.');

writelcdcmd(0xc6);

writelcddat(setdat[2]);

}

//**********************************主函数

************************************************

void main(void)

{

uchar xx;

init_io();

inilcd();

while(1)

{ readtemperature(); //实时更新温度

writelcdcmd(0x01); //每次数据变化清屏显示

do

{

readtemperature();

checkflag();

for(xx=0;xx<2;xx++)

{

tx_buf[xx]= distance_data[xx];//发数据之前必须把要发送的数据装入它

}

TX_Mode(); //必须启动发送模块

delay_ms(5);

writelcdcmd(0x80);

play(str);

disp18b20();

}while(!crrent); //检测DS18B20存在,显示温度

do{

readtemperature();

writelcdcmd(0x80);

play(str1);

writelcdcmd(0x80+0x40);

play(str2);

BEE=1;

}while(crrent);

}

}

接收端:

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit lcdrs=P2^0; //定义LCD引脚

sbit lcdrw=P2^1;

sbit lcden=P2^2;

uint value=0;

uchar code str[]={"Tempe:"};

uchar code str1[]={"No signal"};

uchar code str2[]={"Please Check"};

uchar tflag; // 是否正负

uchar data disdat[6];

uchar data setdat[4];

void writelcdcmd(uchar);

void writelcddat(uchar);

//************************************************************************* *****************

uchar tm[2];

#define TX_ADR_WIDTH 5

#define TX_PLOAD_WIDTH 2

uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x55,0x10,0x10,0x01};

uchar rx_buf[TX_PLOAD_WIDTH];

uchar tx_buf[TX_PLOAD_WIDTH];

uchar flag;//标志

int cout;

sbit CE=P1^0; //发射高电平大于10MS 接收高电平

sbit CSN=P1^1; //低电平ISP使能

sbit SCK=P1^2; //下降沿

sbit MOSI=P1^3; //MCU出

sbit MISO=P1^4; //MCU入

sbit IRQ=P1^5; //中断

uchar bdata sta;

sbit RX_DR =sta^6; //接收数据准备就绪

sbit TX_DS =sta^5; //已发送数据

sbit MAX_RT =sta^4;

sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚

sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚

sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚

sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚

//***************************************NRF24L01寄存器指令*******************************************************

#define READ_REG 0x00 // 读寄存器指令

#define WRITE_REG 0x20 // 写寄存器指令

#define RD_RX_PLOAD 0x61 // 读取接收数据指令

#define WR_TX_PLOAD 0xA0 // 写待发数据指令

#define FLUSH_TX 0xE1 // 冲洗发送FIFO指令

#define FLUSH_RX 0xE2 // 冲洗接收FIFO指令

#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令

#define NOP 0xFF // 保留

//*************************************SPI(nRF24L01)寄存器地址****************************************************

#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式

#define EN_AA 0x01 // 自动应答功能设置

#define EN_RXADDR 0x02 // 可用信道设置

#define SETUP_AW 0x03 // 收发地址宽度设置

#define SETUP_RETR 0x04 // 自动重发功能设置

#define RF_CH 0x05 // 工作频率设置

#define RF_SETUP 0x06 // 发射速率、功耗功能设置

#define STATUS 0x07 // 状态寄存器

#define OBSERVE_TX 0x08 // 发送监测功能

#define CD 0x09 // 地址检测

#define RX_ADDR_P0 0x0A // 频道0接收数据地址

#define RX_ADDR_P1 0x0B // 频道1接收数据地址

#define RX_ADDR_P2 0x0C // 频道2接收数据地址

#define RX_ADDR_P3 0x0D // 频道3接收数据地址

#define RX_ADDR_P4 0x0E // 频道4接收数据地址

#define RX_ADDR_P5 0x0F // 频道5接收数据地址

#define TX_ADDR 0x10 // 发送地址寄存器

#define RX_PW_P0 0x11 // 接收频道0接收数据长度

#define RX_PW_P1 0x12 // 接收频道0接收数据长度

#define RX_PW_P2 0x13 // 接收频道0接收数据长度

#define RX_PW_P3 0x14 // 接收频道0接收数据长度

#define RX_PW_P4 0x15 // 接收频道0接收数据长度

#define RX_PW_P5 0x16 // 接收频道0接收数据长度

#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置

//************************************************************************* *************

void init_io(void)

{

CE=0;

CSN=1;

SCK=0;

}

void delay_ms(unsigned int x)

{

unsigned int i,j;

for(i=0;i

{

j=108;

while(j--);

}

}

uchar SPI_RW(uchar byte)

{

uchar bit_ctr;

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

{

MOSI = (byte&0x80);

byte = (byte<<1);

SCK = 1;

byte|=MISO;

SCK=0;

}

return(byte);

}

uchar SPI_RW_Reg(uchar reg, uchar value)

{

uchar status;

CSN = 0;

status = SPI_RW(reg);

SPI_RW(value);

CSN = 1;

return(status);

}

uchar SPI_Read(uchar reg)

{

uchar reg_val;

CSN = 0;

SPI_RW(reg);

reg_val = SPI_RW(0);

CSN = 1;

return(reg_val);

}

uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes) {

uchar status,byte_ctr;

CSN = 0;

status = SPI_RW(reg);

for(byte_ctr=0;byte_ctr

pBuf[byte_ctr] = SPI_RW(0);

CSN = 1;

return(status);

}

uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)

{

uchar status,byte_ctr;

CSN = 0;

status = SPI_RW(reg);

for(byte_ctr=0; byte_ctr

SPI_RW(*pBuf++);

CSN = 1;

return(status);

}

void RX_Mode(void)

{

CE=0;

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);

SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //数据通道0应答允许

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);//接收数据通道0允许

SPI_RW_Reg(WRITE_REG + RF_CH, 40);

SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);// 接收频道0 接收数据长度设置

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //数据传输率1Mbps ,发射功率0dBm

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); //配置寄存器

CE = 1;

}

void checkflag()

{

sta=SPI_Read(STA TUS);

if(RX_DR)

{SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);

flag=1;

}

if(MAX_RT)

{SPI_RW_Reg(FLUSH_TX,0);

}

SPI_RW_Reg(WRITE_REG+STA TUS,sta);

}

//************************************************************************* *********************

void delayms(uint z) //不精确延时

{

uchar x;

for(x=z;x>0;x--)

for(y=125;y>0;y--);

}

void LCD_BUSY() //LCD忙检测{ uchar sta;

P0=0xff;

lcdrs=0;

lcdrw=1;

do{

lcden=1;

sta=P0;

lcden=0;

}while(sta & 0x80);

}

void writelcdcmd(uchar cmd) //LCD写命令{

LCD_BUSY();

delayms(1);

lcdrs=0;

lcdrw=0;

lcden=0;

P0=cmd;

delayms(1);

lcden=1;

delayms(1);

lcden=0;

}

void writelcddat(uchar dat) //LCD写数据{

LCD_BUSY();

delayms(1);

lcdrs=1;

lcdrw=0;

lcden=0;

P0=dat;

delayms(1);

delayms(1);

lcden=0;

}

void inilcd() //LCD初始化

{ delayms(15);

writelcdcmd(0x38);

delayms(5);

writelcdcmd(0x0c);

delayms(5);

writelcdcmd(0x06);

delayms(5);

writelcdcmd(0x01);

delayms(5);

}

void play(unsigned char *p)//显示//

{

while(*p!='\0')

{

writelcddat(*p);

p++;

delayms(1);

}

}

void xianshi(void)

{

uchar TL; //储存暂存器的温度低位

uchar TH; //储存暂存器的温度高位

TH=tm[0] ;

TL=tm[1]; //这样得到的是温度小数部分的第一位数字(保留1位小数)

value=TH;

value<<=8;

value=value|TL;

if(value<0x0fff) //是否是负值

tflag=0;

else

{

value=~value+1;

tflag=1;

}

value=value*(0.625)+0.5; //扩大10倍方便读取小数disdat[0]=value/1000+0x30;//百位数

disdat[1]=value%1000/100+0x30;//十位数

disdat[2]=value%100/10+0x30;//个位数

disdat[3]=value%10+0x30;//小数位

if(tflag==0)

disdat[4]=0x20;

else

disdat[4]=0x2d; //当最高位为0时,最高位不显示if(disdat[0]==0x30)

{

disdat[0]=0x20;

if(disdat[1]==0x30)

disdat[1]=0x20;

}

/*显示当前温度*/

writelcdcmd(0x86);

writelcddat(disdat[4]); //符号位

writelcdcmd(0x87);

writelcddat(disdat[0]);

writelcdcmd(0x88);

writelcddat(disdat[1]);

writelcdcmd(0x89);

writelcddat(disdat[2]);

writelcdcmd(0x8a);

writelcddat(0x2e); //小数点

writelcdcmd(0x8b);

writelcddat(disdat[3]);

writelcdcmd(0x8d); //单位℃

writelcddat(0xdf);

writelcdcmd(0x8e);

writelcddat('C');

}

void main(void)

{

uchar xx;

inilcd();

init_io();

RX_Mode();

while(1)

{ flag=0;

checkflag();

if(flag!=1)

{ writelcdcmd(0x01);

writelcdcmd(0x01);

writelcdcmd(0x80);

play(str1);

writelcdcmd(0x80+0x40);

play(str2);

delayms(60000);

}

else if(flag)

{

writelcdcmd(0x01);

for(xx=0;xx<2;xx++)

{tm[xx]=rx_buf[xx];

delay_ms(1);

writelcdcmd(0x80);

play(str);

xianshi();

delayms(60000);

}

}

delayms(60000);

delayms(60000);

delayms(60000);

delayms(60000);

delayms(60000);

delayms(60000);

delayms(60000);

delayms(60000);

}

}

2014 8

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

西安文理学院物理与机械电子工程学院课程设计任务书

目录 摘要 (3) 1 引言 (3) 1.1课题背景 (3) 1.2研究内容和意义 (5) 2 芯片介绍 (5) 2.1 DS18B20概述 (5) 2.1.1 DS18B20封装形式及引脚功能 (6) 2.1.2 DS18B20内部结构 (6) 2.1.3 DS18B20供电方式 (9) 2.1.4 DS18B20的测温原理 (10) 2.1.5 DS18B20的ROM命令 (11) 2.2 AT89C52概述 (13) 2.2.1单片机AT89C52介绍 (13) 2.2.2功能特性概述 (13) 3 系统硬件设计 (13) 3.1 单片机最小系统的设计 (13) 3.2 温度采集电路的设计 (14) 3.3 LED显示报警电路的设计 (15) 4 系统软件设计...................................................15 4.1 流程图........................................................15 4.2 温度报警器程序.................................................16 4.3 总电路图..................................................... 19 5总结 (20)

摘要 随着时代的进步和发展,温度的测试已经影响到我们的生活、工作、科研、各个领域,已经成为了一种非常重要的事情,因此设计一个温度测试的系统势在必行。 本文主要介绍了一个基于AT89C52单片机的数字温度报警器系统。详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行了介绍,该系统可以方便的实现温度的采集和报警,并可以根据需要任意上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当做温度处理模块潜入其他系统中,作为其他主系统的辅助扩展。DS18B20与AT89C52结合实现最简温度报警系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。 关键词:单片机;温度检测;AT89C52;DS18B20; 1 引言 1.1课题背景 温度是工业对象中主要的被控参数之一,如冶金、机械、食品、化工各类工业生产中,广泛使用的各种加热炉、热处理炉、反应炉等,对工件的温度处理要求严格控制。随着科学技术的发展,要求温度测量的范围向深度和广度发展,以满足工业生产和科学技术的要求。 基于AT89C51单片机提高了系统的可移植性、扩展性,利于现代测控、自动化、电气技术等专业实训要求。以单片机为核心设计的温度报警器,具有安全可靠、操作简单方便、智能控制等优点。 温度对于工业生产如此重要,由此推进了温度传感器的发展。温度传感器主要经过了三个发展阶段[1]: (1)模拟集成温度传感器。该传感器是采用硅半导体集成工艺制成,因此亦称硅传感器或单片集成温度传感器。此种传感器具有功能单一(仅测量温度)、

接口实验报告-基于51单片机的脉搏温度测试系统-

摘要 接口实验报告 题目:脉搏波体温自动采集系统院(系):电子工程与自动化学院 专业:仪器仪表工程 学生姓名: 学号: 指导老师:李智 职称:教授 20 年8月28日 I

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

Abstract 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. III

基于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单片机的数字温度计的设计报告(王强)

西安文理学院物理与机械电子工程学院 课程设计报告 专业班级 2011级测控技术与仪器一班 课程单片机课程设计 题目基于51单片机的数字温度计的设计 学号 0703110135 学生姓名王强 指导教师陈琦 2014年 5月

西安文理学院物理与机械电子工程学院 课程设计任务书 学生姓名王强专业班级11级测控一班学号0703110135 指导教师陈琦职称讲师教研室 B0406 课程单片机课程设计 题目基于51单片机的数字温度计的设计 任务与要求 1、学会使用51单片机,并对其内部结构进行深入的了解。 2、了解DS18B20的原理以及使用方式。 3、对于共阳极、共阴极数码管有个清楚的认识和掌握。 4、测得的结果范围在-55~125度,精度为0.5。 开始日期 2014年5月12日完成日期 2014年5月25日 2014年5月28日

基于51单片机的数字温度计的设计 摘要 本设计主要介绍了一个基于AT89C51单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行了介绍,该系统可以方便的实现温度采集和显示,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。 关键词:单片机;数字温度传感器;最简温度检测系统;

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

创作编号: GB8878185555334563BT9125XW 创作者:凤呜大王*

毕业论文设计 基于51单片机的温度控制系统

摘要 在日常生活中温度在我们身边无时不在,温度的控制和应用在各个领域都有重要的作用。很多行业中都有大量的用电加热设备,和温度控制设备,如用于报警的温度自动报警系统,热处理的加热炉,用于融化金属的坩锅电阻炉及各种不同用途的温度箱等,这些都采用单片机技术,利用单片机语言程序对它们进行控制。而单片机技术具有控制和操作使用方便、结构简单便于修改和维护、灵活性大且具有一定的智能性等特 点,可以精确的控 制技术标准,提高了温控指标,也大大的提高了产品的质量和性能。 由于单片机技术的优点突出,智能化温度控制技术正被广泛地采用。本文介绍了基于单片机AT89C51 的温度控制系统的设计方案与软硬件实现。采用温度传感器DS18B20 采集温度数据,7段数码管显示温度数据,按键设置温度上下限,当温度低于设定的下限时,点亮绿色发光二极管,当温度高于设定的上限时,点亮红色发光二极管。给出了系统总体框架、程序流程图和Protel 原理图,并在硬件平台上实现了所设计功能。 关键词:单片机温度控制系统温度传感器

Abstract In daily life, the temperature in our side the ever-present, the control of the temperature and the application in various fields all have important role. Many industry there are a large number of electric heating equipment, and the temperature control equipment, such as used for alarm automatic temperature alarm systems, heat treatment furnace, used to melt metal crucible resistance furnace, and all kinds of different USES of temperature box and so on, these using single chip microcomputer, using single chip computer language program to control them. And single-chip microcomputer technology has control and convenient in operation, easy to modify and maintenance of simple structure, flexibility is large and has some of the intelligence and other characteristics, we can accurately control technology standard to improve the temperature control index, also greatly improve the quality of the products and performance. Because of the advantages of the single chip microcomputer intelligent temperature control technology outstanding, is being widely adopted. This paper introduces the temperature control based on single chip microcomputer AT89C51 design scheme of the system and the hardware and software implementation. The temperature sensor DS18B20 collection temperature data, 7 period of digital pipe display, the upper and lower limits of temperature button when temperature below the setting of the lower limit, light green leds, when the temperature is higher than the set on the limit, light red leds. Given the system framework and program flow chart and principle chart, and in Protel hardware platform to realize the function of the design. Keywords:SCM Temperature control system Temperature sensors

基于51单片机设计的带有测温功能的电子时钟汇总

、 职业技能训练之 电子技术课程设计报告 学院电子与信息学院 设计题目基于51单片机设计的带有测温功能的电子时钟班级XXX 姓名XXX 学号XXX 指导教师XXX 时间2012年06月25日

目录 一、设计要求 二、课程设计的方案、目的及意义 三、硬件设计方案 四、软件设计方案 五、总结 六、参考资料

一、设计要求 用51单片机设计带温度显示的电子时钟,具体要求如下: 1、利用DS1302时钟芯片实现时钟功能模块。 2、时钟要求可以调节时间:年、月、日、时、分、秒。 3、利用LCD1602显示。 4、利用DS18B20芯片实现温度功能模块。 5、利用按键完成各项功能。 二、课程设计方案、目的及意义 1、总体方案: 用STC89C51单片机作为CPU主控制器,DS1302时钟芯片提供准确时钟信号,DS18B20温度传感器采集温度信息,三个按键进行加减调整、功能切换作用,通过LCD1602对外多功能显示。 2、具体方案: CPU控制所有模块,通过循环反复从DS1302中读取时钟信息,传送至LCD1602显示,得到基本时钟功能。当分为59,秒为56时开始,每隔一秒LED 灯点亮240毫秒,0分0秒时LED灯点亮700毫秒。从而实现整点光报时。 定时循环从DS18B20中读取温度信息,传送至LCD1602显示,得到基本温度计功能。当温度高于30度(包括30度)时,点亮红色LED灯,提醒当天为高温天气。低于0度时,点亮蓝色LED灯,提醒当天为冰冻天气。 键盘使用扫面方式,MENU键控制功能切换,完成时钟和温度间的转换。OK键控制时间调整与确定,UP、DOWN键调节时间,R、L 键选择调整对象。进入调整时,暂停DS1302数据读取,并将改变的时间数据写入DS1302,并送LCD1602显示,同时,启动LCD1602光标闪烁,确定调整对象,完成人机对话。退出调整时,停止写入数据,重新读取DS1302时钟信息。从而完善时钟功能。 3、目的及意义 可作为产品生产,作为居家的时钟显示与温度计。

51单片机测温程序

#include #include #define uint unsigned int #define uchar unsigned char uinti,numone,numtwo,temp; ucharqian,bai,shi,ge,xiaoshu; sbitdq=P2^2; sbitdula=P2^6; sbitwela=P2^7; uchar code list[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71,0x80 }; unsigned char code listone[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; void delay(uint z) { uintx,y; for(x=100;x>0;x--) for(y=z;y>0;y--); } voiddelayone(unsigned char i)

{ while(--i); } /****************************************** 此延时函数针对的是12Mhz的晶振 delay(0):延时518us 误差:518-2*256=6 delay(1):延时7us (原帖写"5us"是错的)delay(10):延时25us 误差:25-20=5 delay(20):延时45us 误差:45-40=5 delay(100):延时205us 误差:205-200=5 delay(200):延时405us 误差:405-400=5*/ voidshuma(uchar temp) { shi=temp/100; ge=temp%100/10; xiaoshu=temp%10; dula=1; P0=list[shi]; dula=0; P0=0xff; wela=1; P0=0xfe;

(完整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单片机的DS18B20数字温度计的实训报告

电子信息职业技术学院 暨国家示性软件职业技术学院 单片机实训 题目:用MCS-51单片机和 18B20实现数字温度计 姓名: 系别:网络系 专业:计算机控制技术 班级:计控 指导教师: * 伟 时间安排:2013年1月7日至 2013年1月11日

摘要 随着国民经济的发展,人们需要对各中加热炉、热处理炉、反应炉和锅炉中温度进行监测和控制。采用单片机来对他们控制不仅具有控制方便,简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大的提高产品的质量和数量。 在日常生活及工业生产过程中,经常要用到温度的检测及控制,温度是生产过程和科学实验中普遍而且重要的物理参数之一。在生产过程中,为了高效地进行生产,必须对它的主要参数,如温度、压力、流量等进行有效的控制。温度控制在生产过程中占有相当大的比例。温度测量是温度控制的基础,技术已经比较成熟。传统的测温元件有热电偶和二电阻。而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,这些方法相对比较复杂,需要比较多的外部硬件支持。我们用一种相对比较简单的方式来测量。 我们采用美国DALLAS半导体公司继DS18B20之后推出的一种改进型智能温度传感器DS18B20作为检测元件,温度围为-55~125 oC,最高分辨率可达0.0625 oC。DS18B20可以直接读出北侧温度值,而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。 本文介绍一种基于AT89C51单片机的一种温度测量及报警电路,该电路采用DS18B20作为温度监测元件,测量围0℃-~+100℃,使用LED模块显示,能设置温度报警上下限。正文着重给出了软硬件系统的各部分电路,介绍了集成温度传感器DS18B20的原理,AT89C51单片机功能和应用。该电路设计新颖、功能强大、结构简单。 关键词:单片机,数字控制,温度计, DS18B20,AT89S51

基于51单片机的家用温湿度语音播报系统设计

毕业设计(论文) 题目:基于51单片机的家用温湿度语音播报系统设计 姓名 学院名 专业 指导教师 2014年月日

诚信承诺 本人__________声明,本论文及其研究工作是由本人在导师指导下独立完成,论文所利用的一切资料均符合论文著作要求,且在参考文献中列出。 签名:日期:

摘要 本系统是一个基于单片机AT89C51的语音播报系统的设计,用来测量环境温湿度,整个设计系统分为5部分:单片机控制、DHT11温湿度传感器、液晶显示、语音播报以及键盘控制电路,整个设计是以AT89C51为核心,选用DHT11温湿度传感器,LED12864液晶显示器实现。当测量温湿度超过设定的温度上下限时,启动蜂鸣器和指示灯报警。语音录放选用的集成块是ISD1420 芯片,其保真度高,录音效果好,而且经济实惠。LCD采用的是LCD12864,它具有功耗低、体积小、显示内容丰富、超薄轻巧等优点,应用越来越广泛。整个设计的重点在于编程,因为其外围电路相对比较简单,实现容易。在本论文中附带了软件实现的流程图以及部分子程序以及各种硬件电路图。 关键词:液晶显示;语音播报; ISD1420

ABSTRACT This system is a design of the speech thermometer according to the microprocessor AT89C51,which is used to measure the environment temperature, The whole design system is divided into 5 parts: A microprocessor control, temperature sensor,the LCD display, the speech report and the keyboard control circuit, at the same time ,The whole design take AT89C51 as the core, choose to single bus digital temperature sensor DS18B20, DS1302 serial clock chip, RT1602 LCD monitor realization, LCD display the current date, time, weeks and temperature. When measuring temperature over set temperature fluctuation limit, start with light alarm buzzer. Temperature display stability, and temperature measurement error acuities 1℃, plus or minus temperature the decimal part retained two significant digits. Increased Celsius temperature conversion contrast with Fahrenheit and sets up a display function beep voice automatically broadcast time temperature, manual real-time broadcast time temperature function. The speech recoding &; p layback I choose to use is the IC of ISD1420, it has high fidelity, good record effective, and economic. The LCD I choose is TC1602A, its power consume is low, it has many advantages , for example, the volume is small, the contents is abundant, super thin and agile etc, and its application is becoming more and more extensive. The whole design lies in the program, because its outer circuit is much more simple, and it can carry out more easily. In my thesis, there are flow chart and parts subprogram and various hardware circuit diagrams. Key Words: DS18B20;LCD;speech function;sounding and light alarm.

基于AT89C51单片机的测温系统

引言 本文主要介绍了一个基于AT89C51单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,特别是数字温度传感器DS18B20的数据采集过程,并介绍了利用C语言编程对DS18B20的访问,该系统可以方便的实现实现温度采集和显示,使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点。DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量。数字温度计与传统的温度计相比,具有读数方便、测温范围广、测温精确、功能多样话等优点。其主要用于对测温要求准确度比较高的场所,或科研实验室使用,该设计使用STC89C52单片机作控制器,数字温度传感器DS18B20测量温度,单片机接受传感器输出,经处理用LED数码管实现温度值显示。 .

一、设计要求 通过基于MCS-51系列单片机AT89C51和DS18B20温度传感器检测温度,熟悉芯片的使用,温度传感器的功能,数码显示管的使用,C语言的设计;并且把我们这一年所学的数字和模拟电子技术、检测技术、单片机应用等知识,通过理论联系实际,从题目分析、电路设计调试、程序编制调试到传感器的选定等这一完整的实验过程,培养了学生正确的设计思想,使学生充分发挥主观能动性,去独立解决实际问题,以达到提升学生的综合能力、动手能力、文献资料查阅能力的作用,为毕业设计和以后工作打下一个良好的基础。 以MCS-51系列单片机为核心器件,组成一个数字温度计,采用数字温度传感器DS18B20为检测器件,进行单点温度检测,检测精度为0.5摄氏度。温度显示采用3位LED数码管显示,两位整数,一位小数。具有键盘输入上下限功能,超过上下限温度时,进行声音报警。 二、基本原理 原理简述:数字温度传感器DS1820把温度信息转换为数字格式;通过“1-线协议”,单片机获取指定传感器的数字温度信息,并显示到显示设备上。通过键盘,单片机可根据程序指令实现更灵活的功能,如单点检测、轮转检测、越数字温度传感器的温度检测及显示的系统原理图如图DS1820限检测等。基于 图 2.1 基于DS1820的温度检测系统框图 三:主要器件介绍(时序图及各命令序列,温度如何计算等) 系统总体设计框图 由于DS18B20数字温度传感器具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠,所以在该设计中采用DS18B20数字温度传感器测量温度。 测温电路设计总体设计框图如图所示,控制器采用单片机AT89S52,温度传感器采用DS18B20,显示采用4位LED数码管,报警采用蜂鸣器、LED灯实现,键盘用来设定报警上下限温度。 .. . 测温电路设计总体设计框图图3.11.控制模块 AT89S52单片机是美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含有8kb的可系统编程的Flash只读程序存储器,器件采用ATMEL公

基于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 单片机按键复位电路

基于单片机控制的数字温度计毕业设计

单片机课程设计报告 数字温度计

1 设计要求 ■基本范围-50℃-110℃ ■精度误差小于0.5℃ ■LED数码直读显示 2 扩展功能 ■实现语音报数 ■可以任意设定温度的上下限报警功能

数字温度计 摘要:随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。 关键词:单片机,数字控制,温度计,DS18B20,A T89S51 1 引言 随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。 本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机A T89S51,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。 2 总体设计方案 2.1数字温度计设计方案论证 2.1.1方案一 由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。 2.1.2 方案二 进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。 从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。 2.2方案二的总体设计框图 温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89S51,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示。 图1总体设计方框图 2.2.1 主控制器

基于51单片机自行车测速系统设计

摘要 随着居民生活水平的不断提高,人们对于生活质量的要求也日益增加,尤其是对健身的要求。自行车不再仅仅是普通的运输、代步的工具,而是成为人们娱乐、休闲、锻炼的首选。自行车的速度里程表能够满足人们最基本的需求,让人们能清楚地知道当前的速度、里程等物理量。而对于自行车运动员来说,最为关心的莫过于一段时间内的训练效果。因为教练要根据一段时间内运动员的训练效果进行评估,从而进行适当的调整已使运动员达到最佳的状态。因此爱好自行车运动的人十分学要一款能测速的装置,以知道自己的运动情况。并根据外界条件,如温度,风速等进行适当的调节,已达到最佳运动的效果。 关键词:单片机、LED显示、里程/速度、霍尔元件

第一章系统总方案分析与设计 1.1 课题主要任务及内容 本课题主要任务是利用霍尔元件、单片机等部件设计一个可用LED数码管实时显示里程和速度的自行车的速度里程表。本文主要介绍了自行车的速度里程表的设计思想、电路原理、方案论证以及元件的选择等内容,整体上分为硬件部分设计和软件部分设计。 本文首先扼要对该课题的任务进行方案论证,包括硬件方案和软件方案的设计;继而具体介绍了自行车的速度里程表的硬件设计,包括传感器的选择、单片机的选择、显示电路的设计;然后阐述了该自行车的速度里程表的软件设计,包括数据处理子程序的设计、显示子程序的设计;最后对本次设计进行了系统的总结。 具体的硬件电路包括AT89C52单片机、霍尔元件以及LED显示电路等。 软件设计包括:中断子程序设计,里程计算子程序设计,显示子程序设计。软件采用汇编语言编写,软件设计的思想主要是自顶向下,模块化设计,各个子模块逐一设计。 1.2 任务分析与实现 本设计的任务是:以通用AT89C52单片机为处理核心,用传感器将车轮的转数转换为电脉冲,进行处理后送入单片机。里程及速度的测量,是经过AT89C52的定时/计数器测出总的脉冲数和每转一圈的时间,再经过单片机的计算得出,其结果通过LED显示器显示出来。 本系统总体思路如下:假定轮圈的周长为L,在轮圈上安装m个永久磁铁,则测得的里程值最大误差为L/m。经综合分析,本设计中取m=1。当轮子每转一圈,通过开关型霍尔元件传感器采集到一个脉冲信号,并从引脚P3.2中断0端输入,传感器每获取一个脉冲信号即对系统提供一次计数中断。每次中断代表车轮转动一圈,中断数n和周长L的乘积为里程值。计数器T1计算每转一圈所用的时间t,就可以计算出即时速度v。当里程键按下时,里程指示灯亮,LED切换显示当前里程;当速度键按下时,速度指示灯亮,LED切换显示当前速度。 要求达到的各项指标及实现方法如下: 1. 利用霍尔传感器产生里程数的脉冲信号。 2. 对脉冲信号进行计数。 实现:利用单片机自带的计数器T1对霍尔传感器脉冲信号进行计数。 3. 对数据进行处理,要求用LED显示里程总数和即时速度。 实现:利用软件编程,对数据进行处理得到需要的数值。 最终实现目标:自行车的速度里程表具有里程、速度测试与显示功能,采用单片机作控制,显示电路可显示里程及速度。

相关主题
文本预览
相关文档 最新文档