标题:
DS18B20读取序列号+1602显示源程序
[打印本页]
作者:
woaiyujuan
时间:
2017-10-30 19:44
标题:
DS18B20读取序列号+1602显示源程序
DS18B20读取序列号+1602显示,H我没加进去,序列号开头是28H,我只放进去28.
单片机源程序如下:
#include <intrins.h>
#include <lcd.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define uchar unsigned char
#define uint unsigned int
uint temp,flag1;
int LedOut[4];
int temper;
sbit DQ=P3^7;
uchar sn[8];//存序列号
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
/*--------- DS18B20-----------*/
void delay1(unsigned char i)
{
while(i--);
}
void initionds18b20()
{
DQ=0;
delay1(128); //900us
DQ=1;
delay1(1);
while(DQ); //检测到应答脉冲
//i=103;while(i>0) i--;//等待870us
delay1(100);
}
uchar readds18b20()
{ uchar i = 0;
uchar dat = 0;
for(i=8;i>0;i--)
{
DQ = 0; //将总线拉低,要在1us之后释放总线
//单片机要在此下降沿后的15us内读数据才会有效。
_nop_(); //至少维持了1us,表示读时序开始
dat >>= 1; //让从总线上读到的位数据,依次从高位移动到低位。
DQ = 1; //释放总线,此后DS18B20会控制总线,把数据传输到总线上
delay1(1); //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
if(DQ) //控制器进行采样
{
dat |= 0x80; //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
}
delay1(10); //此延时不能少,确保读时序的长度60us。
}
return (dat);
}
void writeds18b20(uchar dat)
{
uchar i = 0;
for(i=8;i>0;i--)
{
DQ = 0; //拉低总线
_nop_(); //至少维持了1us,表示写时序(包括写0时序或写1时序)开始
DQ = dat&0x01; //从字节的最低位开始传输
//指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
//因为15us后DS18B20会对总线采样。
delay1(10); //必须让写时序持续至少60us
DQ = 1; //写完后,必须释放总线,
dat >>= 1;
delay1(1);
}
}
void rom() //读取序列号
{
uchar i;
int j;
initionds18b20(); //复位
delay1(1); //延时
writeds18b20(0x33); //发送读序列号子程序
for (j=0;j<9;j++)
{
sn[j]=readds18b20(); //读取序列号
}
}
/*---------------lLCD----------------------*/
delay(BYTE ms)
{ // 延时子程序
BYTE i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
ep = 0;
return result;
}
lcd_pos(BYTE pos)
{ //设定显示位置
LcdWriteCom(pos | 0x80);
}
void write_lcd_disp(char Rom)
{
uchar i,c,l,h;
l = Rom & 0x0f; //取低4位
h = Rom & 0xf0; //取高4位
h >>= 4;
if( ( h >= 0x00 )&&( h <= 0x09 ) )
LcdWriteData(h+0x30); //取ASCII码
else
LcdWriteData(h+0x37); //取ASCII码
if( ( l >= 0x00 )&&( l <= 0x09 ) )
LcdWriteData(l+0x30); //取ASCII码
else
LcdWriteData(l+0x37); //取ASCII码
delay(1);
}
void main()
{
int k;
uchar a,b,c,d,e,f,g,h,j;
LcdInit(); // 初始化LCD
rom();
a=sn[0]; //调用读序列号子程序
b=sn[1];
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
ds18b20读取序列号 16022.rar
(40.62 KB, 下载次数: 77)
2017-10-30 19:45 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1