文档.docx

上传人:b****8 文档编号:10896397 上传时间:2023-02-23 格式:DOCX 页数:17 大小:17.42KB
下载 相关 举报
文档.docx_第1页
第1页 / 共17页
文档.docx_第2页
第2页 / 共17页
文档.docx_第3页
第3页 / 共17页
文档.docx_第4页
第4页 / 共17页
文档.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

文档.docx

《文档.docx》由会员分享,可在线阅读,更多相关《文档.docx(17页珍藏版)》请在冰豆网上搜索。

文档.docx

文档

#include

#include

#defineucharunsignedchar

sbitRS=P3^5;//定义LCD端口

sbitRW=P3^6;

sbitE=P3^7;

sbitDQ=P3^4;

sbitSET=P2^0;

sbitINC_A=P2^1;

sbitINC_B=P2^2;

#defineKey_UPP3_0//上调温度

#defineKey_DOWNP3_1//下调温度

#defineKey_SETP1_7//设定键(温度设定,长按开电源)

#defineRelayOutPortP3_5//继电器输出

unsignedcharint_time;//中断次数计数变量

unsignedcharsecond;//秒计数变量

unsignedcharminute;//分钟计数变量

unsignedcharhour;//小时计数变量

sbitSA=P1^4;//将S1位定义为P1.4

sbitSB=P1^5;//将S2位定义为P1.5

sbitSC=P1^6;//将S3位定义为P1.6

sbitSD=P1^7;//将S4位定义为P1.7

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

键盘扫描函数

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

voidkey_scan(void)

{

P1=0xf0;//将P1口高4位置高电平1

if((P1&0xf0)!

=0xf0)//有键按下

{

delay60ms();//延时60ms再检测

if((P1&0xf0)!

=0xf0)//确实有键按下

{

if(SA==0)//如果是SA键按下

second++;//秒加1

if(SB==0)//如果是SB键按下

minute++;//分加1

if(SC==0)//如果是SC键按下

hour++;//时加1

if(SD==0)//如果是SD键按下

{

second=0;//秒清0

minute=0;//分钟清0

hour=0;//小时清0

}

}

}

}//定义单总线端口

ucharLCD_3,LCD_2,LCD_1,LCD_0;

uchards18b20_romA[8]={0x8e,0x00,0x00,0x00,0xb8,0xc5,0x30,0x28};

//四个DS18B20的64位ROM地址

uchards18b20_romB[8]={0x52,0x00,0x00,0x00,0xb8,0xc5,0x34,0x28};

uchards18b20_romC[8]={0x65,0x00,0x00,0x00,0xb8,0xc5,0x35,0x28};

uchards18b20_romD[8]={0x3c,0x00,0x00,0x00,0xb8,0xc5,0x36,0x28};

ucharcodeLCDData[]="0123456789";

ucharcodedot_tab[]="0112334456678899";

ucharfirst_line[16]="A:

000℃B:

000℃";//LCD第一行显示缓存数组

ucharsecond_line[16]="C:

000℃D:

000℃";//LCD第二行显示缓存数组

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

//延时程序

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

voiddelay(unsignedintN)

{

unsignedinti;

for(i=0;i

}

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

//LCD1602测忙

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

voidcheck_busy(void)

{

while

(1)

{

P1=0xff;

E=0;

_nop_();

RS=0;

_nop_();

_nop_();

RW=1;

_nop_();

_nop_();

E=1;

_nop_();

_nop_();

_nop_();

_nop_();

if((P1&0x80)==0)

{

break;

}

E=0;

}

}

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

//LCD1602写命令

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

voidwrite_command(uchartempdata)

{

E=0;

_nop_();

_nop_();

RS=0;

_nop_();

_nop_();

RW=0;

P1=tempdata;

_nop_();

_nop_();

E=1;

_nop_();

_nop_();

E=0;

_nop_();

check_busy();

}

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

//LCD1602写数据

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

voidwrite_data(uchartempdata)

{

E=0;

_nop_();

_nop_();

RS=1;

_nop_();

_nop_();

RW=0;

P1=tempdata;

_nop_();

_nop_();

E=1;

_nop_();

_nop_();

E=0;

_nop_();

check_busy();

}

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

//初始化LCD1602

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

voidinit_lcd1602()

{

write_command(0x01);//清除屏幕

write_command(0x38);//功能设定(8位,2行,5*7点阵式)

write_command(0x0c);//显示器ON,光标OFF,闪烁OFF

write_command(0x06);//地址加1

}

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

//初始化ds18b20

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

bitresetpulse(void)

{

DQ=0;

delay(40);//延时500us

DQ=1;

delay(4);//延时60us

return(DQ);//读取P1.0的状态

}

voidds18b20_init(void)

{

while

(1)

{

if(!

resetpulse())//收到ds18b20的应答信号

{

DQ=1;

delay(40);//延时240us

break;

}

else

resetpulse();//否则再发复位信号

}

}

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

//读ds18b20一位

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

ucharread_bit(void)

{

DQ=0;

_nop_();

_nop_();

DQ=1;

delay

(2);

return(DQ);

}

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

//读ds18b20一个字节

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

ucharread_byte(void)

{

uchari,m,receive_data;

m=1;

receive_data=0;

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

{

if(read_bit())

{

receive_data=receive_data+(m<

}

delay(7);

}

return(receive_data);

}

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

//向ds18b20写一位

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

voidwrite_bit(ucharbitval)

{

DQ=0;

if(bitval==1)

DQ=1;

delay(5);

DQ=1;

}

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

//向DS18B20写一个字节命令

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

voidwrite_byte(ucharval)

{

uchari,temp;

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

{

temp=val>>i;

temp=temp&0x01;

write_bit(temp);

delay(5);

}

}

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

//64位的ROM序列号匹配

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

bitmatch_rom(uchar*rom)

{

uchari;

ds18b20_init();

write_byte(0x55);

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

{

write_byte(*(rom+i-1));

}

return1;

}

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

//从ds18b20中读出64位序列号

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

/*uchar*read_rom(void)

{

ucharrom[8],i;

ds18b20_init();

write_byte(0x33);

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

{

rom[i-1]=read_byte();

}

return&rom[0];

}*/

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

//将64位序列号显示在LCD上显示出来

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

/*voidprint_char(uchara)

{

if(a>=0&&a<=9)

write_data(a+0x30);

elseif(a>=0x0a&&a<=0x0f)

write_data(a+0x37);

}*/

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

//温度转换,将从ds18b20中读出来的温度值

//转化成十进制的温度值,并存放显示缓存

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

voidconvert_T(uchartemp_data_h,uchartemp_data_l)

{

uchartemp;

if((temp_data_h&0xf0)==0xf0)//如果温度寄存器里的高位为1,

{//则温度为负

temp_data_l=~temp_data_l;//负温度将补码转成二进制,

if(temp_data_l==0xff)//取反再加1

{

temp_data_l=temp_data_l+0x01;

temp_data_h=~temp_data_h;

temp_data_h=temp_data_h+0x01;

}

else

{

temp_data_l=temp_data_l+0x01;

temp_data_h=~temp_data_h;

}

LCD_0='℃';//查表得小数位的值

temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);

LCD_3='-';//显示"-"号

LCD_2=LCDData[(temp%100)/10];//查表得负温度温度十位

LCD_1=LCDData[(temp%100)%10];//查表得负温度个位

}

else//温度为正

{

LCD_0='℃';//查表得小数位的值

temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);

LCD_3=LCDData[temp/100];//查表得温度百位

LCD_2=LCDData[(temp%100)/10];//查表得温度十位

LCD_1=LCDData[(temp%100)%10];//查表得温度个位

}

}

voiddisplay(void)

{

uchari;

write_command(0x80);

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

{

write_data(first_line[i]);

}

write_command(0xc0);

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

{

write_data(second_line[i]);

}

}

voidmain(void)

{

uchartemp_data_l,temp_data_h;

/*uchar*ds18b20_rom;*/

init_lcd1602();

/*while

(1)

{

uchari;

ds18b20_rom=read_rom();//读序列号

write_command(0x80);

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

{

ds18b20_romA[i]=*ds18b20_rom;

ds18b20_rom++;

}

write_command(0x80);

for(i=0;i<8;i++)//显示序列号

{

print_char(ds18b20_romA[i]/16);

print_char(ds18b20_romA[i]%16);

}

}*/

while

(1)

{

ds18b20_init();

write_byte(0xcc);

write_byte(0x44);//启动温度转换

delay(700);

match_rom(ds18b20_romA);//匹配第一路

write_byte(0xbe);//读温度

temp_data_l=read_byte();//温度低8位

temp_data_h=read_byte();//温度高8位

convert_T(temp_data_h,temp_data_l);

first_line[2]=LCD_3;//温度转换后的各位

first_line[3]=LCD_2;//分别存入显示缓存数组中

first_line[4]=LCD_1;

first_line[6]=LCD_0;

match_rom(ds18b20_romB);//匹配第二路

write_byte(0xbe);//读温度

temp_data_l=read_byte();//温度低8位

temp_data_h=read_byte();//温度高8位

convert_T(temp_data_h,temp_data_l);

first_line[10]=LCD_3;//温度转换后的各位

first_line[11]=LCD_2;//分别存入显示缓存数组中

first_line[12]=LCD_1;

first_line[14]=LCD_0;

display();

match_rom(ds18b20_romC);//匹配第三路

write_byte(0xbe);//读温度

temp_data_l=read_byte();//温度低8位

temp_data_h=read_byte();//温度高8位

convert_T(temp_data_h,temp_data_l);

second_line[2]=LCD_3;//温度转换后的各位

second_line[3]=LCD_2;//分别存入显示缓存数组中

second_line[4]=LCD_1;

second_line[6]=LCD_0;

match_rom(ds18b20_romD);//匹配第四路

write_byte(0xbe);//读温度

temp_data_l=read_byte();//温度低8位

temp_data_h=read_byte();//温度高8位

convert_T(temp_data_h,temp_data_l);

second_line[10]=LCD_3;//温度转换后的各位

second_line[11]=LCD_2;//分别存入显示缓存数组中

second_line[12]=LCD_1;

second_line[14]=LCD_0;

display();

}

}

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

//按键测试与控制温度设定温度//

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

voidkey_test()

{

if(SET==0)

{delay(100);

while(~SET)

{DISPLAY();

if(INC_A==0)

{delay(100);

if(INC_A==0)

{SET_A++;

if(SET_A==10)

{

SET_A=0;

}

while(INC_A==0)DISPLAY();

}

}

if(INC_B==0)

{delay(100);

if(INC_B==0)

{SET_B++;

if(SET_B==10)

{

SET_B=0;

}

while(INC_B==0)DISPLAY();

}

}

}

}

set_tempA=SET_A;

set_tempB=SET_B;

}

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

//温度上升或下降显示//

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

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

当前位置:首页 > IT计算机 > 互联网

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

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