| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 878 人关注过本帖
标题:基于ATC89S51单片机温控系统
只看楼主 加入收藏
技术生涯
Rank: 1
等 级:新手上路
帖 子:7
专家分:6
注 册:2012-12-29
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:5 
基于ATC89S51单片机温控系统
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^3;//ds18b20与单片机连接口
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7;
sbit beep=P1^2;
uchar code str1[]={"temperature: "};
uchar data disdata[5];
uint tvalue;//温度值
uchar tflag;//温度正负标志
/*************************lcd1602程序**************************/
void delay1ms(uchar ms)//延时1毫秒(不够精确的)
{
     uchar i;
     uchar j;
     for(i=0;i<ms;i++)
     for(j=0;j<100;j++);
 }

void wr_com(uchar com)//写指令//
{
     delay1ms(1);
     RS=0;
     RW=0;
     EN=0;
     P0=com;
     delay1ms(1);
     EN=1;
     delay1ms(1);
     EN=0;
}
 
 void wr_dat(uchar dat)//写数据//
 {
     delay1ms(1);
     RS=1;
     RW=0;
     EN=0;
     P0=dat;
     delay1ms(1);
     EN=1;
     delay1ms(1);
     EN=0;
 }
 
 void lcd_init()//初始化设置//
 {
     delay1ms(15);
     wr_com(0x38);
     delay1ms(5);
     wr_com(0x08);
     delay1ms(5);
     wr_com(0x01);
     delay1ms(5);
      wr_com(0x06);
     delay1ms(5);
     wr_com(0x0c);
     delay1ms(5);
 }
 
void display(uchar *p)//显示//
{
    while(*p!='\0')
    {
        wr_dat(*p);
        p++;
        delay1ms(1);
    }
}
void init_play()//初始化显示
{
    lcd_init();
    wr_com(0x80);
    display(str1);
   
 }

/******************************ds1820程序***************************************/
void delay_18B20(uint i)//延时1微秒
{
  while(i--);
}
void ds1820rst()/*ds1820复位*/
{
    uchar x=0;
    DQ = 1;//DQ复位
    delay_18B20(4); //延时
    DQ = 0;//DQ拉低
    delay_18B20(100); //精确延时大于480us
    DQ = 1;//拉高
    delay_18B20(40);
}
/****************************************************
                 18b20读数据
*****************************************************/                  
uchar ds1820rd()/*读数据*/
{
    uchar i = 0;
    uchar dat = 0;
    for (i=8 ; i>0 ; i--)
    {
      DQ = 0; //给脉冲信号
      dat>>=1;
      DQ = 1; //给脉冲信号
      if(DQ)
      dat|=0x80;
      delay_18B20(10);
      }
       return(dat);
   }
/**************************************************
                18b20写数据
**************************************************/
void ds1820wr(uchar wdata)/*写数据*/
{
    uchar i = 0;
    for (i=8; i>0; i--)
    {
         DQ = 0;
         DQ = wdata&0x01;
         delay_18B20(10);
         DQ = 1;
         wdata>>=1;
      }
}
/*****************************************************
                   读温度并转换
******************************************************/
uint read_temp()/*读取温度值并转换*/
{
    uchar a,b;
    ds1820rst();
    ds1820wr(0xcc);//*跳过读序列号*/
    ds1820wr(0x44);//*启动温度转换*/
    ds1820rst();
    ds1820wr(0xcc);//*跳过读序列号*/
    ds1820wr(0xbe);//*读取温度*/
    a=ds1820rd();
    b=ds1820rd();
    tvalue=b;
    tvalue<<=8;
    tvalue=tvalue|a;
 if(tvalue<0x0fff)
    tflag=0;
 else
  {
    tvalue=~tvalue+1;
    tflag=1;
  }
    tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
    return(tvalue);
  }

/*******************************************************************
                       显示温度
********************************************************************/
 void ds1820disp()//温度值显示
 {
     uchar flagdat;
     disdata[0]=tvalue/1000+0x30; //百位数
     disdata[1]=tvalue%1000/100+0x30;//十位数
     disdata[2]=tvalue%100/10+0x30;//个位数
     disdata[3]=tvalue%10+0x30;//小数位
    if(tflag==0)
      flagdat=0x20;//正温度不显示符号
    else
      flagdat=0x2d;//负温度显示负号:-
    if(disdata[0]==0x30)
    {
      disdata[0]=0x20;//如果百位为0,不显示
      if(disdata[1]==0x30)
      {
        disdata[1]=0x20;//如果百位为0,十位为0也不显示
      }
    }
         wr_com(0xc0);
         wr_dat(flagdat);//显示符号位
         wr_com(0xc1);
         wr_dat(disdata[0]);//显示百位
         wr_com(0xc2);
         wr_dat(disdata[1]);//显示十位
         wr_com(0xc3);
         wr_dat(disdata[2]);//显示个位
         wr_com(0xc4);
         wr_dat(0x2e);//显示小数点
         wr_com(0xc5);
         wr_dat(disdata[3]);//显示小数位
}

cmp(temp)
{
   
     /* 判断温度是否大于33度,大于则发出蜂鸣声*/         
        if(temp >=33)
        {
             beep = 0;
        //    display(temp);
            delay1ms(10);
             beep= 1;
            delay1ms(10);       }
    /* 判断温度是否小于30度,小于则发出蜂鸣声*/     
        else if(temp<=30)
        {
             beep = 0;
        //    display(temp);
            delay1ms(10);
             beep= 1;
            delay1ms(10);       }      
        
   
}

/********************主程序***********************************/
void main()
{ int temp;
  int delay_50us(uint t) ;
  int delay;
  init_play();//初始化显示
  while(1)
  {
   read_temp();//读取温度
   ds1820disp();//显示
   cmp(tvalue);    //判断是否高于或者低于上下限温度
   }
   
}


程序没问题,只是少了个按键控制的功能求高手们帮忙加个按键部分,谢谢!!!!
搜索更多相关主题的帖子: void 单片机 include 
2012-12-29 12:58
麦香
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:65
专家分:163
注 册:2011-10-18
收藏
得分:4 
同学,去单片机那边发吧

你们要进窄门,因为引向灭亡的门是宽的,路是大的,进去的人也多。
2012-12-29 13:03
梁朝斌
Rank: 4
等 级:业余侠客
帖 子:192
专家分:288
注 册:2012-10-21
收藏
得分:4 
应该在单片机板块发吧

菜鸟也疯狂
2012-12-29 13:31
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:4 
建议去单片机区

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-29 14:27
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:4 
什么键盘?单个按键?矩阵键盘?还是PS2的键盘?

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-12-31 11:26
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:4 
表示不了解,路过》。。

I have not failed completely
2013-01-04 13:05
快速回复:基于ATC89S51单片机温控系统
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018311 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved