|
- #include<reg51.h>
- #include"delay.h"
- #include "LCD1602.h"
- #include"OneWire.h"
- #include"DS18B20.h"
- unsigned char flag;
- void Timer0_Init(void);
- void main()
- {
- unsigned char ack;
- int temp; //保存接受溫度數(shù)據(jù)
- int intTemp,decTemp; //用來(lái)分離溫度數(shù)據(jù)的整數(shù)部分與小數(shù)部分
- unsigned char str[12];
- unsigned char len;
- LCDInit();
- Timer0_Init();
- Start18B20();
- DelayXms(10);
- while(1)
- {
- if(flag)
- {
- flag=0;
- ack=Read18B20(&temp);
- if(ack)
- {
- intTemp=temp>>4;
- decTemp=temp&0x0f;
- len=IntegrtTorStr(intTemp,str);
- str[len++]='.';
- decTemp=(decTemp*100)/16;//0.0625
- str[len++]=decTemp/10+'0' ;
- str[len++]=decTemp%10+'0' ;
- str[len]='\0';
- LCDShowStr(1,1,str);
- }
- Start18B20();
- }
- }
-
- }
- void Timer0_Init(void) //10毫秒@12.000MHz
- {
- // AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TMOD |= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0xF0; //設(shè)置定時(shí)初始值
- TH0 = 0xD8; //設(shè)置定時(shí)初始值
- TF0 = 0; //清除TF0標(biāo)志
- ET0=1; //打開定時(shí)計(jì)數(shù)器中斷
- EA=1; //打開總中斷
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- }
- void Timer0_ISR() interrupt 1
- {
- static unsigned char timer0Cnt=0;
- TR0=0;
- TL0 = 0xF0; //設(shè)置定時(shí)初始值
- TH0 = 0xD8; //設(shè)置定時(shí)初始值
- timer0Cnt++ ;
- if(timer0Cnt>=100)
- {
- timer0Cnt=0;
- flag=1;
-
- }
- TR0=1;
- }
復(fù)制代碼- #ifndef __DS18B20_H__
- #define __DS18B20_H__
- #include <reg51.h>
- #include"OneWire.h"
- //ROM指令
- #define SEARCH_ROM 0xf0 //搜索ROM指令
- #define READ_ROM 0x33 //讀取ROM指令
- #define MATH_ROM 0x55 //匹配ROM指令
- #define SKIP_ROM 0xcc //跳過ROM指令
- #define ALARM_SEARCH 0xec //報(bào)警搜索指令
- //暫存器指令
- #define CONVERT_T 0x44 //溫度轉(zhuǎn)換指令
- #define WRITE_REGISTER 0x4e //寫暫存器指令
- #define READ_REGISTER 0xbe //讀取暫存器指令
- #define RECALL_E2 0xb8 //召回EEPROM指令
- #define COPY_REGISTER 0x48 //讀取暫存器指令
- #define READ_POWER_SUPPLY 0xb4 //讀取電源模式指令
- bit Read18B20(int *temp);
- bit Start18B20();
- #endif
復(fù)制代碼- #include"OneWire.h"
- #include "intrins.h"
- bit OneWierRet()
- {
- bit ack;
- EA=0;
- DS18B20=0; //總線拉低,發(fā)復(fù)位脈沖
- Delay600us();//480-960US之間
- DS18B20=1;
- Delay60us(); //15-60us取60us
- ack=DS18B20; //讀取IO口DS18B20的ACK
- while(!DS18B20); //等待18B20釋放總線,等待存在脈沖結(jié)束
- EA=1;
- return ack;
- }
- void WriteOneWire(unsigned char dat) //寫一個(gè)位函數(shù)
- {
- unsigned char tmp;
- EA=0;
- for(tmp=0x01;tmp!=0;tmp<<=1) //0000 0010
- {
- DS18B20=0; //總線拉低至少1us
- _nop_();
- _nop_();
- if((dat&tmp)==0) //判斷是0還是1
- DS18B20=0; //為0則寫0
- else
- DS18B20=1; //否則寫1
- Delay60us();
- DS18B20=1;
- }
- EA=1;
- }
- unsigned char ReadOneWire()
- {
- unsigned char dat;
- unsigned char tmp;
- EA=0;
- for(tmp=0x01;tmp!=0;tmp<<=1)// 0000 0110
- { //0000 0010 tmp
- DS18B20=0; //dat 0000 0001
- _nop_(); // 1111 1101
- _nop_();
- DS18B20=1;
- _nop_();
- _nop_();
- if(!DS18B20)
- dat&=~tmp;
- else
- dat|=tmp;
- Delay60us();
- }
- EA=1;
- return dat;
- }
復(fù)制代碼- #include "LCD1602.h"
- #include "delay.h"
- //unsigned char code str[][8]={0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00};
- void LCDReadBF() //忙位檢測(cè)函數(shù)
- {
- unsigned char state;
- unsigned char i;
- LCD1602_DB=0xFF;//io口置1做輸入
- LCD1602_RS=0;
- LCD1602_RW=1;
- do
- {
- state=LCD1602_DB;// 值讀到參數(shù)中
- LCD1602_EN=1;
- DelayXms(5);
- LCD1602_EN=0;
- i++;
- if(i>50)
- break;
- }
-
- while(state&0x80);
- }
- //寫入命令
- void LCDWriteCmd(unsigned char cmd)
- {
- LCDReadBF();//等待忙檢測(cè),不忙時(shí)操作
- LCD1602_RS=0;
- LCD1602_DB=cmd;
- LCD1602_RW=0;
- LCD1602_EN=1;
- DelayXms(5);
- LCD1602_EN=0;
- }
- //寫入數(shù)據(jù)
- void LCDWritedata(unsigned char dat)
- {
- LCDReadBF();//等待忙檢測(cè),不忙操作
- LCD1602_RS=1;
- LCD1602_DB=dat;
- LCD1602_RW=0;
- LCD1602_EN=1;
- DelayXms(5);
- LCD1602_EN=0;
- }
- //初始化
- void LCDInit()
- {
- LCDWriteCmd(LCD_MODE_PIN8); //顯示模式設(shè)置 2行 5*8點(diǎn)陣
- DelayXms(5);
- LCDWriteCmd(LCD_MODE_PIN8);
- LCDWriteCmd(LCD_DIS_ON); //顯示開,光標(biāo)關(guān)
- LCDWriteCmd(LCD_CURSOR_RIGHT); // 光標(biāo)右移
- LCDWriteCmd(LCD_SCREEN_CLR); //清屏
- LCDWriteCmd(0x80);
- }
- void LCDSetPosition(unsigned char x,unsigned char y)
- {
- if(0==y)
- {
- LCDWriteCmd(0x80|x);
- }
- else
- {
- LCDWriteCmd(0x80|(0x40+x));
- }
- }
- void LCDShowStr(unsigned char x,unsigned char y,unsigned char *str)
- {
- LCDSetPosition(x,y);
- while(*str!='\0')//逐次寫入顯示字符,直到最后一個(gè)字符"0"
- {
- LCDWritedata(*str);//寫入當(dāng)前字符并顯示
- str++;//地址指針加1,指向下一個(gè)待寫字符
- }
- }
- //第一種寫法
- // void LCDWriteCGRAM()
- // {
- // unsigned char i;
- // LCDWriteCmd(0x48); //1、構(gòu)造自定義字符
- // for(i=0;i<64;i++)
- // {
- // LCDWritedata(str[i]);
- // }
- //顯示字符
- // LCDWriteCmd(0x80|0x00);
- // LCDWritedata(0x01);
- //第二種方法
- void LCDSetChar(unsigned char x,unsigned char y,unsigned char pos,unsigned char *str)
- {
- unsigned char i;
- //先構(gòu)造自定義字符 確定位置 CGRAM
- for(i=0;i<8;i++)
- {
- LCDWriteCmd(0x40+pos*8+i);
- LCDWritedata(*(str+i));
- }
- //顯示
- LCDSetPosition(x,y);//設(shè)置顯示位置DDRAM
- LCDWritedata(0x00+pos);//顯示代碼
- }
- unsigned char IntegrtTorStr(long dat,unsigned char *str)
- {
- unsigned char i=0;
- unsigned char len=0;
- unsigned char buf[11];
- if(dat<0)
- {
- dat=-dat;//如果是負(fù)數(shù),去絕對(duì)值
- *str='-';
- len++;
- }
- do
- {
- buf[i++]=dat%10+'0'; //dat%10+0x30;buf[0]=8 buf[1]=7 buf[2]=6
- dat/=10;
-
-
- }
- while(dat>0);
- len+=i;
- while(i-->0)
- {
- *str++=buf[i];
-
- }
- *str='\0';
- return len;
- }
- // while(*str)
- // {
- // LCDWritedata(*str);
- // str++;
- // }
- // }
復(fù)制代碼- #ifndef __LCD1602_H__
- #define __LCD1602_H__
- #include <reg51.h>
- //IO口聲明
- #define LCD1602_DB P0
- sbit LCD1602_RS=P2^5;
- sbit LCD1602_RW=P2^6;
- sbit LCD1602_EN=P2^7;
- //unsigned char code str[];
- //顯示模式設(shè)置指令
- #define LCD_MODE_PIN8 0x38 //8位數(shù)據(jù)口,兩行,5*8點(diǎn)陣
- #define LCD_MODE_PIN4 0x28 //4位數(shù)據(jù)口,兩行,5*8點(diǎn)陣
- #define LCD_SCREEN_CLR 0X01 //清屏
- #define LCD_CURSOR_RST 0x02 //光標(biāo)復(fù)位
- //顯示開關(guān)控制指令
- #define LCD_DIS_CUR_BLK_ON 0x0F //顯示開,光標(biāo)開,光標(biāo)閃爍
- #define LCD_DIS_CUR_ON 0x0E //顯示開,光標(biāo)開,光標(biāo)不閃爍
- #define LCD_DIS_ON 0x0C //顯示開,光標(biāo)關(guān),光標(biāo)不閃爍
- #define LCD_DIS_OFF 0X08 //顯示關(guān),光標(biāo)關(guān),光標(biāo)不閃爍
- //顯示模式控制
- #define LCD_CURSOR_RIGHT 0x06 //光標(biāo)右移,顯示不移動(dòng)
- #define LCD_CURSOR_LEFT 0x04 //光標(biāo)左移,顯示不移動(dòng)
- #define LCD_DIS_MODE_LEFT 0x07 //操作后,AC自增,畫面平移
- #define LCD_DIS_MODE_RIGHT 0x05 //操作后,AC自減,畫面平移
- //光標(biāo)、顯示移動(dòng)指令
- #define LCD_CUR_MODE_LEFT 0X10 //光標(biāo)左移
- #define LCD_CUR_MODE_RIGHT 0x14 //光標(biāo)右移
- #define LCD_DIS_MODE_LEFT1 0x18 //顯示右移
- #define LCD_DIS_MODE_RIGHT1 0x1C //顯示左移
- void LCDReadBF();
- void LCDWriteCmd(unsigned char cmd);
- void LCDWritedata(unsigned char dat);
- void LCDInit();
- void LCDShowStr(unsigned char x,unsigned char y,unsigned char *str);
- void LCDSetPosition(unsigned char x,unsigned char y);
- void LCDSetChar(unsigned char x,unsigned char y,unsigned char pos,unsigned char *str);
- //CGRAM地址設(shè)置
- //0 1 A5
- unsigned char IntegrtTorStr(long dat,unsigned char *str);
- #endif
復(fù)制代碼
|
|