专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

SD18b20温度在液晶屏

作者:佚名   来源:本站原创   点击数:  更新时间:2011年08月05日   【字体:
//*****************************************************************
   /*
     程序功能:在1602液晶屏上显示当前温度
  涉及芯片:1602液晶、SD18b20温度传感器
   */
//*****************************************************************

#include<reg52.h>
#define uint unsigned int 
#define uchar unsigned char
sbit DQ=P0^3;
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
uchar low,high;
//====================================函数声明
//*********sd18b20*******************
void delayus(uint time);
void init_18b20();
void write_18b20(uchar date);
uchar read_18b20();
void wndu();
//**********1602液晶**************
void init_1602();
void write_com1602(uchar com);
void write_date1602(uchar date);
//====================================
void delayms(uint time)//毫秒级延时函数
 {
   uint i,j;
   for(i=time;i>0;i--)
    for(j=110;j>0;j--);
 }
void delayus(uint time)//微秒级延时函数
 {
   while(time--);
 }
void init_18b20()//对sd18b20的初始化
 {
   uchar n;
   DQ=1;
   delayus(8);
   DQ=0;
   delayus(80);
   DQ=1;
   delayus(8);
   n=DQ;
   delayus(8);
 }
/*将数据线拉为低电平产生写时间片,在数据线口拉为低电平在15微秒到60微秒间对数据
  线进行数据采样.如果为高电平则为写“1”,如果为低电平则为写零。
     对于主机产生的写“1”时间片的情况:数据线必须必先拉为低电平,然后被释放,是
                                   数据线在产生时间片15微秒之内拉至高电平;
     对于主机产生的写“0”时间片的情况:数据线必须被拉至逻辑电平并且保持低电平60个微秒*/

void write_18b20(uchar com)
 {
   uint i;
   for(i=0;i<8;i++)
    {
    DQ=0;
    //delayus(4);
    DQ=com&0x01;
    delayus(10);
    DQ=1;
    com>>=1;
    delayus(4);
 }
 delayus(4);
 }
/*从ds18b20读数据时,主机产生读时间片。当主机把数据线从逻辑高电平拉至低电平时,产生
 读时间片。数据线必须保持在逻辑低电平至少1个微秒。来至ds18b20的数据在读时间下降沿之
 后15微秒有效。因此,为了读出从时间片开始15微秒的状态,主机必须停止保持数据线为逻辑
 低电平。*/
uchar read_18b20()
 {
   uint i;
   uchar date=0x00;
   for(i=0;i<8;i++)
    {
   DQ=0;
   date>>=1;
   DQ=1;
   if(DQ)date|=0x80;
   delayus(4);
   DQ=1;
   delayus(4);
 }
 return date;
 }
void wendu()
 {
   init_18b20();
   write_18b20(0xcc);//跳过ROM
   write_18b20(0x44);//启动温度测量
   delayus(300);

   init_18b20();
   write_18b20(0xcc);//跳过ROM
   write_18b20(0xbe);//读取温度
   low=read_18b20(); //先读低八位
   high=read_18b20();//后读高八位
 }
void xianshi()
 {
   uchar a,b,c,d;
   float m,n=0.0625;
   high<<=4;
   high+=(low&0xf0)>>4;
   m=(low%10)*n;
   delayus(4);
   write_com1602(0x80+0x03);
   a=high/10;                //显示十位上的数
   write_date1602(0x30+a);
   delayms(5);
   write_com1602(0x80+0x04);
   b=high%10;                //显示个位上的数
   write_date1602(0x30+b);
   delayms(5);
   write_com1602(0x80+0x06);
   c=(int)(m*10);     //小数点后一位
   write_date1602(0x30+c);
   delayms(5);
   d=(int)(m*100)%10;    //小数点后第二位
   write_com1602(0x80+0x07);
   write_date1602(0x30+d);
   delayms(5);
   write_com1602(0x80+0x08);
   write_date1602(0x27);
   delayms(5);
   write_com1602(0x80+0x09);
   write_date1602('C');
   delayms(5);
   write_com1602(0x80+0x05);
   write_date1602(0x2e);
   delayms(5);  
 }
void main()
 {
  init_1602();
  while(1)
   {
    wendu();
  xianshi();
   }
 }
void init_1602()
 {
  en=0;
 rw=0;
 write_com1602(0x28);
 delayms(5);
 write_com1602(0x01);
 delayms(5);
 write_com1602(0x0c);
 delayms(5);
 write_com1602(0x06);
 delayms(5);
 }
void write_com1602(uchar com)
 {
  uchar gao,di;
 gao=com&0xf0;
 di=(com<<4)&0xf0;
 delayms(5);

 P2=gao;
 rs=0;
 delayms(5);
 en=1;
 delayms(5);
 en=0;
 delayms(5);

 P2=di;
 rs=0;
 delayms(5);
 en=1;
 delayms(5);
 en=0;
 delayms(5);
 }
void write_date1602(uchar date)
 {
  uchar gao,di;
 gao=date&0xf0;
 di=(date<<4)&0xf0;
 delayms(5);

 P2=gao;
 rs=1;
 delayms(5);
 en=1;
 delayms(5);
 en=0;
 delayms(5);

 P2=di;
 rs=1;
 delayms(5);
 en=1;
 delayms(5);
 en=0;
 delayms(5);
 }   
关闭窗口

相关文章