#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/**********LED定義********/
sbit LED_RED = P3^5; /*紅燈定義*/
sbit LED_GREEN = P3^6; /*綠燈定義*/
/*********74HC139定義******/
sbit LA=P2^0;
sbit LB=P2^1;
/*********ADC0831定義*******/
sbit SCL2=P1^4;
sbit DO=P1^5;
sbit CS2=P1^3;
uchar code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; /*數碼管數值*/
uchar temp; /*溫度*/
/**************延時****************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Display(uint dat) /*顯示溫度值*/
{
uchar ge,shi,bai,qian;
qian = dat/1000%10;
bai = dat/100%10;
shi = dat/10%10;
ge = dat%10;
LA=0;LB=0;
P0 = Tab[qian];
delay(10);
LA=1;LB=0;
P0 = Tab[bai];
delay(10);
LA=0;LB=1;
P0 = Tab[shi];
delay(10);
LA=1;LB=1;
P0 = Tab[ge];
delay(10);
}
/***********讀數模轉換數據********************************************************/
unsigned char ad0831read(void)
{
unsigned char i=0,tmp=0;
DO=1;
CS2=0;
_nop_();
_nop_();
SCL2=0;
_nop_();
_nop_();
SCL2=1;
_nop_();
_nop_();
SCL2=0;
_nop_();
_nop_();
SCL2=1;
_nop_();
_nop_();
SCL2=0;
_nop_();
_nop_();//MSB是在第二個下降沿輸出的,即0-1-0-1-0
for(i=0;i<8;i++)//這個地方沒有理解,tmp是十進制還是二進制?如果是二進制數,怎么沒有轉化成十進制的過程?
{
tmp<<=1;
if(DO)
tmp++;
SCL2=1;
_nop_();
_nop_();
SCL2=0;
_nop_();
_nop_();
}
CS2=1;
return tmp;
}
/**********主函數************/
void main()
{
unsigned long adc;
while(1)
{
adc = ad0831read(); /*從ADC0831讀取量化后的數值*/
adc = adc = adc*19.607843; /*將量化后的數值轉換成實際電壓*/
temp = (adc*40)/1000; /*根據實際電壓換算成溫度值*/
Display(temp); /*將溫度顯示在LED上*/
if(temp > 80) /*當溫度高于80度,紅燈亮*/
{
LED_RED = 1;
LED_GREEN = 0;
}
else /*當溫度低于80度,綠燈亮,*/
{
LED_RED = 0;
LED_GREEN = 1;
}
}
}

|