#include<reg52.h>
#include<iic.h>
#include<onewire.h>
#define uchar unsigned
sfr AUXR=0X8E;//定时器
/************需要的函数*************/
void WS();
void Scan();
void HC573(uchar t);
void SMG2(uchar z,uchar x,uchar c,uchar v,uchar b,uchar n,uchar m,uchar a);
void SMG(uchar addr,uchar value); //第(addr-1)个数码管显示的内容
void Delay(int t); //延迟
void all_SMG(); //消隐功能
void Timer1Init(void);
/**************下面为功能的选择一般选其中的部分****************/
void AD_write(uchar dat);
//读温度
void Read_T();
/***********初始化值****************/
uchar shuzi[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x00,0x40,0x39,0x73};//0~9正常的数字 10~19带小数的数 20为熄灭
//21为-提示符,22以后可以自己加
uchar yi,er,san,si,wu,lu,qi,ba;
//数码管显示的内容
uchar state=1,Tmax=30,Tmin=20,Tmax0,Tmin0,Vdac;
//控制的页面
uchar led=0xff;
//led的显示
int temp,t1=0;
//定时器一的计数;temp为温度
//时钟这里先不用时钟
//独立按键
sbit S4=P3^3;
sbit S5=P3^2;
sbit S6=P3^1;
sbit S7=P3^0;
bit flag4=1;
bit flag5=1;
bit flag6=1;
bit flag7=1;
/**********************按键扫描***************************/
void Scan()
{
/*4 */ if(S4==0) //按下时候扫描
{
Delay(10); //消抖
if(S4==0) //消抖
{
if(flag4!=0) //flag4不按下时候为1按下一瞬间进入下面程序
{
flag4=0; //flag4为0
switch(state) //看是在什么模式的情况下按下的S4
{
case 1: state=3;
Tmax0=Tmax;
Tmin0=Tmin;break;
case 2: state=1;
if(Tmax0>=Tmin0)
{
Tmax=Tmax0;
Tmin=Tmin0;
led|=0x08;
}
else
{
led&=~0x08;
}break;
case 3: state=1;
if(Tmax0>=Tmin0)
{
Tmax=Tmax0;
Tmin=Tmin0;
led|=0x08;
}
else
{
led&=~0x08;
}break;
}
}
}
}
else
{
flag4=1; //不按时候归1
}//4
/*5 */ if(S5==0)
{
Delay(10);
if(S5==0)
{
if(flag5!=0)
{
flag5=0;
switch(state)
{
case 1: break;
case 2: state=3;break;
case 3: state=2;break;
}
}
}
}
else
{
flag5=1;
}//5
/*6 */ if(S6==0)
{
Delay(10);
if(S6==0)
{
if(flag6!=0)
{
flag6=0;
switch(state)
{
case 1: break;
case 2: Tmax0++;
if(Tmax0==100)
{Tmax0=99;}break;
case 3: Tmin0++;
if(Tmin0==100)
{Tmin0=99;}break;
}
}
}
}
else
{
flag6=1;
}//6
/*7 */ if(S7==0)
{
Delay(10);
if(S7==0)
{
if(flag7!=0)
{
flag7=0;
switch(state)
{
case 1: break;
case 2:if(Tmax0==0)
{Tmax0=1;} Tmax0--; break;
case 3:if(Tmin0==0)
{Tmin0=1;} Tmin0--; break;
}
}
}
}
else
{
flag7=1;
}//7
}
/***************主函数*******************/
void main()
{
WS(); //关闭外设
while(1)
{
Scan(); //按键的功能
Read_T();
if(temp<Tmin)
{
Vdac=51*2;led=led|0x07&(~0x04);
}
else if(temp<=Tmax)
{
Vdac=51*3;led=led|0x07&(~0x02);
}
else
{
Vdac=51*4;led=led|0x07&(~0x01);
}
AD_write(Vdac);
switch(state)//选择模式显示内容
{
case 1:yi=21;er=20;san=20;si=20;wu=20;lu=20;qi=temp/10%10;ba=temp%10;break;
case 2:yi=22;er=20;san=20;si=Tmax0/10%10;wu=Tmax0%10;lu=20;qi=Tmin0/10%10;ba=Tmin%10;break;
case 3:yi=22;er=20;san=20;si=Tmax0/10%10;wu=Tmax0%10;lu=20;qi=Tmin0/10%10;ba=Tmin%10;break;
}
P0=led;HC573(4);HC573(0); //led部分
SMG2(yi,er,san,si,wu,lu,qi,ba);//数码管显示
}
}
/********必备基本的功能设置**********/
void HC573(uchar t)
{
switch(t)
{
case 0:P2=0X00;break; //关
case 4:P2=P2&0X1F|0X80;break;//led
case 5:P2=P2&0X1F|0XA0;break;//蜂鸣器继电器
case 6:P2=P2&0X1F|0XC0;break;//位选
case 7:P2=P2&0X1F|0XE0;break;//段选
}
}
void SMG(uchar addr,uchar value)
{
P0=0xff;HC573(7);HC573(0); //消隐
P0=0x01<<addr;HC573(6);HC573(0); //位选
P0=~value;HC573(7);HC573(0);//段选
}
void SMG2(uchar z,uchar x,uchar c,uchar v,uchar b,uchar n,uchar m,uchar a)
{
SMG(0,shuzi[z]);Delay(200);
SMG(1,shuzi[x]);Delay(200);
SMG(2,shuzi[c]);Delay(200);
SMG(3,shuzi[v]);Delay(200);
SMG(4,shuzi[b]);Delay(200);
SMG(5,shuzi[n]);Delay(200);
SMG(6,shuzi[m]);Delay(200);
SMG(7,shuzi[a]);Delay(200);
all_SMG();Delay(100);
}
void all_SMG()
{
P0=0xff;HC573(7);HC573(0);
P0=0xff;HC573(6);HC573(0);
P0=0xff;HC573(7);HC573(0);
}
void WS()
{
P0=0xff;HC573(4);HC573(0);
P0=0x00;HC573(5);HC573(0);
P0=0xff;HC573(6);HC573(0);
P0=0xff;HC573(7);HC573(0);
}
void Delay(int t)
{
while(t--);
}
/*************功能的选择选其中的部分************/
void AD_write(uchar dat)
{
IIC_Start();
IIC_SendByte(0X90);
IIC_WaitAck();
IIC_SendByte(0X40);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
/*************温度**************/
void Read_T()//读取
{
unsigned char LSB,MSB;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay(1000);
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB=Read_DS18B20();
MSB=Read_DS18B20();
Init_DS18B20();
temp=MSB;
temp=temp<<8;
temp=temp|LSB;
if((temp&0xf800)==0x0000)
{
temp=temp>>4;
}
}
11届10月份
最新推荐文章于 2024-07-23 15:46:40 发布