欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4071|回復: 2
打印 上一主題 下一主題
收起左側

基于單片機的微波爐控制,所有功能可用,為什么我溫度亂跳

[復制鏈接]
跳轉到指定樓層
樓主
30黑幣
本帖最后由 迷失朋友 于 2018-3-8 21:12 編輯

求求大神解救我,是我程序問題嗎?
#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)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表