|
//設(shè)計要求:智能溫控設(shè)?
//用ADC0809檢測溫度,如果大于設(shè)定溫度則斷開回路,小于
//則進(jìn)行加熱,等于設(shè)定溫度則保持不變
//其中分別用數(shù)碼管顯示設(shè)定溫度與實際溫度
//用兩個按鍵進(jìn)行加減設(shè)定溫度
//收獲ADC0809高位應(yīng)該與單片機低位連接
//在讀取溫度時必須先將P1口復(fù)位為1,不然會發(fā)生短路現(xiàn)象
#include<reg51.h>
#include<intrins.h>
#define Duan P0
sbit wei1=P2^0;//數(shù)碼管選通
sbit wei2=P2^1;
sbit wei3=P2^2;
sbit wei4=P2^3;
sbit Relay=P2^4;//控制電路繼電器閉合,使制冷
sbit Start=P2^5;//AD0809開始轉(zhuǎn)化端口
sbit EOC=P2^6; //ADC0809轉(zhuǎn)化標(biāo)志口
void System_Init(); //系統(tǒng)初始化
unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數(shù)碼管段位
char shezhi=10;
int val;//轉(zhuǎn)化值
char i=0;
void delay1ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void main()
{
System_Init();
while(1)
{
P1=0xff;
Start=0;
Start=1; //開始轉(zhuǎn)化
_nop_();
Start=0;
_nop_();
while(!EOC); //轉(zhuǎn)化結(jié)束
val=(P1*100/256); //量程轉(zhuǎn)化
if(val<=shezhi)//是否繼續(xù)制冷
Relay=0;
else
Relay=1;
}
}
void System_Init()
{
TMOD=0x01;
EA=1;
ET0=1;
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
TR0=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
}
void Time() interrupt 1
{
char i=0;
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
if(i==0)
{wei4=0;wei1=1;P0=M[val%10];i++;delay1ms();}
if(i==1)
{wei1=0;wei2=1;P0=M[val/10];i++;delay1ms();}
if(i==2)
{wei2=0;wei3=1;P0=M[shezhi%10];i++;delay1ms();}
if(i==3)
{wei3=0;wei4=1;P0=M[shezhi/10];i=0;delay1ms();}
}
void int0() interrupt 0
{
shezhi++;
if(shezhi==100)
shezhi=0;
return;
}
void int2() interrupt 2
{
shezhi--;
if(shezhi==0)
shezhi=99;
return;
}
|
|