DS18B20+LCD1602+AT24C02智能温度控制系统Word文档格式.docx

上传人:b****6 文档编号:18603863 上传时间:2022-12-29 格式:DOCX 页数:21 大小:37.52KB
下载 相关 举报
DS18B20+LCD1602+AT24C02智能温度控制系统Word文档格式.docx_第1页
第1页 / 共21页
DS18B20+LCD1602+AT24C02智能温度控制系统Word文档格式.docx_第2页
第2页 / 共21页
DS18B20+LCD1602+AT24C02智能温度控制系统Word文档格式.docx_第3页
第3页 / 共21页
DS18B20+LCD1602+AT24C02智能温度控制系统Word文档格式.docx_第4页
第4页 / 共21页
DS18B20+LCD1602+AT24C02智能温度控制系统Word文档格式.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

DS18B20+LCD1602+AT24C02智能温度控制系统Word文档格式.docx

《DS18B20+LCD1602+AT24C02智能温度控制系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《DS18B20+LCD1602+AT24C02智能温度控制系统Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。

DS18B20+LCD1602+AT24C02智能温度控制系统Word文档格式.docx

//红色指示灯

sbitWRITE_ALARM=P1^1;

//白色指示灯

sbitGREEN_ALARM=P1^2;

//绿色指示灯

sbitBLUE_ALARM=P1^3;

sbitP1_4=P1^4;

//时钟调整

sbitP1_5=P1^5;

//时钟加

sbitP1_6=P1^6;

//时钟减

sbitDQ=P1^7;

//定义ds18b20通信端口

sbitLCM_RS=P2^0;

//数据/命令端

sbitLCM_RW=P2^1;

//读/写选择端

sbitLCM_EN=P2^2;

sbitsda=P2^3;

//IO口定义

sbitscl=P2^4;

//LCD使能信号

sbitad_busy=P3^2;

//adc中断方式接口

sbitRECLED_EOC=P3^5;

//ISD1420放音结束查询标志

sbitOUT=P3^7;

ucharad_data;

//ad采样值存储

ucharseconde;

//定义并初始化时钟变量

ucharminite;

ucharhour;

ucharmstcnt=0;

uchartemp1,temp2,temp;

//温度显示变量

uchart,set;

ucharK;

bitON_OFF=0;

bitoutflag;

bitwrite=0;

ucharcodestr0[]={"

---:

:

---"

};

ucharcodestr1[]={"

SET:

CSA:

.C"

voiddelay_LCM(uint);

//LCD延时子程序

voidinitLCM(void);

//LCD初始化子程序

voidlcd_wait(void);

//LCD检测忙子程序

voidWriteCommandLCM(ucharWCLCM,ucharBusyC);

//写指令到ICM子函数

voidWriteDataLCM(ucharWDLCM);

//写数据到LCM子函数

voidDisplayOneChar(ucharX,ucharY,ucharDData);

//显示指定坐标的一个字符子函数

voidDisplayListChar(ucharX,ucharY,ucharcode*DData);

//显示指定坐标的一串字符子函数

voidinit_timer0(void);

//定时器初始化

voiddisplayfun1(void);

voiddisplayfun2(void);

voiddisplayfun3(void);

voiddisplayfun4(void);

voidkeyscan(void);

//键盘扫描子程序

voidset_adj(void);

voidinc_key(void);

voiddec_key(void);

voiddelay_18B20(unsignedinti);

voidInit_DS18B20(void);

ucharReadOneChar(void);

voidWriteOneChar(unsignedchardat);

voidReadTemperature(void);

voidad0809(void);

voidplayalarm(void);

/*********延时K*1ms,12.000mhz**********/

voiddelay_LCM(uintk)

uinti,j;

for(i=0;

i<

k;

i++)

{

for(j=0;

j<

60;

j++)

{;

}

}

/**********写指令到LCM子函数************/

voidWriteCommandLCM(ucharWCLCM,ucharBusyC)

if(BusyC)lcd_wait();

DATAPORT=WCLCM;

//选中指令寄存器

LCM_RW=0;

//写模式

LCM_EN=0;

/**********写数据到LCM子函数************/

voidWriteDataLCM(ucharWDLCM)

{

lcd_wait();

//检测忙信号

DATAPORT=WDLCM;

LCM_RS=1;

//选中数据寄存器

//写模式

/***********lcm内部等待函数*************/

BUSY)

{LCM_EN=0;

/**********LCM初始化子函数***********/

voidinitLCM()

DATAPORT=0;

delay_LCM(15);

WriteCommandLCM(0x38,0);

//三次显示模式设置,不检测忙信号

delay_LCM(5);

WriteCommandLCM(0x38,1);

//8bit数据传送,2行显示,5*7字型,检测忙信号

WriteCommandLCM(0x08,1);

//关闭显示,检测忙信号

WriteCommandLCM(0x01,1);

//清屏,检测忙信号

WriteCommandLCM(0x06,1);

//显示光标右移设置,检测忙信号

WriteCommandLCM(0x0c,1);

//显示屏打开,光标不显示,不闪烁,检测忙信号

/****************显示指定坐标的一个字符子函数*************/

voidDisplayOneChar(ucharX,ucharY,ucharDData)

Y&

=1;

X&

=15;

if(Y)X|=0x40;

//若y为1(显示第二行),地址码+0X40

X|=0x80;

//指令码为地址码+0X80

WriteCommandLCM(X,0);

WriteDataLCM(DData);

/***********显示指定坐标的一串字符子函数***********/

voidDisplayListChar(ucharX,ucharY,ucharcode*DData)

ucharListLength=0;

=0x01;

=0x0f;

while(X<

16)

DisplayOneChar(X,Y,DData[ListLength]);

ListLength++;

X++;

/***********ds18b20延迟子函数(晶振12MHz)*******/

voiddelay_18B20(unsignedinti)

while(i--);

/**********ds18b20初始化函数**********************/

voidInit_DS18B20(void)

unsignedcharx=0;

DQ=1;

//DQ复位

delay_18B20(8);

//稍做延时

DQ=0;

//单片机将DQ拉低

delay_18B20(80);

//精确延时大于480us

//拉高总线

delay_18B20(14);

x=DQ;

//稍做延时后如果x=0则初始化成功x=1则初始化失败

delay_18B20(20);

/***********ds18b20读一个字节**************/

unsignedcharReadOneChar(void)

uchari=0;

uchardat=0;

for(i=8;

i>

0;

i--)

DQ=0;

//给脉冲信号

dat>

>

DQ=1;

if(DQ)

dat|=0x80;

delay_18B20(4);

return(dat);

/*************ds18b20写一个字节****************/

voidWriteOneChar(uchardat)

unsignedchari=0;

for(i=8;

i>

i--)

{

DQ=0;

DQ=dat&

0x01;

delay_18B20(5);

DQ=1;

/**************读取ds18b20当前温度************/

voidReadTemperature(void)

unsignedchara=0;

unsignedcharb=0;

unsignedchart=0;

Init_DS18B20();

WriteOneChar(0xCC);

//跳过读序号列号的操作

WriteOneChar(0x44);

//启动温度转换

delay_18B20(100);

//thismessageisweryimportant

//跳过读序号列号的操作

WriteOneChar(0xBE);

//读取温度寄存器等(共可读9个寄存器)前两个就是温度

a=ReadOneChar();

//读取温度值低位

b=ReadOneChar();

//读取温度值高位

temp1=b<

<

4;

temp1+=(a&

0xf0)>

temp2=a&

0x0f;

temp=((b*256+a)>

4);

//当前采集温度值除16得实际温度值

/***************液晶显示子函数1正常显示*****************/

voiddisplayfun1(void)

//显示屏打开,光标不显示,不闪烁,检测忙信号

DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

DisplayOneChar(3,0,hour/10+0x30);

//液晶上显示小时

DisplayOneChar(4,0,hour%10+0x30);

DisplayOneChar(6,0,minite/10+0x30);

//液晶上显示分

DisplayOneChar(7,0,minite%10+0x30);

DisplayOneChar(9,0,seconde/10+0x30);

//液晶上显示秒

DisplayOneChar(10,0,seconde%10+0x30);

DisplayOneChar(4,1,K/10+0x30);

//液晶上显示设定的温度

DisplayOneChar(5,1,K%10+0x30);

DisplayOneChar(11,1,temp1/10+0x30);

//液晶上显示测得的温度

DisplayOneChar(12,1,temp1%10+0x30);

DisplayOneChar(14,1,temp2/10+0x30);

if(ON_OFF==0)//若温控标志为0

DisplayOneChar(14,0,0x4f);

//液晶上显示不控温的标志

DisplayOneChar(15,0,0x46);

else

//液晶上显示控温的标志

DisplayOneChar(15,0,0x4e);

if(outflag==1)

DisplayOneChar(0,0,0x7c);

DisplayOneChar(0,0,0xef);

/************液晶显示子函数2***************/

voiddisplayfun2(void)

//显示屏打开,光标不显示,不闪烁,检测忙信号

WriteCommandLCM(0x0f,1);

//显示屏打开,光标显示,闪烁,检测忙信号

/**************液晶显示子函数3*****************/

voiddisplayfun3(void)

//显示屏打开,光标不显示,不闪烁,检测忙信号

WriteCommandLCM(0x0f,1);

//显示屏打开,光标显示,闪烁,检测忙信号

/**************液晶显示子函数4*****************/

voiddisplayfun4(void)

/**************键盘扫描子函数******************/

voidkeyscan(void)

ucharxx;

//局部变量

P1=0xff;

if(P1!

=0xff)

delay_LCM(50);

if(P1!

{

xx=P1;

switch(xx)//根据按键状态,调用不同的子函数

{

case0xfe:

set_adj();

break;

case0xfd:

inc_key();

case0xfb:

dec_key();

case0xf7:

{delay_LCM(150);

ON_OFF=!

ON_OFF;

while(!

BLUE_ALARM);

}break;

default:

break;

}

}

/**************设定工作模式子函数****************/

voidset_adj(void)

delay_LCM(100);

set++;

if(set>

=4)set=0;

while(!

RED_ALARM);

/****************按键加法子函数******************/

voidinc_key(void)

delay_LCM(150);

switch(set)

case0:

if(P1==0xf7){delay_LCM(150);

case1:

hour++;

if(hour>

=23)hour=23;

case2:

minite++;

if(minite>

=59)minite=59;

case3:

K++;

if(K>

=99)K=99;

break;

default:

WRITE_ALARM);

/****************按键减法子函数*****************/

voiddec_key(void)

hour--;

if(hour<

=0)hour=0;

minite--;

if(minite<

=0)minite=0;

K--;

if(K<

=1)K=1;

GREEN_ALARM);

/////////24C02读写驱动程序////////////////////

voiddelay1(ucharx)

uinti;

x;

i++);

voidflash()

{;

;

voidx24c02_init()//24c02初始化子程序

scl=1;

flash();

sda=1;

flash()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1