本帖最后由 迷失朋友 于 2018-3-8 21:12 編輯
1520514314(1).png (157.73 KB, 下載次數: 81)
下載附件
2018-3-8 21:12 上傳
微信截圖_20180308210958.png (163.62 KB, 下載次數: 61)
下載附件
2018-3-8 21:12 上傳
微信截圖_20180308211018.png (165.41 KB, 下載次數: 63)
下載附件
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)
2018-3-8 21:08 上傳
點擊文件名下載附件
|