|
- #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; //保存接受温度数据
- int intTemp,decTemp; //用来分离温度数据的整数部分与小数部分
- 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; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0xF0; //设置定时初始值
- TH0 = 0xD8; //设置定时初始值
- TF0 = 0; //清除TF0标志
- ET0=1; //打开定时计数器中断
- EA=1; //打开总中断
- TR0 = 1; //定时器0开始计时
- }
- void Timer0_ISR() interrupt 1
- {
- static unsigned char timer0Cnt=0;
- TR0=0;
- TL0 = 0xF0; //设置定时初始值
- TH0 = 0xD8; //设置定时初始值
- timer0Cnt++ ;
- if(timer0Cnt>=100)
- {
- timer0Cnt=0;
- flag=1;
-
- }
- TR0=1;
- }
复制代码- #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 //报警搜索指令
- //暂存器指令
- #define CONVERT_T 0x44 //温度转换指令
- #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
复制代码- #include"OneWire.h"
- #include "intrins.h"
- bit OneWierRet()
- {
- bit ack;
- EA=0;
- DS18B20=0; //总线拉低,发复位脉冲
- Delay600us();//480-960US之间
- DS18B20=1;
- Delay60us(); //15-60us取60us
- ack=DS18B20; //读取IO口DS18B20的ACK
- while(!DS18B20); //等待18B20释放总线,等待存在脉冲结束
- EA=1;
- return ack;
- }
- void WriteOneWire(unsigned char dat) //写一个位函数
- {
- 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;
- }
复制代码- #include "LCD1602.h"
- #include "delay.h"
- //unsigned char code str[][8]={0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00};
- void LCDReadBF() //忙位检测函数
- {
- unsigned char state;
- unsigned char i;
- LCD1602_DB=0xFF;//io口置1做输入
- LCD1602_RS=0;
- LCD1602_RW=1;
- do
- {
- state=LCD1602_DB;// 值读到参数中
- LCD1602_EN=1;
- DelayXms(5);
- LCD1602_EN=0;
- i++;
- if(i>50)
- break;
- }
-
- while(state&0x80);
- }
- //写入命令
- void LCDWriteCmd(unsigned char cmd)
- {
- LCDReadBF();//等待忙检测,不忙时操作
- LCD1602_RS=0;
- LCD1602_DB=cmd;
- LCD1602_RW=0;
- LCD1602_EN=1;
- DelayXms(5);
- LCD1602_EN=0;
- }
- //写入数据
- void LCDWritedata(unsigned char dat)
- {
- LCDReadBF();//等待忙检测,不忙操作
- LCD1602_RS=1;
- LCD1602_DB=dat;
- LCD1602_RW=0;
- LCD1602_EN=1;
- DelayXms(5);
- LCD1602_EN=0;
- }
- //初始化
- void LCDInit()
- {
- LCDWriteCmd(LCD_MODE_PIN8); //显示模式设置 2行 5*8点阵
- DelayXms(5);
- LCDWriteCmd(LCD_MODE_PIN8);
- LCDWriteCmd(LCD_DIS_ON); //显示开,光标关
- LCDWriteCmd(LCD_CURSOR_RIGHT); // 光标右移
- 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')//逐次写入显示字符,直到最后一个字符"0"
- {
- LCDWritedata(*str);//写入当前字符并显示
- str++;//地址指针加1,指向下一个待写字符
- }
- }
- //第一种写法
- // void LCDWriteCGRAM()
- // {
- // unsigned char i;
- // LCDWriteCmd(0x48); //1、构造自定义字符
- // 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;
- //先构造自定义字符 确定位置 CGRAM
- for(i=0;i<8;i++)
- {
- LCDWriteCmd(0x40+pos*8+i);
- LCDWritedata(*(str+i));
- }
- //显示
- LCDSetPosition(x,y);//设置显示位置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;//如果是负数,去绝对值
- *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++;
- // }
- // }
复制代码- #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[];
- //显示模式设置指令
- #define LCD_MODE_PIN8 0x38 //8位数据口,两行,5*8点阵
- #define LCD_MODE_PIN4 0x28 //4位数据口,两行,5*8点阵
- #define LCD_SCREEN_CLR 0X01 //清屏
- #define LCD_CURSOR_RST 0x02 //光标复位
- //显示开关控制指令
- #define LCD_DIS_CUR_BLK_ON 0x0F //显示开,光标开,光标闪烁
- #define LCD_DIS_CUR_ON 0x0E //显示开,光标开,光标不闪烁
- #define LCD_DIS_ON 0x0C //显示开,光标关,光标不闪烁
- #define LCD_DIS_OFF 0X08 //显示关,光标关,光标不闪烁
- //显示模式控制
- #define LCD_CURSOR_RIGHT 0x06 //光标右移,显示不移动
- #define LCD_CURSOR_LEFT 0x04 //光标左移,显示不移动
- #define LCD_DIS_MODE_LEFT 0x07 //操作后,AC自增,画面平移
- #define LCD_DIS_MODE_RIGHT 0x05 //操作后,AC自减,画面平移
- //光标、显示移动指令
- #define LCD_CUR_MODE_LEFT 0X10 //光标左移
- #define LCD_CUR_MODE_RIGHT 0x14 //光标右移
- #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地址设置
- //0 1 A5
- unsigned char IntegrtTorStr(long dat,unsigned char *str);
- #endif
复制代码
|
|