#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;
}
}
}
|