找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3099|回复: 2
收起左侧

基于单片机的微波炉控制,所有功能可用,为什么我温度乱跳

[复制链接]
ID:250518 发表于 2018-3-8 21:08 | 显示全部楼层 |阅读模式
30黑币
本帖最后由 迷失朋友 于 2018-3-8 21:12 编辑

1520514314(1).png 微信截图_20180308210958.png 微信截图_20180308211018.png 求求大神解救我,是我程序问题吗?
#include <reg51.h>
#define  uint unsigned int
#define  uchar unsigned char
uchar codevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //七段数码管显示码,显示0~9
uint tt=20;        // 为了计时一秒,定时器一次中断为50ms,20*50ms=1s
uint mt=150;      //电机速度
uint st=1;       //扫描速度
uint signalm;    //电机信号
uint signald;    //显示信号
uint minutetens,minuteuints,secondtens,seconduints;//时间分、秒十位个位
uint temphundreds,temptens,tempuints;//温度百位十位个位
uint tmax=30;    //火力上限
uint check=0;    //检测信号
uint m;        //全局温度
int count_s=0;    //时间
sbit P10=P1^0;                //引脚定义
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P30=P3^0;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
sbit DQ=P2^7;   //定义DS18B20总线I/O

void T_initalize()
{
        EA=1;            //开中断
        ET0=1;
        ET1=1;           //定时器 中断允许
        TMOD=0x11;       //定时器T0 定时   方式一
    TR1=1;
        TH0=0x3c;
        TL0=0xaf;
        TH1=0xfc;
        TL1=0x18;
//12M 晶振,65536-15536=50000,50000us*20=1000000us=1s
}

void Delay(uint i)//延时
{
while( i-- );
}

void Init_DS18B20(void)//初始化DS18B20
{
uchar n;
DQ=1;
Delay(8);
DQ=0;
Delay(80);   //500us
DQ=1;
Delay(8);
n=DQ;
Delay(4);
}

uchar Readonechar(void)//读一个字节
{
  uchar i,value;
for(i=0;i<8;i++)
{
  DQ=0;       //给脉冲
  value>>=1;
  DQ=1;       //给脉冲
  if(DQ)
  value|=0x80;
  Delay(4);
}
return value;
}

void Writeonechar(uchar dat)//写一个字节
{
  uchar i;
for(i=0;i<8;i++)
{
  DQ=0;
  DQ=dat&0x01;
  Delay(4);
  DQ=1;
  dat>>=1;
}
Delay(4);
}

void Tmperature_change(void) //发送温度转换命令
{
  Init_DS18B20();
  Writeonechar(0xCC);  //跳过读序号列号的操作
  Writeonechar(0x44);  //启动温度转换
}

uint Read_temperature(void)//读取温度
{
  uchar a=0;
  uchar b=0;
  uint t=0;
  Init_DS18B20();
  Tmperature_change();
  Delay(300);
  Init_DS18B20();
  Writeonechar(0xCC);  //跳过读序号列号的操作
  Writeonechar(0xBE);  //读取温度寄存器
  a=Readonechar();     //读低8位
  b=Readonechar();    //读高8位
  t=b;
  t<<=8;
  t=t|a;
  t=t*0.0625;
  return(t);
}

void Temperature()//显示温度
{
uint i;
i=Read_temperature();  //获取温度值
temphundreds=i/100;            //百位
temptens=i%100/10;            //十位
tempuints=i%10;               //个位
m=i;
}

void Time()//显示时间
{
minutetens=count_s/600;             //取分的十位
minuteuints=(count_s/60)%10;        //取分的个位                                 
secondtens=(count_s%60)/10;         //取秒的十位
seconduints=(count_s%60)%10;                   //取秒的个位
}

void Display_initalize()
{
P2=0xff;
P0=0x40;
P20=0,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
Delay(120);
P2=0xff;
P0=0x40;
P20=1,P21=0,P22=1,P23=1,P24=1,P25=1,P26=1;
Delay(120);
P2=0xff;
P0=0x40;
P20=1,P21=1,P22=0,P23=1,P24=1,P25=1,P26=1;
Delay(120);
P2=0xff;
P0=0x40;
P20=1,P21=1,P22=1,P23=0,P24=1,P25=1,P26=1;
Delay(120);
P2=0xff;
P0=0x40;
P20=0,P21=1,P22=1,P23=1,P24=0,P25=1,P26=1;
Delay(120);
P2=0xff;
P0=0x40;
P20=0,P21=1,P22=1,P23=1,P24=1,P25=0,P26=1;
Delay(120);
P2=0xff;
P0=0x40;
P20=0,P21=1,P22=1,P23=1,P24=1,P25=1,P26=0;
Delay(120);
P2=0xff;
}

void Motor()//电机
{
switch(signalm)
{case 0:P33=1,P34=0,P35=0,P36=0;signalm=1;break;
case 1:P33=1,P34=1,P35=0,P36=0;signalm=2;break;
case 2:P33=0,P34=1,P35=0,P36=0;signalm=3;break;
case 3:P33=0,P34=1,P35=1,P36=0;signalm=4;break;
case 4:P33=0,P34=0,P35=1,P36=0;signalm=5;break;
case 5:P33=0,P34=0,P35=1,P36=1;signalm=6;break;
case 6:P33=0,P34=0,P35=0,P36=1;signalm=7;break;
case 7:P33=1,P34=0,P35=0,P36=1;signalm=0;break;
}
}

void Display()
{
switch(signald)
{case 0:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
        P0=codevalue[minutetens];
        P20=0,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
        signald=1;
        break;
case 1:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
       P0=codevalue[minuteuints];
           P20=1,P21=0,P22=1,P23=1,P24=1,P25=1,P26=1;
           signald=2;
           break;
case 2:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
       P0=codevalue[secondtens];
           P20=1,P21=1,P22=0,P23=1,P24=1,P25=1,P26=1;
           signald=3;
           break;
case 3:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
       P0=codevalue[seconduints];
           P20=1,P21=1,P22=1,P23=0,P24=1,P25=1,P26=1;
           signald=4;
           break;
case 4:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
       P0=codevalue[temphundreds];
           P20=1,P21=1,P22=1,P23=1,P24=0,P25=1,P26=1;
           signald=5;
           break;
case 5:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
       P0=codevalue[temptens];
           P20=1,P21=1,P22=1,P23=1,P24=1,P25=0,P26=1;
           signald=6;
           break;
case 6:P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
       P0=codevalue[tempuints];
           P20=1,P21=1,P22=1,P23=1,P24=1,P25=1,P26=0;
           signald=0;
           break;
}
}

void Temperature_check()//温度检测
{if(check==1)
{
if(m<=tmax)
P17=0;
if(m>tmax)
P17=1;
}
}

void Key_scan()//键位扫描
{   
        if(!P10)
        {
        count_s+=60;      //时间+1分
        if (count_s>6000)
            count_s=0;
        while(!P10);
        }
        
    if(!P11)
        {
        count_s-=60;       //时间-1分
        if (count_s<0)
            count_s=0;
        while(!P11);
        }

        if(!P12)
        {
                tmax=50;      //小火
        }

        if(!P13)
        {
            tmax=80;      //中火
        }

        if(!P14)
        {
                tmax=120;    //大火
        }

        if(!P15)
        {
                     P17=1;
         if(count_s==0)          //如果没有设定时间,不加热,定时器不工作
           { TR0=0;
                        TR1=0;
                        }
         else                    //如果已经设定时间,则开始计时,开始加热
                    {                  
            T_initalize();
            TR0=1;
                        TR1=1;
            check=1;
            P17=0;
            }
        }

        if(!P16)               //停止加热,终止定时器
        {
                 P17=1;
                 TR0=0;
                 TR1=0;
         check=0;
                }
}

void t0() interrupt 1//定时
{        
    TR0=0;
    TH0=0x3c;
        TL0=0xaf;
    tt--;
        if (tt==0)
                {tt=20;
                count_s--;  //时间-1S
        if (count_s==0)  //如果定时已到
            {
                         P17=1;      //停止加热,定时器终止
             TR0=0;
                         TR1=0;
                         check=0;
             P37=0;
                         Delay(500);
                         P37=1;
                         P37=0;
                         Delay(500);
                         P37=1;
                         P37=0;
                         Delay(500);
                         P37=1;
            }
        else
            TR0=1;        //继续定时
                }
    else
        TR0=1;
           
}

void t1() interrupt 3
{
    TH1=0xfc;
        TL1=0x18;
        mt--;
    st--;
        if(mt==0)
        {if(check==1)Motor();
        mt=150;
        }
    if(st==0)
    {Display();
    st=1;
    }
}

void main()
{
uint j;
P37=0;
Delay(500);
P37=1;
Read_temperature();
Delay(150);
T_initalize();
for(j=0;j<100;j++)
{
Display_initalize();
}

while(1)
{
Time();
Temperature();
Key_scan();
Temperature_check();
}
} 微波炉.rar (28.97 KB, 下载次数: 31)

回复

使用道具 举报

ID:250518 发表于 2018-3-8 22:03 | 显示全部楼层
问题解决了,现在新问题,ds18b20加上拉电阻,时钟变慢了,什么情况?
回复

使用道具 举报

ID:289477 发表于 2018-3-9 03:59 | 显示全部楼层

;下载内容使用说明
;----------------------

下载内容的程序需要采用C语言的编译软件打开阅读,也可以使用“UltraEdit”等软件打开阅读或者编辑。
但是这些程序必须使用“Embedded Workbench”集成开发环境进行编译调试。

下载内容的电路图是用Protel99软件画成的,所以必须使用该软件打
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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