?? 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 + -