研究执行此过程,然后你就可以添加功能,能多学一点。
电源DS18B20 DS18B20检测,检测正常,LCD1602显示:
DS18B20错误
请检查
蜂鸣器报警。
DS18B20检测正常,LCD1602显示:
DS18B20 OK
温度:100.8°C
高的温度值是0,将不会出现。
您可以查看通过热插拔DS18B20 DS18B20检测功能。
/ * ME300B单片机开发系统演示程序 - DS18B20温度显示* /
/ * LCD1602显示* /
/ *的作者:gguoqing * /
/ *版权所有(C)伟纳电子 www.willar.com 版权所有* /
/ **** ************************************************** ************* /
包括
#,包括
# UCHAR无符号的字符
定义uint无符号整数
SBIT DQ = P3 ^ 3; / /定义DS18B20端口DQ
SBIT BEEP = P3 ^ 7; / /蜂鸣器驱动线
位存在;
SBIT LCD_RS = P2 ^ 0;
SBIT LCD_RW = P2 ^ 1;
SBIT LCD_EN = P2 ^ 2; ...... / a>
UCHAR代码cdis1 [] = {“DS18B20 OK”};
UCHAR代码cdis2 [] = {“TEMP:C”};
UCHAR代码的cdis3 [] = {“ DS18B20 ERR0R“};
UCHAR代码cdis4 [] = {”请检查“};
无符号字符型数据temp_data [2] = {0x00时,为0x00};
无符号字符型数据显示[5] = {0X00,0X00,0X00,0X00,0X00};
无符号的字符代码ditab [16] = {0X00,0X01,0X01,0X02,0X03,0X03,0X04,0X04,
> 0X05,0X06,0X06,0X07,0X08,0X08,0X09,0X09};
无效哔哔声();
无符号的字符代码的mytab [8] = {0X0C,0X12,0X12,0X0C,为0x00, 0X00,0X00,0X00};
定义delayNOP(){_nop_(); _nop_(); _nop_(); _nop_();};
/ * ************************************************** **************** /
无效延迟1(MS)
{
无符号字符型Y;
而(MS - ) BR /> {
为(Y = 0,Y <250,Y + +)
{
_nop_();
_nop_();
_nop_()
_nop_();
}
}
}
/ ***************** **************************************的*********** /
/ *检查LCD忙状态* /
/ * lcd_busy 1,忙,等待着。液晶忙碌0:00,休闲,可以写入命令和数据。 * /
/ ******************************************* *********************** /
位lcd_busy()
{
位的结果;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
结果=(位)(P0 0x80)的;
LCD_EN = 0; BR />返回(结果);
}
/ *写指令数据到LCD * /
/ * RS = L,RW = L,E =高脉冲, D0-D7 =脚本。 * /
/ ******************************************* ************************ /
的无效lcd_wcmd(UCHAR CMD)
{
而(lcd_busy()) ;
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = CMD; BR /> delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/ ***** ************************************************** ************ /
/ *写显示数据到LCD * /
/ * RS = H,RW = L,E =高脉冲,D0-D7 =数据。 * /
/ ******************************************* ************************ /
的无效lcd_wdat(UCHAR DAT)
{
而(lcd_busy()) ;
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = DAT
delayNOP();
LCD_EN = 1; BR /> delayNOP();
LCD_EN = 0;
}
/ * LCD初始化设置* /
/ ***** ************************************************** ************ /
的无效lcd_init()
{
延迟1(15);
lcd_wcmd状态(0x01); / /清除LCD的显示内容的
lcd_wcmd(0x38); / / 16 * 5 * 7点阵8个数据
延迟1(IS);
lcd_wcmd(0x38);
延迟1(5) ;
lcd_wcmd(0x38);
延迟1(5);
lcd_wcmd(0X0C); / /显示关光标
延迟1(5); BR /> lcd_wcmd(0X06)/ /移动光标
延迟1
lcd_wcmd(为0x01); / /清除LCD的显示内容
延迟1(5)(5); BR / >}
/ *设置显示位置* /
/ **************************** *************************************** /
的无效lcd_pos(UCHAR POS)
lcd_wcmd(POS | 0x80)的/ /数据指针= 80 +地址变量
}
/ *写自定义字符CGRAM * / / ************************************************ ******************* /
无效writetab()
{
无符号字符型我;
lcd_wcmd号(0x40); / /写入CGRAM
为(i = 0; <8,我+ +)
lcd_wdat(在MyTAB [I]);
}
/级延时函数* /
/ **************************************** *************************** /
无效延迟(无符号整型数)
{ />而( - NUM);
}
/ *初始化DS1820 * /
/ ****************** ************************************************* /
Init_DS18B20(无效)
{
DQ = 1; / / DQ复位
延迟(8); / /轻微的延迟
DQ = 0; / / SCM DQ的拉下来
延迟(90); / /精确延时大于480us
DQ = 1; / /拉总线。
延迟(8);
存在= DQ; / /如果初始化成功= 0 = 1初始化失败
延迟(100);
DQ = 1
回报存在; / /返回信号,0 = 1 =不存在
}
/ *读取一个字节* /
/ ********************************************* ********************** /
ReadOneChar(空)
{
unsigned char型i = 0;
无符号字符型数据= 0;
为(i = 8> 0,我 - )
{
DQ = 0; / /脉冲信号
DAT >> = 1;
DQ = 1; / /对脉冲信号
(DQ)
数据| = 0X80;
延迟(4)
}
回报(DAT);
}
/ *写一个字节* /
/ ****** ************************************************** *********** /
WriteOneChar(无符号字符逸)
{
无符号char i = 0;
(I = 8;> 0 I - )
{
DQ = 0;
DQ = DAT 0X01;
的时延(5);
DQ = 1; /> DAT >> = 1;
}
}
/ *读取温度* /
/ ************ ************************************************** ***** /
Read_Temperature(无效)
{
Init_DS18B20();
WriteOneChar(0XCC); / /跳过读串口操作的列数
WriteOneChar(0×44)/ /启动温度转换
Init_DS18B20();
WriteOneChar(0XCC); / /跳过读序号列号的操作
temp_data [0] = ReadOneChar(); / /低温度8
temp_data。 [1] = ReadOneChar(); / /高温8
}
/ *数据转换和温度显示* /
/ ********** ************************************************** ******* /
Disp_Temperature()
{
显示[4] = temp_data [0]&0X0F;
显示[0] = ditab [显示器[4 ]] +0 X30; / /查表的小数位数的值
显示[4] =((temp_data [0]&31:8)>> 4)|((temp_data [1]&为0x0F)<< 4);
显示[3] [4] / 100 +0 x30的显示;
显示[1] =显示[4] 100%;
显示[2] =显示[1] / 10 +0 X30;
显示[1] =显示[1]%10 +0 X30;
(显示[3] == 0X30) / / 0不显示
{
显示[3] = 0X20;
(显示[2] == 0X30)/ /秒的0,不显示
显示[2] = 0X20;
}
lcd_pos的
lcd_wdat(显示[3]); / /百位数显示的
lcd_pos(0X49)(0X48 );
lcd_wdat(显示[2]); / / 10位数字显示
lcd_pos(0x4a);
lcd_wdat(显示[1]); / /单个数字显示
lcd_pos(0x4c);
lcd_wdat(显示[0]); / /数字显示的小数位数
}
/ ****** ************************************************** *********** /
/ *蜂鸣器鸣响* /
/ *********************** ******************************************** /
无效哔哔声()
无符号字符型Y;
(y = 0时,Y <100,Y + +)
延迟(60); /> BEEP =! BEEP / / BEEP否定的
}
BEEP = 1; / /关闭蜂鸣器
的延迟(40000);
}
/ * DS18B20 OK显示菜单* /
/ *************************************** **************************** /
的无效Ok_Menu()的
{
UCHAR米; BR /> lcd_init()/ /初始化LCD
lcd_pos(0); / /设置显示位置为1的第一行的字符
M = 0;
而(cdis1 [M] ='\ 0')
{/ /显示字符
lcd_wdat(cdis1 [M]);
M +;
}
的
lcd_pos(0X40); / /设置显示位置为第二行
M = 0;
而(cdis2 [M] ='\ 0'字符)
{
lcd_wdat(cdis2 [M]); / /显示字符
M + +;
}
writetab(); / /自定义字符的写入CGRAM
延迟1(5);
lcd_pos(0x4d);
lcd_wdat(0×00); / /显示自定义字符
}
a>
/ * DS18B20错误显示菜单* /
/ *************************** **************************************** /
的无效Error_Menu()的 BR /> {
UCHAR米;
lcd_init(); / /初始化LCD
lcd_pos(0); / /设置显示位置为第一行的字符
M = 0;
同时(cdis3 [M] ='\ 0')
{/ /显示字符的
lcd_wdat(cdis3 [M]。 );
M +;
}
lcd_pos号(0x40); / /设置显示位置为第二行的字符
M = 0;
而(cdis4 [M] ='\ 0')
{
lcd_wdat(cdis4 [M]); / /显示字符的
米+ +;
}
}
/ *主函数* /
/ ********************** ************** /
无效的主要()
{
Ok_Menu();
{
Read_Temperature();
Disp_Temperature();
}
(存在);
Error_Menu();
>
{
Init_DS18B20();
哔哔声();
}
而(存在);
}