找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机按键2和3都没反应,温度也读不进去,有人帮忙看看嘛

[复制链接]
跳转到指定楼层
楼主
#include <reg52.h>                         //调用单片机头文件
#include <intrins.h>
#include "common.h"
#include "lcd1602.h"
#include "DS18B20_One.h"
#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535



#define  GEAR1                  65   //1档
#define  GEAR2                  50   //2档
#define  GEAR3                  40   //3档
#define  GEAR4                  30   //4档
#define  GEAR5                  25   //5档
#define  GEAR6                  20   //6档
#define  GEAR7                  15   //7档
#define  GEAR8                  10   //8档
#define  GEAR9                  5    //9档

sbit Motor = P3^4;//风扇
sbit RTHW = P1^4;//人体红外

sbit key1 = P1^1;//加
sbit key2 = P1^2;//减
sbit key3 = P1^3;//切换

unsigned char IrValue[6];
unsigned char Time;

unsigned char T_max = 30;
uchar PWM_Val = 0xFF;
uchar count = 0;

unsigned char shoudong = 1;//手动调节档位

bit Auto_flag = 1;
bit on_0ff = 1;

/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(uint i)
{
        while(i--);        
}

void Timer0Init(void)//11.0592M,定时100us
{
                TMOD |= 0x01;
            TL0 = 0xA4;  
                TH0 = 0xFF;
                ET0 = 0;
                TR0 = 1;
                EA = 1;
}


void display_Max()//显示上限值
{
                lcd_write_char(2,1,T_max/10+'0');
                lcd_write_char(3,1,T_max%10+'0');
}

void keyscan()//按键扫描
{
                if(key1 == 0)//加键按下
                {
                         delay_ms(10);
                         if(key1 == 0)
                         {
                                
                                  if(Auto_flag==1)
                                        {           while(!key1);
                                                 if(T_max < 99)//最大只能到99
                                                 {
                                                                T_max++;
                                                 }
                                                 display_Max();//显示
                                                
                                    }
                                   else
                                    {
                                                if(shoudong < 10)
                                                        shoudong++;
                                     }
                        }
                        
                }
        else if(key2 == 0)//减键按下
                {
                         delay_ms(10);
                         if(key2 == 0)
                         {
                                    while(!key2);
                                   if(Auto_flag==1)
                                         {
                                                         if(T_max > 0)//最小只能到0
                                                         {
                                                                        T_max--;
                                                         }
                                                         display_Max();//显示
                                        }
                                        else
                                        {
                                                        if(shoudong > 1)
                                                                shoudong--;
                                        }
                        }
                }
        else if(key3 == 0)//切换键按下
                        {
                                 delay_ms(10);
                                 if(key3 == 0)
                                 {
                                                 while(!key3);
                                                 Auto_flag = ~Auto_flag;
                                             if(Auto_flag==0)
                                                 {
                                                        
                                                        lcd_write_str(12, 0, "SD");
                                                        Motor = 1;
                                                 }
                            }
                     }               
}

void PWM_Dispose(uchar x)//PWM档位调节
{
                switch(x)
                {
                                case(1):PWM_Val = GEAR1;lcd_write_str(14,1,"1 ");break;
                                case(2):PWM_Val = GEAR2;lcd_write_str(14,1,"2 ");break;
                                case(3):PWM_Val = GEAR3;lcd_write_str(14,1,"3 ");break;
                                case(4):PWM_Val = GEAR4;lcd_write_str(14,1,"4 ");break;
                                case(5):PWM_Val = GEAR5;lcd_write_str(14,1,"5 ");break;
                                case(6):PWM_Val = GEAR6;lcd_write_str(14,1,"6 ");break;
                                case(7):PWM_Val = GEAR7;lcd_write_str(14,1,"7 ");break;
                                case(8):PWM_Val = GEAR8;lcd_write_str(14,1,"8 ");break;
                                case(9):PWM_Val = GEAR9;lcd_write_str(14,1,"9 ");break;
                                case(10):PWM_Val = 0;Motor = 1;lcd_write_str(14,1,"10");break;
                                default:PWM_Val = 0;Motor = 1;lcd_write_str(14,1,"10");break;
                }
}

void        temp_dispose(int temp)//温度控制风扇处理,总共10档
{
                if(temp        <= T_max)//如果实际温度低于上限,关闭风扇
                {
                          PWM_Val = 0xFF;
                          Motor = 0;
                          lcd_write_str(14,1,"--");
                }
                else
                {
                                PWM_Dispose(temp - T_max);//PWM调节,温度高于上限,每高于一度档位增加一档
                }
}

/*******************************************************************************
* 函 数 名         : datapros()
* 函数功能                   : 温度读取处理转换函数
* 输    入         : temp
* 输    出         : 无
*******************************************************************************/

void datapros()         
{
           int temp=0;
        ET0 = 0;
        temp = DS18B20_TF();//读取温度值
        ET0 = 1;
          //显示温度
                lcd_write_char(6,0,temp % 100 / 10+'0');
                lcd_write_char(7,0,temp % 10+'0');

                if(Auto_flag)//在自动模式下,感应到有人,并且温度高于上限,开启风扇
                {
                        lcd_write_str(12, 0, "Auto");
                          if(RTHW == 1)
                                {
                                        temp_dispose(temp);
                                }
                                else
                                {        
                                          PWM_Val = 0xFF;
                                          Motor = 0;
                                          lcd_write_str(14,1,"--");
                                }
                }
                else//手动模式下,Auto不显示
                {
                                lcd_write_str(12, 0, "    ");
                }

}

void main()
{
                  uint cnt = 0;
        
            Motor = 0;//关闭风扇
                lcd_init();//1602初始化
                Timer0Init();//开启定时器
                DS18B20_TF();//温度初始化
                lcd_write_str(0, 0, " Ds18b20 Init...");
                delay_ms(1000);
                lcd_write_str(0, 0, "Temp:   C       ");
                lcd_write_str(0, 1, "M:  C    Gear:  ");
            display_Max();
                while(1)
                {
                          keyscan();

                            if(Auto_flag == 0)
                                        {
                                                
                                                
                                                        
                                                        if(on_0ff)//不是在关闭状态下,执行手动档位
                                                        {
                                                                PWM_Dispose(shoudong);
                                                        }
                                                        else//关闭风扇
                                                        {
                                                                        PWM_Val = 200;
                                                                        Motor = 0;
                                                                        lcd_write_str(14,1,"--");
                                                        }
                                        }
                        
                        if(cnt++ > 100)//延时一段时间
                                {
                                                cnt = 0;
                                                datapros();
                                }
                                delay_ms(1);
                }
}



void Tim0_str()interrupt 1 using 2//定时器中断1,用于PWM调节
{
                TL0 = 0xA4;
                TH0 = 0xFF;
        
                count++;
                if(count > 200)//20毫秒一个周期
                        count = 0;
                if(count >= PWM_Val)
                        Motor = 1;
                else
                         Motor = 0;
}




捕获.PNG (41.68 KB, 下载次数: 54)

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

使用道具 举报

沙发
ID:584814 发表于 2020-5-7 09:38 | 只看该作者
程序不全比如DS18B20_TF怎么读数都不清楚怎么判定问题
回复

使用道具 举报

板凳
ID:282850 发表于 2020-5-7 11:14 | 只看该作者
设计、调试程序有绝招的,不是你这样搞,别人也不好帮你
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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