p2_1=0; saomiao();
//取反
//扫描看有没有按键按下
}
}
}
}
else if(p2_1==0) }
{ }
BB--; TF1=0; TH1=0xFE; TL1=0x0C; if(BB==0) { }
p2_0=0; p2_1=1; saomiao();
//其他位为零 //取反
//扫描看有没有按键按下
2、温度测量及显示(LCD)
软件首先进行LCD的初始化,然后进温度的读取,温度值的读取又包括
DS18B20的初始化及命令的写入和数据的读取,然后进行温度值的显示,温度显示包括LCD的命令写入及数据的写入,其中用到一些器件的命令及寄存器知识。
上面所示的是LCD的显示位置的地址,通过命令可以调整LCD显示的字母的位置,下面是LCD各个引脚的功能及定义:
编号 符号 引脚说明 编号 符号 引脚说明 1 VSS 电源地 9 D2 数据 2 VDD 电源正极 10 D3 数据 3 VL 液晶显示偏压 11 D4 数据 4 RS 数据/命令选择 12 D5 数据 5 R/W 读/写选择 13 D6 数据 6 E 使能信号 14 D7 数据 7 D0 数据 15 BLA 背光源正极 8 D1 数据 16 BLK 背光源负极 表中引脚接口说明表
第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。
1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:
序号 1 2 3 4 5 6 7 8 9 10 11
指令
清显示 光标返回 置输入模式 显示开/关控制 光标或字符移位 置功能
置字符发生存贮器地址 置数据存贮器地址 读忙标志或地址 写数到CGRAM或DDRAM)
从CGRAM或DDRAM读数
RS 0 0 0 0 0 0 0 0 0 1 1
R/W 0 0 0 0 0 0 0 0 1 0 1
D7 D6 0 0 0 0
0 0 0 0
D5 D4 0 0 0 0
0 0 0 0
D3 D2 D1 D0
0 1 I/D C * *
1 * S B * *
0 0 0 0 0 1 1 D S/R/
0 0 0 1
C L
0 0 1 DL N F 0 1 字符发生存贮器地址 1 显示数据存贮器地址 BF 计数器地址 要写的数据内容 读出的数据内容
DS18B20读取温度后温度是以16进制存储的,其存储结构如下图,其中低字节的低四位存储温度的小数部分,高字节的高五位S为符号位,其余位为温度的个位、十位、百位。
DS18B20的一线工作协议流程是:
初始化→ROM操作指令→存储器操作指令→数据传输。 其工作时序包括:
初始化时序 写时序 读时序
总程序如下:
#include
//头文件包含 //头文件包含 //定义变量
#define uint unsigned int #define uchar unsigned char
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();} //定义4条空语句延时
sbit DQ = P2^2;
//定义特殊功能寄存器的位变量 //同上
sbit LCD_RS = P3^0; sbit LCD_RW = P3^1; sbit LCD_EN = P3^2; sbit flag=P3^4;
//定义位变量,为标志位,显示单片机已经工作
uchar code Temp_Disp_Title[]={\ uchar Current_Temp_Display_Buffer[]={\ %uchar Current_Temp_unit[]={\
uchar code df_Table[]=
{0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9}; uchar CurrentT = 0;
uchar Temp_Value[]={0x00,0x00}; uchar Display_Digit[]={0,0,0,0}; bit DS18B20_IS_OK = 1;
void DelayXus(uint x) {
uchar i; while(x--)
{for(i=0;i<200;i++);}
//延时程序
//温度暂存
//温度单位
//定义数组为标题 //定义数组温度数据暂存
//转换为十进制后温度各个位的值存放数组 //DS18B20是否已经响应
}
bit LCD_Busy_Check() { }
void Write_LCD_Command(uchar cmd) { }
void Write_LCD_Data(uchar dat) //写数据给LCD
while(LCD_Busy_Check()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P1 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0;
//写命令给LCD
bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP();
result = (bit)(P1&0x80); LCD_EN=0; return result;
//根据上面的表,检测LCD是否处于忙状态