📄 1602api.c
字号:
/***********************************************
液晶显示器1602与单片机接口,
ds18B20测温
************************************************/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define _Nop() _nop_()
#define LCMDataPort P0
sbit LCM_RS=P3^5;
sbit LCM_RW=P3^4;
sbit LCM_EN=P3^3;
sbit DQ =P3^7; //定义ds18b20检测端口
sbit P1_0=P1^0;
sbit P2_5=P2^5;
bit ds_flag=0; //ds18b20存在标志
void DelayMs(uchar);
void InitLCD(void); //液晶屏初始化
void WrCmdLCM(uchar WCLCM,uchar BusyC); //写液晶屏命令
uchar RdStatusLCM(void); //读液晶屏状态
void WrDataLCM(uchar WDLCM); //写数据到液晶屏
uchar LCM_RdData(void) ; //读液晶屏数据
void DisplayOneChar(uchar x,uchar y,uchar DData); //在液晶屏上显示一个字符
void DisplayListChar(uchar x,uchar y,uchar slength,uchar *DData);//在液晶屏上显示一组数据
void delay15us(void);
void delay60us(void);
uint ReadTemperature(void);
void TemperConvert(void);
uint Temper;
uchar TemperL,TemperH;
uchar TemperInt,TemperDec;
/*-----------------------------------------------------
主程序
---------------------------------------------------------*/
void main()
{
// uchar code tab[16]={0x38,0x38,0x33,0x31,0x32,0x35,0x33,0x36}; //显示的数据内容
uchar position; //显示位置变量
uchar TemperBuf[8];
InitLCD();
DelayMs(200);
DisplayListChar(1,2,11,"temperature");
DelayMs(200);
position=0;
while(1) //循环体
{
Temper=ReadTemperature();
TemperConvert();
TemperBuf[0]=0x54;
TemperBuf[1]=0x3a;
TemperBuf[2]=TemperInt/10+0x30;
TemperBuf[3]=TemperInt%10+0x30;
TemperBuf[4]=0x2e;
TemperBuf[5]=TemperDec+0x30;
TemperBuf[6]=0x6f;
TemperBuf[7]=0x43;
DisplayListChar(2,1,8,TemperBuf);
DelayMs(200);
DelayMs(200);
P1_0=~P1_0;
/* if(~(P3|0x7f))
{
position++;
if(position>8)
position=0;
while(~(P3|0x7f));
WrCmdLCM(0x01,1);
RdStatusLCM();
}*/
}
}
void InitLCD()
{
WrCmdLCM(0x38,1);
WrCmdLCM(0x08,1);
WrCmdLCM(0x01,1);
WrCmdLCM(0x06,1);
WrCmdLCM(0x0c,1);
}
void WrCmdLCM(uchar WCLCM,uchar BusyC)
{
if(BusyC)RdStatusLCM();
LCMDataPort=WCLCM;
LCM_RS=0;
LCM_RW=0;
LCM_EN=0;
_Nop();
_Nop();
LCM_EN=1;
}
uchar RdStatusLCM()
{
LCMDataPort=0xff;
LCM_RS=0;
LCM_RW=1;
LCM_EN=0;
_Nop();
LCM_EN=1;
while(LCMDataPort&0x80);
return(LCMDataPort);
}
void WrDataLCM(uchar WDLCM)
{
RdStatusLCM();
LCMDataPort=WDLCM;
LCM_RS=1;
LCM_RW=0;
LCM_EN=0;
_Nop();
LCM_EN=1;
}
uchar LCM_RdData(void)
{
LCM_RS=1;
LCM_RW=1;
LCM_EN=0;
_Nop();
LCM_EN=1;
return(LCMDataPort);
}
void DisplayOneChar(uchar x,uchar y,uchar DData)
{
x=x&0x0f;
y=y&0x01;
if(y)x=x|0x40;
x|=0x80;
WrCmdLCM(x,0);
WrDataLCM(DData);
}
void DisplayListChar(uchar x,uchar y,uchar slength,uchar *DData)
{
uchar ListLength;
ListLength=0;
x=x&0x0f;
y=y&0x01;
while(ListLength<slength)
{
DisplayOneChar(x,y,DData[ListLength]);
ListLength++;
x++;
}
}
/*------------------------------------------
18b20测温程序
-------------------------------------------*/
//初始化函数
void Init_DS18B20(void) /////////////////////////////
{
uchar i;
DQ = 1; //DQ复位
_nop_(); //稍做延时
DQ = 0; //单片机将DQ拉低
for(i=0;i<8;i++)
delay60us(); //精确延时 大于 480us
DQ = 1; //拉高总线
delay60us();
if(DQ==0)
{
ds_flag=1; //ds18b20为1,置1
delay60us();
delay60us();
delay60us();
}
else
ds_flag=0;
}
//读一个字节
uchar ReadOneChar(void) ////////////
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
dat>>=1;
DQ=1;
_nop_();
DQ = 0; // 给脉冲信号
_nop_(); _nop_();_nop_(); _nop_();
DQ = 1; // 给脉冲信号
_nop_(); _nop_();_nop_();_nop_();_nop_();
if(DQ)
dat|=0x80;
delay15us();delay15us();delay15us();
}
return(dat);
}
//写一个字节
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
_nop_(); _nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();
DQ = dat&0x01;
delay15us();delay15us();delay15us();
DQ = 1;
dat>>=1;
}
}
//读取温度
uint ReadTemperature(void)
{
uchar temperL=0;
uchar temperH=0;
uchar temper=0;
uint temperbak=0;
DQ=1;
Init_DS18B20();
while(ds_flag==0)
Init_DS18B20();
delay60us();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
temperL=ReadOneChar();
temperH=ReadOneChar();
temperbak=temperH;
temperbak<<=8;
temperbak=temperbak|temperL;
return(temperbak);
}
void TemperConvert() //温度转换
{
TemperInt=(Temper&0x7ff0)>>4;
TemperDec=0;
if(Temper&0x0008)
TemperDec+=50;
if(Temper&0x0004)
TemperDec+=25;
if(Temper&0x0002)
TemperDec+=13;
if(Temper&0x0001)
TemperDec+=6;
TemperDec=TemperDec/10;
}
void delay15us(void)
{
uchar i;
for(i=0;i<3;i++);
}
void delay60us(void)
{
uchar i;
for(i=0;i<18;i++);
}
void DelayMs(uchar no)
{
uchar i,j;
for(i=0;i<no;i++)
{
for(j=0;j<164;j++);
for(j=0;j<164;j++);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -