近期通过DS18B20再加LCD1602加串行输出调试成功,的LCDDATA端口P0
#包括
#包括
#“ STC12C5A.H“
#定义XTAL 11059200 / /杯晶振频率
#定义波特率9600 / /通信波特率
#定义UCHAR无符号字符型
#定义的UINT无符号整数 BR p> SBIT DQ = P2 ^ 3; / / DS18B20的数据脚
SBIT E = P2 ^ 7 / / 1602,使
SBIT RW = P2 ^ 6 / / 1602读取和写入
SBIT RS = P2 ^ 5 / / 1602数据/命令选择
UCHAR数据temp_data的[2] = {0X00,0X00} / / 8 - 位的数据高速缓存> UCHAR代码编号[] = {'0','1','2','3','4','5','6','7','8', '9'}; / / LCD1602数字ASCII表,用来显示数字
UINT DS [4]; / /温度显示4个显着的数字
UINT DH;
UINT升
UINT PIC16F684; / /十六进制转十进制数据缓存
无效延迟(无符号整型数){/ / DS18B20和主延时功能1 = 3US
unsigned int类型;
就(i = NUM I> 0; - );}
的无效InitUART(无效)/ /串口初始化
{ TMOD = 0X20;
SCON = 0x50的;
TH1 =是0xFD;
TL1 = TH1;
PCON = 0X00;
EA = 1;
ES =;
TR1 = 1;
}
无效SendOneByte(无符号字符)/ /串口发送1字节
{
SBUF = C;
(TI);
TI = 0;
}
无效的delay()/ / LCD1602延迟
{ INT I,J;
(I = 0; <= 50; + +)
(J = 0; J <= 2; J + +)
;
}
无效WCMD(UCHAR德尔)/ /写命令程序
{
P0 =德尔
RS = 0; RW = 0;
E = 0;
延迟();
E = 1;
延迟();
}
>无效写(UCHAR德尔)/ /写入数据
{
P0 =德尔
RS = 1;
RW = 0;
é = 0;
延迟的() E = 1;
延迟的();
}
无效L1602_init(无效)/ / LCD1602初始化 {
WCMD(0X01);
WCMD(0X38);
WCMD(0X0C);
WCMD(0X06);
WCMD( 0xd0);
}
:无效L1602_char(UCHAR挂起,的UCHAR李,烧焦的迹象)/ /写一个字符
UCHAR;
(挂起== 2)一个= 0XC0;
= A +谎言 - 1
WCMD(一)写(标志);}
无效L1602_string(UCHAR UCHAR李挂起,,UCHAR * P),/ /写字符串
UCHAR A,B = 0;
(挂起== 1)= 0x80的;
(挂起== 2)= 0XC0;
= A +谎言 - 1; 而(1)
{
WCMD(+ +);
B + +;
((* P =='\ 0')| |(B == 16))休息;
写(* P);
+ +;
}
}
UCHAR Init_DS18B20(无效){/ /初始化DS1820
DQ = 1; / / DQ复位
延迟(22); / /轻微的延迟
DQ = 0; / /微控制器DQ拉低
>延迟(160)/ /精确延时大于480us
DQ = 1; / /总线拉
延迟(22);
(DQ);
L1602_string (1,15,“OK”); / /初始化LCD1602显示OK
延迟(166);
DQ = 1;
回报(1)/ /回报信号,0 =存在,1 =不存在
}
:UCHAR ReadOneChar(无效){/ /读取一个字节
UCHAR;
UCHAR值= 0;
(I = 8> 0; - ){
DQ = 1; _nop_(); _nop_();
值>> = 1;
DQ = 0; _nop_()_nop_(); _nop_(); _nop_(); / / 4
DQ = 1; _nop_(,_nop_)(); _nop_(); _nop_()/ / 4我们
(DQ)值| = 0X80;
延迟(22)/ / 66
}
DQ = 1;
回报率(值); BR />}
,无效WriteOneChar(无符号字符型DAT){/ /写入一个字节
无符号的char i = 0;
(I = 8> 0; - ){ DQ = 0;,
DQ = DAT &0x01;
延迟(18);
DQ = 1;
DAT> > = 1;
}
}
无效Read_Temperature的(无效){/ /读取温度
Init_DS18B20();
WriteOneChar(0XCC)/ /跳过读序号列数运算
WriteOneChar(0×44)/ /启动温度转换
Init_DS18B20();
WriteOneChar(0XCC )/ /跳过读序号列号的操作
WriteOneChar(从0xBE)/ /读取温度寄存器
temp_data [0] = ReadOneChar(); / /低温度8,
temp_data [1] = ReadOneChar(); / /高温8
}
无效的主要()
{
L1602_init()/ /初始化LCD1602
Init_DS18B20(); / /初始化DS18B20
InitUART(); / /初始化串行通信
L1602_string(1,1,“DS18B20”) / / LCD1602测试
L1602_string(2,15,“`C”);
(1)
{
Read_Temperature()/ /读取8位数据
的延迟(800000); DL = temp_data [0];
DH = temp_data [1];
SendOneByte(DH); / /串行端口发送8位数据
DStemp的=(DH + DL)/ 10 * 256 * 625/10 / / 16进制的10水平除了10否则会溢出
DS [0] = PIC16F684%10 / /提取温度每个数字
DS [1]的= DStemp/10%10; DS [2]的= DStemp/100%10;
DS [3] = PIC16F684 / 1000;
L1602_char(1,3,''); / /显示每个数字
L1602_char(1,5,NUM [DS [0]);
L1602_char(1,4,NUM [DS [1]);
L1602_char(1,2 NUM [DS [2]);
L1602_char(1,1,NUM [DS [3]);
}
}
居然把ascii码只要38就够了,当我没想到
如果ds18b20坏了会一直显示85的,
应该是程序的问题
应该是你的程序上出来还存在小问题。