找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2567|回复: 0
打印 上一主题 下一主题
收起左侧

怎么实现下面的程序不管哪路温度超限都报警

[复制链接]
跳转到指定楼层
楼主
ID:74571 发表于 2015-3-19 21:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<intrins.h>
#include <string.h>
#include <stdio.h>
#define uchar unsigned char
#define uint  unsigned int

sbit RS=  P2^0  ;                                                        //液晶显示引脚定义
sbit RW=  P2^1  ;
sbit EN=  P2^2  ;
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
float n;
uint  t=0,dian=0;
uchar LCD_LINE_ONE[16]={"tp1:           "};                //定义显示屏幕
uchar LCD_LINE_TWO[16]={"tp2:           "};


int Tm;
int  fushu=0 ;
sbit DQ= P3^3;                                                                                  
static unsigned char get_serial[]={                  //获取的八个DS18B20内部RAM64位序列号
   224, 0,0,0,  184,  197, 50, 40,
   215, 0,0,0,  184,  197, 51, 40
};
void delay( ms )                                          //用于液晶显示的延时函数
{
          int i ;
          while(ms--)
          {
               for(i=0 ;i<5 ;i++ )  ;

          }
}

uchar Read_LCD_State()                                  //读取液晶显示的状态
{
        uchar state;
        RS=0;RW=1;EN=1;delay(1);
        state=P0;
        EN = 0;delay(1);
        return state;
}
void LCD_Busy_Wait()                                 //如果忙则等待函数
{
        while((Read_LCD_State()&0x80)==0x80);
        delay(5);
}

void Write_LCD_Zhilin(uchar zl)                          //液晶显示写指令函数
{
        LCD_Busy_Wait();
        RS=0;RW=0;
        EN=0;
        P0=zl;
        EN=1;
        delay(1);
        EN=0;       
}
void Write_LCD_shuju(uchar date)             //液晶显示写数据函数
{
        LCD_Busy_Wait();
        RS=1;RW=0;
        EN=0;
        P0=date;
        EN=1;
        delay(1);
        EN=0;       
}
void LCD_INIT()                                //液晶显示初始化
{
    Write_LCD_Zhilin(0x38);          // 显示模式设置
        delay(1);                                  
        Write_LCD_Zhilin(0x01);          // 显示清屏
        delay(1);                                 
        Write_LCD_Zhilin(0x06);          // 光标移动设置
        delay(1);
        Write_LCD_Zhilin(0x0c);          // 开及光标设置
        delay(1);
}
void Display_LCD_String(uchar p,uchar *s)                  //液晶显示写入函数
{
        uchar i;
        Write_LCD_Zhilin(p|0x80)        ;    //写地址高位为一
        for(i=0;i<16;i++)
        {
                Write_LCD_shuju(s[i]);
                delay(1);        
        }
}
/***************************************************************************************/
void delays(int us)                                           //用于DS18B20的延时函数
{ int s;
for ( s=0; s<us; s++);
}
void rst(void)                                                //DS18B20初始化
{
DQ = 1;
delays(2);
DQ = 0;
delays(30); //精确延时 480~960us
DQ = 1;
delays(8);
}
void write(unsigned char ku)                //DS18B20写函数
{
int i=0;
     for (i=0;i<8;i++)
    {
                DQ=0;
                DQ =ku&0x01;
                delays(3);
                DQ=1;
                ku>>=1;
    }
}
void match_rom(unsigned char *rom)          //DS18B20匹配ROM函数
{
unsigned char i;
rst();                                                          //初始化
write(0x55);                                          //匹配ROM
for(i=8;i>0;i--)
{
          write(*(rom+i-1));
}

}
unsigned int read(void)                          //DS18B20读函数,每次读16位
{
        int i=0;
        unsigned int u=0;
    for (i=0;i<16;i++)
    {
                DQ=0;
                u>>=1;
                DQ=1;
                if(DQ) u|=0x8000;
                delays(4);
     }
    return (u);
}
int  read0(unsigned char *seria)        //读取对应温度值并转换函数
{
     int temperature ;
    unsigned int tp;
    unsigned int lsb;
    rst();                                  //初始化
    write(0xCC);                  //跳过RAM
        write(0x44);                  //温度转换
        rst();                                  //再次初始化
        write(0xCC);
        match_rom(seria);    //匹配ROM函数调用
                 write(0xBE);         //读取存储器指令
        tp=read();                         //读取温度值
        if((tp&0xf800)==0xf800)                //判断正负数
            {
                     fushu=1 ;
                      tp=~tp+1 ;
                        n=tp;
                    lsb=(unsigned int)(tp*6.25);
                        dian=lsb%100;                  //取小数部分
               
                     temperature=lsb/100;

                }
     else
            {
                    fushu=0;
                    lsb=(unsigned int)(tp*6.25);
                        dian=lsb%100;  
               
                     temperature=lsb/100;
                        n=temperature;

             }
     return(temperature);
}

/*****************************************************************************************/
void main()
{
      uint i ;
          int m=10;
          LCD_INIT();
          EA=0 ;                 //使用DS18B20禁止任何中断
          while(1)
         {          
              for(i=0;i<2;i++)
                  {       
                      Tm=read0(get_serial+i*8);
                                if(i==0)                                   //判断是第几个的数据
                                {
                                           if(fushu==0)                                           //判断是否加负号
                                                sprintf(LCD_LINE_ONE+5," %d", Tm);
                                           if(fushu==1)
                                                    sprintf(LCD_LINE_ONE+5,"-%d", Tm);
                                       sprintf(LCD_LINE_ONE+10,".%d",dian);                //加入小数部分
                                           Display_LCD_String(0x00,LCD_LINE_ONE);
                                           if(Tm<m)
                                          {
                                            led1=0 ;
                                           }
                                           else
                                           {
                                           led1=1;
                                           }
                                 }
                                if(i==1)
                                {  
                                       if(fushu==0)       
                                                 sprintf(LCD_LINE_TWO+5," %d", Tm);
                                           if(fushu==1)
                                                     sprintf(LCD_LINE_TWO+5,"-%d", Tm);
                                       sprintf(LCD_LINE_TWO+10,".%d",dian);
                                           Display_LCD_String(0x40,LCD_LINE_TWO);
                       
               
                                }

                  }

               
         }
}
如果能查出具体哪个超限最好,最好备注一下

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表