程序源代码:
/****************************************
第十四届蓝桥杯省赛源代码
*********************************************/
#include
#include
#include "onewire.h"
#include "ds1302.h"
#include "iic.h"
#define uchar unsigned char
#define uint unsigned int
uchar code type1[]={ 0xC0,
0xF9,
0xA4,
0xB0,
0x99,
0x92,
0x82,
0xF8,
0x80,
0x90,0xff,0xc6,0x89,0x8e,0x8c,0x86,0xbf,0x88};
//11C 12H 13F 14P 15E 16- 17AA
uchar code type2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar num1,num2,num3,num4,num5,num6,num7,num8;
bit f_2ms;
uchar t_2ms;
uchar GN;
uchar bdata U6=0xff;
sbit led1=U6^0;
sbit led2=U6^1;
sbit led3=U6^2;
sbit led4=U6^3;
sbit led5=U6^4;
sbit led6=U6^5;
sbit led7=U6^6;
sbit led8=U6^7;
uint temp,temp_1=0;
bit flag;
uint temp_wen=0,temp_wen1=0,temp_pin=0,temp_adc;
char hour,minute,second;
char hour_1,minute_1,second_1;
char model=0,model_hui=0;
uint wen_max=0,wen_pin=0,shi_max=0,shi_pin=0;
uchar trig_count=0;//触发次数
bit trig_device=0;
uchar wen_p=30;//温度参数
char f_err=0;//频率错误
uchar g_light=0;//光敏读数
bit light_trig=0,limt_light=0;
uint wen_t2ms=0;ds1302_t2ms=0,adc_t2ms=0,trig_3S=0;
bit limt_caiji=0;
uchar pick_wen=0,pick_shi=0;
uchar wen_type[99]=0,shi_type[99]=0;
uchar wen_i=0,shi_i=0;
//长按按键操作
uint S9_t2ms=0;
bit F_S9=0;
//清除数组所有数据
uchar S9_i=0;
//指示灯
uint L4_t2ms=0;
bit L4_flag=0;
void Delay10ms() //@12.000MHz
{
unsigned char i, j;
i = 117;
j = 184;
do
{
while (--j);
} while (--i);
}
void smg_display(char n1,char n2,char n3,char n4,char n5,char n6,char n7,char n8)
{
char i;
P0=0xff;
P2=(P2&0x1f)|0xc0;
P0=type2[i];
P2=(P2&0x1f);
switch(i)
{
case 0:P2=(P2&0x1f)|0xe0; P0=type1[n1]; P2=(P2&0x1f);break;
case 1:P2=(P2&0x1f)|0xe0; P0=type1[n2]; P2=(P2&0x1f);break;
case 2:P2=(P2&0x1f)|0xe0; P0=type1[n3]; P2=(P2&0x1f);break;
case 3:P2=(P2&0x1f)|0xe0; P0=type1[n4]; P2=(P2&0x1f);break;
case 4:P2=(P2&0x1f)|0xe0; P0=type1[n5]; P2=(P2&0x1f);break;
case 5:P2=(P2&0x1f)|0xe0; P0=type1[n6]; P2=(P2&0x1f);break;
case 6:P2=(P2&0x1f)|0xe0;
if(light_trig==0)
{
if(model==1)
{
if(model_hui==0 || model_hui==1)
P0=type1[n7]&0x7f;
if(model_hui==2)
P0=type1[n7];
if(trig_count==0)
P0=type1[n7];
}
if(model==0 || model==2)
P0=type1[n7];
}
else
P0=type1[n7];
P2=(P2&0x1f);break;
case 7:P2=(P2&0x1f)|0xe0; P0=type1[n8]; P2=(P2&0x1f);break;
}
if(++i==8)
i=0;
}
//*************************led显示********************//
void led_display()
{
if(model==0) //L1
{
led1=0;led2=1;led3=1;
P2=(P2&0x1f)|0x80;
P0=U6;
P2=(P2&0x1f);
}
if(model==1) //L2
{
led1=1;led2=0;led3=1;
P2=(P2&0x1f)|0x80;
P0=U6;
P2=(P2&0x1f);
}
if(model==2)//L3
{
led1=1;led2=1;led3=0;
P2=(P2&0x1f)|0x80;
P0=U6;
P2=(P2&0x1f);
}
//****************************
if(pick_wen > wen_p) //L4
{
if(L4_flag==0)
{
led4=0;
P2=(P2&0x1f)|0x80;
P0=U6;
P2=(P2&0x1f);
}
if(L4_flag==1)
{
led4=1;
P2=(P2&0x1f)|0x80;
P0=U6;
P2=(P2&0x1f);
}
}
else
{
led4=1;
P2=(P2&0x1f)|0x80;
P0=U6;
P2=(P2&0x1f);
}
//****************************
if(f_err==1) //L5
{
led5=0;
P2=(P2&0x1f)|0x80;
P0=U6;
P2=(P2&0x1f);
}
if(f_err==0)
{
led5=1;
P2=(P2&0x1f)|0x80;
P0=U6;
P2=(P2&0x1f);
}
//*******************************
if(trig_count>1) //L6
{
if((wen_type[trig_count] > wen_type[trig_count-1]) && (shi_type[trig_count] > shi_type[trig_count-1]))
{
led6=0;
P2=(P2&0x1f)|0x80;
P0=U6;
P2=(P2&0x1f);
}
else
{
led6=1;
P2=(P2&0x1f)|0x80;
P0=U6;
P2=(P2&0x1f);
}
}
}//led_display
/*************************pcf8591**********************/
void initial_adc(uchar addr)
{
IIC_Start( );
IIC_SendByte( 0x90+0 );
IIC_WaitAck( );
IIC_SendByte( addr );
IIC_WaitAck( );
IIC_Stop( );
}
uint du_adc()
{
uint D;
IIC_Start( );
IIC_SendByte( 0x90+1 );
IIC_WaitAck( );
D=IIC_RecByte( );
IIC_SendAck(1);
IIC_Stop( );
// D=(D*500.0)/255;
return D;
}
/*************************1302**********************/
void xie_ds1302()
{
Write_Ds1302_Byte( 0x8e,0x00 );
Write_Ds1302_Byte( 0x84,0x00 );
Write_Ds1302_Byte( 0x82,0x00 );
Write_Ds1302_Byte( 0x80,0x00 );
}
void du_ds1302()
{
hour=Read_Ds1302_Byte( 0x85 ); hour=(hour>>4)*10+(hour&0x0f);
minute=Read_Ds1302_Byte( 0x83 ); minute=(minute>>4)*10+(minute&0x0f);
second=Read_Ds1302_Byte( 0x81 ); second=(second>>4)*10+(second&0x0f);
}
/*************************矩阵按键**********************/
uchar key_scan()
{
uchar L,H;
P3=0xdf;P44=0;P42=0;H=(~P3)&0x0f;
if(H==0) return 0;
Delay10ms();
P3=0xcf;P44=0;P42=0;H=(~P3)&0x0f;
if(H==0) return 0;
P3=0xf0;P44=1;P42=1;L=(~P3)&0x20;
if(P44==0) L|=0x80;
if(P42==0) L|=0x40;
return (L+H);
}
void key_change()
{
uchar D;
D=key_scan();
switch(D)
{
case 0x88:GN=4;break;
case 0x84:GN=5;break;
case 0x48:GN=8;break;
case 0x44:GN=9;break;
case 0:GN=0;break;
}
}
/*************************定时器0初始化**********************/
void time0()
{
TMOD=(TMOD&0xf0)|0x05; //定时器0设置成计数模式
TH0=TL0=0; //赋初值
}
/*************************定时器1**********************/
void time1_int1()
{
EA=1;
ET1=1;
TR1=1;
TMOD=(TMOD&0x0f)|0x10;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
}
/*************************外设初始化**********************/
void initial_all()
{
P2=(P2&0x1f)|0xa0;
P0=0x00;
P2=(P2&0x1f);
P2=(P2&0x1f)|0x80;
P0=0xff;
P2=(P2&0x1f);
P2=(P2&0x1f)|0xc0;
P0=0xff;
P2=(P2&0x1f);
P2=(P2&0x1f)|0xe0;
P0=0xff;
P2=(P2&0x1f);
}
/*************************主函数**********************/
void main()
{
initial_all();//外设初始化
time1_int1(); //定时器1初始化
time0(); //定时器0初始化
initial_18b20(); //18B20初始化
xie_ds1302(); //1302初始化
initial_adc(1); //ADC初始化
g_light=du_adc(); //ADC采集
//temp_wen=rd_temperature();
// Delay10ms();
while(1)
{
if(f_2ms==1)
{
f_2ms=0;
key_change();
led_display();
//1302读取
if(++ds1302_t2ms==50)
{
ds1302_t2ms=0;
du_ds1302();
}
//温度采集
temp_wen1=rd_temperature();
//ADC采集
if(++adc_t2ms==10)
{
adc_t2ms=0;
g_light=du_adc();
}
if(g_light < 10)
{
if(limt_light==1)
{
light_trig=1;
limt_light=0;
}
}
else
{
limt_light=1;
}
/************************非触发状态***************************/
if(light_trig==0)
{
trig_device=0; //清空触发一次
limt_caiji=0; //清空采集一次
if(GN==4)
{
model++;
if(model==3) model=0;
while(key_scan());
}
switch(model)
{
case 0:
model_hui=0;
num1=hour/10;num2=hour%10;num3=16;num4=minute/10;num5=minute%10;
num6=16;num7=second/10;num8=second%10;
break;
case 1:
if(GN==5)
{
model_hui++;
if(model_hui==3) model_hui=0;
while(key_scan());
}
switch(model_hui)
{
case 0://温度回显
if(trig_count==0)
{
num1=11;num2=num3=num4=num5=num6=num7=num8=10;
}
else
{
num1=11;num2=10;num3=wen_max/10;num4=wen_max%10;
num5=16,num6=wen_pin/100;num7=wen_pin%100/10;num8=wen_pin%10;
}
break;
case 1://湿度回显
if(trig_count==0)
{
num1=12;num2=num3=num4=num5=num6=num7=num8=10;
}
else
{
num1=12;num2=10;num3=shi_max/10;num4=shi_max%10;
num5=16,num6=shi_pin/100;num7=shi_pin%100/10;num8=shi_pin%10;
}
break;
case 2://时间回显
if(GN==9) //长按按键
{
F_S9=1;
while(key_scan());
F_S9=0;
S9_t2ms=0;
}
if(trig_count==0)
{
num1=13;num2=num3=num4=num5=num6=num7=num8=10;
}
else
{
num1=13;num2=trig_count/10;num3=trig_count%10;
num4=hour_1/10;num5=hour_1%10;num6=16;num7=minute_1/10;num8=minute_1%10;
}
break;
}
break; //case 1
case 2:
if(GN==8)
{
if(wen_p++ == 99) wen_p=99;
while(key_scan());
}
if(GN==9)
{
if(wen_p-- == 0) wen_p=0;
while(key_scan());
}
num1=14;num2=num3=num4=num5=num6=10;
num7=wen_p/10;num8=wen_p%10;
break;
}//switch
}//light_trig==0
/************************触发状态***************************/
if(light_trig==1)
{
temp_wen=temp_wen1; //采集温度
temp_1=temp; //采集湿度
//触发次数计算一次
if(trig_device==0)
{
if(trig_count++ == 99)
trig_count=99;
trig_device=1;
}
//采集一次
if(limt_caiji==0)
{
//温度最大值
if(temp_wen > wen_max)
{
wen_max=temp_wen;
}
//温度平均值计算
wen_type[trig_count]=temp_wen;
wen_pin=0;
for(wen_i=0;wen_i { wen_i++; wen_pin=wen_pin+wen_type[wen_i]; } wen_pin=(((float)wen_pin*10)/trig_count); //湿度最大值 if(temp_1 > shi_max) { shi_max=temp_1; } //湿度平均值计算 shi_type[trig_count]=temp_1; shi_pin=0; for(shi_i=0;shi_i { shi_i++; shi_pin=shi_pin+shi_type[shi_i]; } shi_pin=(((float)shi_pin*10)/trig_count); /********将采集到的数据返回显示**********/ pick_wen=temp_wen; pick_shi=temp_1; limt_caiji=1; hour_1=hour; minute_1=minute; } num1=15;num2=num3=10;num4=pick_wen/10;num5=pick_wen%10; num6=16; if(f_err==0) { num7=pick_shi/10;num8=pick_shi%10; } if(f_err==1) { num7=17;num8=17; } } }//f_2ms } } void cl_time1_int1() interrupt 3 //定时器1 { TH1=(65536-2000)/256; TL1=(65536-2000)%256; smg_display(num1,num2,num3,num4,num5,num6,num7,num8); f_2ms=1; if(++t_2ms==250) { t_2ms=0; flag=~flag; if(flag==0) { TH0=TL0=0; //清零 TR0=1; } else { TR0=0; temp=((TH0<<8)+TL0)*2; temp=((2*temp)+50); temp=temp/45.0; if(temp<10) { f_err=1; temp=10; } else if(temp>90) { f_err=1; temp=90; } else f_err=0; } } /*********采集后计时3S**********/ if(light_trig==1) { //计时3S if(++trig_3S==1500) { trig_3S=0; light_trig=0; } } /*********S9长按处理**********/ if(F_S9==1) { if(++S9_t2ms>1000) { S9_t2ms=0; trig_count=0; wen_max=0; shi_max=0; for(S9_i=0;S9_i<99;S9_i++) { wen_type[S9_i]=0; shi_type[S9_i]=0; } } } /*********L4闪烁处理**********/ if(temp_wen > wen_p) { if(++L4_t2ms==50) { L4_t2ms=0; L4_flag=~L4_flag; } } else L4_flag=1; }//中断 需要源代码一键三联,私聊我哦 相关阅读
发表评论