找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求教这个单片机程序怎么能将报警下限设为负数 求大神指教

[复制链接]
跳转到指定楼层
楼主
260黑币
#include<reg51.h>
#include<intrins.h>   
#define dm P0          //段码输出口
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^7;          //温度输入口
sbit w0=P2^0;          //数码管4
sbit w1=P2^1;          //数码管3
sbit w2=P2^2;          //数码管2
sbit w3=P2^3;          //数码管1
sbit beep=P3^7;   //蜂鸣器
sbit yellow=P1^0;          //指示灯
sbit   led=P1^1;  //  高温指示灯
sbit set=P3^0;           //低温指示灯
sbit add=P3^1;
sbit dec=P3^2;
int temp1=0;         
uint h;
uint temp;
uchar r;
uchar high=80;
int low=-20;
uchar sign;
uchar q=0;
uchar tt=0;
uchar scale;
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                        0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};          //小数断码表
uchar code table_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
                            0x7d,0x07,0x7f,0x6f,0x00,0x40};          //共阴LED段码表"0""1""2""3""4""5""6""7""8""9""不亮""-"
uchar code table_dm1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};        //个位带小数点的断码表
uchar data temp_data[2]={0x00,0x00};//读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共四个数据和一个运算暂用
/***************11us延时函数***************/
void delay(uint t)
{
        for(;t>0;t--);
}
void scan()
{
        int j;
        for(j=0;j<4;j++)
        {
                switch(j)
                {
                        case 0:
                        dm=table_dm[display[0]];;
                        w0=0;
                        delay(300);
                        w0=1;                                                //小数点
                        case 1:
                        dm=table_dm1[display[1]];
                        w1=0;
                        delay(300);
                        w1=1;                                                //个位
                        case 2:
                        dm=table_dm[display[2]];
                        w2=0;
                        delay(300);
                        w2=1;                                            //十位
                        case 3:
                        dm=table_dm[display[3]];
                        w3=0;
                        delay(300);
                        w3=1;                                                //百位
                }
        }
}
/**************DS18B20初始化**************/
ow_reset(void)
{
        char presence=1;
        while(presence)
        {
                while(presence)
                {
                        DQ=1;_nop_();_nop_();
                        DQ=0;
                        delay(50);
                        DQ=1;
                        delay(6);
                        presence=DQ;
                }
                delay(45);
                presence=~DQ;
        }
        DQ=1;        
        return presence;
}
/****************写命令函数*****************/
void write_byte(uchar val)
{
        uchar i;
        for(i=8;i>0;i--)
        {
                DQ=1;_nop_();_nop_();
                DQ=0;_nop_();_nop_();_nop_();_nop_();
                DQ=val&0x01;
                delay(6);
                val=val>>1;               
        }
        DQ=1;
        delay(1);
}        
/****************读一个字节函数*******************/
uchar read_byte(void)
{
        uchar i;
        uchar value=0;
        for(i=8;i>0;i--)
        {
                DQ=1;_nop_();_nop_();
                value>>=1;
                DQ=0;_nop_();_nop_();_nop_();_nop_();
                DQ=1;_nop_();_nop_();_nop_();_nop_();
                if(DQ)value|=0x80;
                delay(6);
        }
        DQ=1;        
        return value;
}
/***************读取温度函数***************/
read_temp()
{
        ow_reset();
        delay(200);
        write_byte(0xcc);
        write_byte(0x44);
        ow_reset();
        delay(1);
        write_byte(0xcc);
        write_byte(0xbe);
        temp_data[0]=read_byte();
        temp_data[1]=read_byte();
        temp=temp_data[1];
        temp<<=8;
        temp=temp|temp_data[0];
        return temp;
}
/***************温度数据处理函数***************/
work_temp(uint tem)
{
        uchar n=0;
        if(tem>6348)
        {
                tem=65536-tem;
                n=1;
        }
        display[4]=tem&0x0f;
        display[0]=ditab[display[4]];
        display[4]=tem>>4;
        display[3]=display[4]/100;
        display[1]=display[4]%100;
        display[2]=display[1]/10;
        display[1]=display[1]%10;
        r=display[1]+display[2]*10+display[3]*100;
        if(!display[3])
        {
                display[3]=0x0a;
                if(!display[2])        
                {
                        display[2]=0x0a;
                }
        }
        if(n)
        {
                display[3]=0x0b;
        }
        return n;
}
/***************报警提示电路***************/
void BEEP()
{

        if(r>=high&&r<129)
        {
                led=0;
        }
        else
        {
                led=1;
        }
        if(r<low)
        {
                yellow=~yellow;
        }
        else
        {
                yellow=1;
        }
        if((r>=high&&r<129)||(r<low))
        {
                beep=!beep;
        }
                else
        {
                beep=1;
        }}
/***************温度显示转换**************/
void xianshi(int horl)
{
        int n=0;
        if(horl>128)
        {
                horl=256-horl;
                n=1;
        }
        display[3]=horl/100;
        display[3]=display[3]&0x0f;
        display[2]=horl%100/10;
        display[1]=horl%10;
        display[0]=0;
        if(!display[3])
        {
                display[3]=0x0a;
                if(!display[2])        
                {
                        display[2]=0x0a;
                }
        }
        if(n)
        {
                display[3]=0x0b;
        }                                                                                
}
/**************按键设置*************/
void keyscan()
{
        int temp1;    //最高温度和最低温度标志位
        if(set==0)
        {
                while(1)
                {
                        delay(500);//消抖
                        if(set==0)
                        {
                                temp1++;
                                while(!set)
                                scan();
                        }
                        if(temp1==1)
                        {
                                xianshi(high);
                                scan();
                                if(add==0)
                                {
                                        while(!add)
                                        scan();
                                        high+=1;
                                }
                                if(dec==0)
                                {
                                        while(!dec)
                                        scan();
                                        high-=1;
                                }
                        }
                        if(temp1==2)
                        {
                                xianshi(low);
                                if(add==0)
                                {
                                        while(!add)
                                        scan();
                                        low+=1;
                                }
                                if(dec==0)
                                {
                                        while(!dec)
                                        scan();
                                        low-=1;
                                }
                                scan();
                        }
                        if(temp1>=3)
                        {
                                temp1=0;
                                break;
                        }
                }
        }
}
/**************主函数*************/
void main()
{
        dm=0x00;
        w0=0;
        w1=0;
        w2=0;
        w3=0;
        for(h=0;h<4;h++)
        {
                display[h]=0;
        }
        ow_reset();
        write_byte(0xcc);
        write_byte(0x44);
        for(h=0;h<100;h++)
        {
                scan();
        }
        while(1)
        {
                if(temp1==0)
                {
                        work_temp(read_temp());
                scan();
                BEEP();
                keyscan();
                }
                else        keyscan();
            
        }
}
/*****************结束*****************//*****************结束*****************/

1592719910(1).png (88.98 KB, 下载次数: 50)

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

使用道具 举报

沙发
ID:213173 发表于 2020-6-21 21:33 | 只看该作者
从DS18B20读取的温度值是int型数据,最高位是符号位,低4位是小数位。如果取整数设置报警上下限可以把此int型数据转换成char型数据。具体方法:把读取的int型数据右移4位去掉小数,再把符号位右移4位,替换第8位就得到一个char型数据。范围+127~-128,实际DS18B20最低-55。也就是可以在+127~-55°C范围内设置报警上下限。如果精度要求高直接用从DS18B20读取的int型数据设置报警上下限。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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