个人写作;因为他用的矩阵键盘,我换了S4显示切换,S5模式切换,S6 ,S7-
考前熟悉自己的模块,感觉按套路写题。ok;这种模式的判断可以用函数写出来运行main这不多,欢迎讨论
#include<reg52.h> #include<iic.h> #include<onewire.h> #define uchar unsigned char sfr AUXR=0X8E;//定时器 /************需要的函数*************/ void WS(); void Scan(); void HC573(uchar t); void SMG2(); void SMG(uchar addr,uchar value); //第(addr-1)数字管显示的内容 void Delay(int t); //延迟 void all_SMG(); //消隐功能 void Timer1Init(void); /**************以下是功能选择的一般部分****************/ //读温度 void Read_T(); void AD_write(uchar dat); //输出 /***********初始化值****************/ 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,0x50};//0~9正常的数字 10~19带小数的数 20为熄灭 //21-提示符,22C,23P,24R uchar yi,er,san,si,wu,lu,qi,ba; ////数字管显示的内容 uchar state=1,RB2; //控制页面 uchar led=0xff,moshi=0x00; //led的显示 int temp,t1=0,temp0=25,Vdac; //定时器一的计数;temp为温度;temp0为阀值;Vdac现在输出电压 //独立按钮 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=2; break; case 2:state=3; break; case 3:state=1; break; } } } } else { flag4=1; ///不按时归1 }//4 /*5 */ if(S5==0) { Delay(10); if(S5==0) { if(flag5!=0) { flag5=0; moshi=~moshi;//模式0为0 ff为1 } } } 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: temp0 ;if(temp0==100)temp0=99;break; case 3: break; case 4: 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(temp0==0) temp0=1; temp0--; break; case 3: break; case 4: break; } } } } else { flag7=1; }//7 } /***************主函数*******************/ void main() { WS(); //关闭外设 while(1) { Scan(); //按键功能 if(flag_shaxi=0xff) Read_T(); if(moshi==0) { led=led&0xfe;//1亮 if(temp>temp0) { Vdac=255;//5 } else Vdac=0; //0 } else { led=led|0x01;//1熄灭 if(temp/100<=20) Vdac=51; //1 else if(temp/100<40) Vdac=(temp/100*15-200)*51/100;//20-1 40-4 else if(temp/100>=40) Vda=204;// 4
}
AD_write(Vdac);
switch(state)//选择模式显示内容
{
case 1:led=(led|0x0e)&0xfd;yi=22;er=20;san=20;si=20;wu=temp/1000%10;lu=temp/100%10+10;qi=temp/10%10;ba=temp%10;break;
case 2:led=(led|0x0e)&0xfb;yi=23;er=20;san=20;si=20;wu=20;lu=20;qi=temp0/10%10;ba=temp0%10;break;
case 3:led=(led|0x0e)&0xf7;yi=24;er=20;san=20;si=20;wu=20;lu=Vdac*100/51/100%10+10;qi=Vdac*100/51/10%10;ba=Vdac*100/51%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()
{
SMG(0,shuzi[yi]);Delay(500);
SMG(1,shuzi[er]);Delay(500);
SMG(2,shuzi[san]);Delay(500);
SMG(3,shuzi[si]);Delay(500);
SMG(4,shuzi[wu]);Delay(500);
SMG(5,shuzi[lu]);Delay(500);
SMG(6,shuzi[qi]);Delay(500);
SMG(7,shuzi[ba]);Delay(500);
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 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;
temp=temp*100;
temp=temp+(LSB&0x0f)*6.25;
}
}
/*********ADC************************/
void AD_write(uchar dat)
{
IIC_Start();
IIC_SendByte(0X90);
IIC_WaitAck();
IIC_SendByte(0X40);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}