📄 lcm1602andds18b20.c
字号:
#include <AT89X51.H>
#define uchar unsigned char
#define uint unsigned int
bit Tflag;//温度正负标志
sbit DQ = P3^7;
sbit lcdrs=P3^0;
sbit lcdrw=P3^1;
sbit lcden=P3^2;
/****************************************************************************
* 名称:延时子程序
* 功能:1MS延时
****************************************************************************/
void delayms(uint count)
{
uint i,j;
for(i=0;i<count;i++)
for(j=0;j<110;j++);
}
/****************************************************************************
* 名称:LCD 写命令子程序
****************************************************************************/
void lcdwc(uchar com)
{
lcdrs=0;
P0=com;
lcdrw=0;
delayms(1);
lcden=1;
delayms(1);
lcden=0;
}
/****************************************************************************
* 名称:LCD 写数据子程序
****************************************************************************/
void lcdwd(uchar date)
{
lcdrs=1;
P0=date;
lcdrw=0;
delayms(1);
lcden=1;
delayms(1);
lcden=0;
}
/****************************************************************************
* 名称:LCD 初始化子程序
****************************************************************************/
void init()
{
delayms(1);
lcdwc(0x38);
lcdwc(0x0c);
}
/********** 该程序为总线上只有一个器件 **********/
//毫秒延时 11.0592 Mhz
void dmsec (unsigned int count)
{
unsigned int i; // 1ms延时
while (count--)
{
for (i=0;i<125;i++){}
}
}
void Delay(unsigned int num)// 延时函数
{
while( --num );
}
//复位脉冲
void tmreset (void)
{
DQ = 0;
Delay(90); // 精确延时 大于 480us
DQ = 1;
Delay(4); // 90,4 可以小范围变化
}
//存在脉冲
void tmpre (void)
{
while (DQ);
while (~DQ);
Delay(4);
}
//读一个位
bit tmrbit (void)
{
unsigned int i;
bit dat;
DQ = 0; i++; // i++;大概1us
DQ = 1; i++; i++;
dat = DQ;
Delay(8);
return (dat);
}
//读一个比特
unsigned char tmrbyte (void)
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = tmrbit ();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
//写一个比特
void tmwbyte (unsigned char dat)
{
unsigned int i;
unsigned char j;
bit testb;
for (j=1;j<=8;j++)
{
testb = dat & 0x01;
dat = dat >> 1; // 从低位开始? if (testb)
{// Write 1
DQ = 0; // 先拉低
i++; i++; // >1us
DQ = 1;
Delay(4);
}
else
{// Write 0
DQ = 0;
Delay(4); // 大一点 没影响,但不能太大,写一个位在30us内
DQ = 1;
i++; i++; // 再拉高
}
}
}
//ds1820开始转换
void tmstart (void)
{
dmsec(1);
tmreset ();
tmpre ();
dmsec (1);
tmwbyte (0xcc); // skip rom
tmwbyte (0x44); // 转换
}
//读取温度
unsigned char tmrtemp (void)
{
unsigned char a,b,y1,y2;unsigned int y3;
tmreset ();
tmpre ();
dmsec (1);
tmwbyte (0xcc); // skip rom
tmwbyte (0xbe); // 转换
a = tmrbyte (); // LSB低8位
b = tmrbyte (); // MSB高8位
if((b & 0x80)==0x80) //判断温度正负
{
b=~b;a=~a+1; //负温度处理(DS18B20的负温度是正的反码,即将它取反+1,就得到正的温度)
y1=a>>4; //降低精度(去掉小数点)
y2=b<<4; //减小测量范围(-55°C---99°C)
y3=y1 | y2;
Tflag=0;
}
else
{
y1=a>>4;
y2=b<<4;
y3=y1 | y2;
Tflag=1;
}
return(y3);
}
/********** MAIN **********/
void main (void)
{
uchar last;
uchar lsb,msb;
uchar a[]=" ( O __ O ) ";
uchar b[]="Tempature:";
uchar i;
init(); // 初始化液晶
tmstart();
dmsec(450); // 初始化ds18b20
for(i=0;i<16;i++)
{lcdwd(a[i]);}
lcdwc(0x80+0x40);
for(i=0;i<10;i++)
{lcdwd(b[i]);}
while(1)
{
tmstart(); // ds1820开始转换
dmsec(2);
last=tmrtemp(); // 读取温度
msb=last/0x0a+0x30;
lsb=last%0x0a+0x30;
if(Tflag==1)
{lcdwd('+');}
else
{lcdwd('-');}
lcdwd(msb);
lcdwd(lsb);
lcdwd(0xdf); //显示°C
lcdwd('C');
lcdwc(0x80+0x4A);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -