找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1907|回复: 8
收起左侧

单片机ds18b20温度检测程序控制控制问题请教

[复制链接]
ID:428428 发表于 2019-6-8 21:08 | 显示全部楼层 |阅读模式
我写了一个ds18b20的程序,温度部分已经写好了,其中有一个检测温度大于设定值时led点亮小于则不亮,可是当我写好时,利用按键控制设定温度
,大于时led点亮,小于时led却不熄灭是怎么回事?求大神解答!!!

if(temp>b)
{
led1=1;
}
else
{
led1=0;



回复

使用道具 举报

ID:93224 发表于 2019-6-9 17:29 | 显示全部楼层
这个要结合你写的按键程序和控制程序两者一起,只看这个说明不了什么问题
回复

使用道具 举报

ID:207421 发表于 2019-6-9 20:37 | 显示全部楼层
你说你的温度和其它部分都正常,
又舍不得发源码,
那么你直接这样测试下:
char i=100,j=99; //改这数字,看看LED状况
if(i>j)
{
    led1=0;
}
else
{
    led1=1;
}
测试下
回复

使用道具 举报

ID:428428 发表于 2019-6-10 10:25 | 显示全部楼层
lwh999995 发表于 2019-6-9 20:37
你说你的温度和其它部分都正常,
又舍不得发源码,
那么你直接这样测试下:

啊,没有舍不得啊,只是没想那么多
回复

使用道具 举报

ID:428428 发表于 2019-6-10 10:30 | 显示全部楼层
本帖最后由 74521 于 2019-6-10 12:51 编辑
lele5211314 发表于 2019-6-9 17:29
这个要结合你写的按键程序和控制程序两者一起,只看这个说明不了什么问题

sbit key1=P0^0;
sbit key2=P0^1;
sbit led1=P0^6;
sbit led2=P0^7;
u8 num[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/*
        此函数功能是将所有I/O口配置为准双向I/O口
*/

int b=20;
int        temp;
int i;
int j;


unsigned char code CharCode1[]="  大学";
unsigned char code CharCode2[]="设定温度:    ";
unsigned char code CharCode3[]="环境温度:     度";
unsigned char code CharCode4[]="  制作 :";
char num1;
unsigned int aa=0,bb=0,cc=0,dd=0,ee=0;
void LcdDisplay(int);
void init12864xian();  //初始化LCD12864显示实验名称
/*

        此函数功能是将所有I/O口配置为准双向I/O口

*/

void init_GPIO()
{
        P0M0=P0M1=0x00;
        P1M0=P1M1=0x00;
        P2M0=P2M1=0x00;
        P3M0=P3M1=0x00;
        P4M0=P4M1=0x00;
        P5M0=P5M1=0x00;
}
/*

     主函数

*/

u8 key()
{
        u8 num=0;
        P0=0xff;
        if(key1==0)
        {
                delay(10);
                if(key1==0)
                {
       b=b+1;
                        while(key1==0);
                }
        }
        if(key2==0)
        {
                delay(10);
                if(key2==0)
                {
                 b=b-1;
                        while(key2==0);
                }
        }
        
}

void main()
{
        u8 key_num=0;
        init_GPIO();
        LCD12864_Init();                         //初始化LCD12864
        init12864xian();                         //初始化LCD12864显示实验名称
        while(1)
        {
        LcdDisplay(Ds18b20ReadTemp());           //实时读取温度
                key();
                if(key_num!=0)
                   P2=~num[key_num-1];
                      LCD12864_SetWindow(1, 5);
                            LCD12864_WriteData(b/10%10+0x30);
                            LCD12864_WriteData(b%10+0x30);   //显示设定值
                char i=temp,j=b;
if(i>j)
{
led1=1;
}
else
{
led1=0;
}
        }
}
/*

     温度额读取及计算显示函数

*/
void LcdDisplay(int temp)          //lcd显示
{
           float tp;  
        if(temp< 0)                                //当温度值为负数
          {
                temp=temp-1;           //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
                temp=~temp;
                tp=temp;
                temp=tp*0.0625*100+0.5;        
                                     //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
                                    //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
                                   //算由?.5,还是在小数点后面。
          }
         else
          {                        
               
                tp=temp;                           temp=tp*0.0625*100+0.5;        
                                       }
//        aa= temp / 10000;
        bb = temp % 10000 / 1000;
        cc = temp % 1000 / 100 ;
        dd = temp % 100 / 10;
        ee = temp % 10;
        LCD12864_SetWindow(2,5);
//        LCD12864_WriteData(aa+0x30);
        LCD12864_WriteData(bb+0x30);
        LCD12864_WriteData(cc+0x30);
        LCD12864_WriteData('.');
        LCD12864_WriteData(dd+0x30);
//        LCD12864_WriteData(ee+0x30);
}
/*

     初始化LCD12864显示实验名称

*/
void init12864xian()
{
        unsigned char i;
        LCD12864_SetWindow(0, 0);
                while(CharCode1!='\0')
                {
                        LCD12864_WriteData(CharCode1);
                    i++;
                }
                i=0;
                LCD12864_SetWindow(1,0);
                while(CharCode2!='\0')
                {
                        LCD12864_WriteData(CharCode2);
                    i++;
               
                }
//                 LCD12864_SetWindow(1,7);
               
                i=0;
                                  LCD12864_SetWindow(2, 0);
                while(CharCode3!='\0')
                {
                        LCD12864_WriteData(CharCode3);
                    i++;
                }
               
               
                        i=0;
                  LCD12864_SetWindow(3, 0);
                while(CharCode4!='\0')
                {
                        LCD12864_WriteData(CharCode4);
                    i++;
                }
//             LCD12864_WriteData('度');
               
回复

使用道具 举报

ID:155507 发表于 2019-6-10 18:54 | 显示全部楼层
你的变量定义不清不楚的,

首先你先看下 int        temp;

再看你的 void LcdDisplay(int temp)  

这两个  temp 变量 是不一样的
回复

使用道具 举报

ID:308437 发表于 2019-6-11 00:36 | 显示全部楼层
这程序应该是没有问题的,应该是你硬件有问题。线没接好之类的。
回复

使用道具 举报

ID:428428 发表于 2019-6-12 21:07 | 显示全部楼层
yousunny 发表于 2019-6-11 00:36
这程序应该是没有问题的,应该是你硬件有问题。线没接好之类的。

好的,谢谢,我在检查一下
回复

使用道具 举报

ID:428428 发表于 2019-6-12 21:09 | 显示全部楼层
angmall 发表于 2019-6-10 18:54
你的变量定义不清不楚的,

首先你先看下 int        temp;

新手正在学习,那要怎么定义呢
回复

使用道具 举报

10#
无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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