/*此程序为多功能测试议,包括时间,温度和噪音的测试 */
/*功能包括: 1.显示实时时间(时,分) */
/* 2.每1分钟检测一次当地温度并显示 */
/* 3.每5秒钟检测一次当地噪音并显示 */
/* 4.统计一天的最高(低)温度和最高最(低)噪音及其出现的时间以备查讯*/
/* 5.遥控操作 */
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define MCA XBYTE[0x7f0a] /*DS1387的几个特殊寄存器*/
#define MCB XBYTE[0x7f0b]
#define MCC XBYTE[0x7f0c]
#define MCD XBYTE[0x7f0d]
#define T_TIME 0x68
#define T_TEMP 0x80
#define T_SOUND 0x40
#define TOP_SOUND 31
#define DOWN_SOUND 11
#define LEFT_MOVE 0x30
#define RIGHT_MOVE 0x38
sbit cs=P1^6;
sbit RA=P1^2;
sbit GD=P1^5;
sbit ON=P3^4;
sbit sto=P1^1;
sbit cp=P1^3;
sbit dot=P1^4; /*秒点*/
sbit watchdog=P3^5;
sbit uip_bit=ACC^7;
bit sec_bit; /*秒标志位*/
bit GETSOUND_BIT; /*串口中断标志位*/
bit BEGIN_BIT;
bit ONEDAY_BIT=0;
uchar time_gettemp; /*每隔一分钟检测一次温度*/
uchar temp_value; /*检测的温度值*/
uchar sound_value;
uchar max_temp[3];
uchar min_temp[3];
uchar max_sound[3];
uchar min_sound[3];
uchar xdata *addr;
uchar dis_xiang=0;
uchar code at[3]={4,2,0};
uchar time_count[3];
uchar display_count[4]={0,0}; /*显示时格式:时,分((温度,单位)(噪音,单位))time_count[3]为秒*/
/*0, 1, 2, 3, 4, 5, 6, 7, 8, 9, dark*/
/*uchar code disma[15]={0x11,0x77,0x92,0x32,0x74,0x38,0x18,0x73,0x10,0x30,0xff,
0x99,0xf0,0x16,0x1c }; C,度,D,B*/
uchar code disma[15]={0x11,0xdd,0x38,0x98,0xd4,0x92,0x12,0xd9,0x10,0x90,0xff,
0x23,0xff,0x1c,0x16};
uchar flash[2];
extern uchar _in(void);
extern uchar _ttcon(void);
/*=====================================================*/
void clock_init(void) /*1387初始化*/
{ cs=0;
MCA=0x2f;
ACC=MCC;
ACC=MCD;
MCB=0x46;
cs=1;
}
/*==================================================================*/
void qwe(count)
uchar count;
{ uchar k,j,dis;
cp=0;
dis=disma[count];
/* if(sound_value>TOP_SOUND)*/
if(temp_value>TOP_SOUND)
{
for(k=0;k<8;k++)
{j=dis&0x01;
dis=dis>>1;
if (j==1) RA=1;
else RA=0;
GD=1; /*关闭*/
cp=1;
_nop_();
_nop_();
cp=0;
}
}
/* else if(sound_value<DOWN_SOUND) */
else if(temp_value<DOWN_SOUND)
{
for(k=0;k<8;k++)
{j=dis&0x01;
dis=dis>>1;
if (j==1) GD=1;
else GD=0;
RA=1; /*关闭*/
cp=1;
_nop_();
_nop_();
cp=0;
}
}
else
{
for(k=0;k<8;k++)
{j=dis&0x01;
dis=dis>>1;
if (j==1) {GD=1;RA=1;}
else {GD=0;RA=0;}
cp=1;
_nop_();
_nop_();
cp=0;
}
}
}
/*=============================================================*/
void display()
{ uchar i,m;
sto=1;
if(time_count[2]%10==0)
{dis_xiang++;
if(dis_xiang==2)
dis_xiang=0;
switch(dis_xiang)
{case 0:
{
display_count[0]=time_count[0]/10;
display_count[1]=time_count[0]-time_count[0]/10*10;
display_count[2]=time_count[1]/10;
display_count[3]=time_count[1]-time_count[1]/10*10;break;
}
case 1:
{
display_count[0]=temp_value/10;
display_count[1]=temp_value-temp_value/10*10;
display_count[2]=0x0b;
display_count[3]=0x0c;break;
}
case 2:
{
display_count[0]=sound_value/10;
display_count[1]=sound_value-sound_value/10*10;
display_count[2]=0x0d;
display_count[3]=0x0e;break;
}
default:
break;
}
/* for(m=0;m<=3;m++)*/
/* qwe(display_count[m]);*/
}
for(m=0;m<=3;m++)
qwe(display_count[m]);
watchdog=1;
watchdog=0;
sto=0; ;/*锁存输出*/
_nop_();
_nop_();
sto=1;
}
/*===================================================*/
void ck_read(void) interrupt 0 using 1 /*中断处理读1387,值放数组TIME_count[]中*/
{cs=0;
ACC=MCC;
ACC=MCA;
addr=0x00;
if(uip_bit==0)
{ uchar i;
for(i=0;i<=2;i++) /*读时标:时,分,秒*/
time_count[i]=*(addr+at[i]);
}
cs=1;
if((time_count[0]|time_count[1]|time_count[2])==0)
ONEDAY_BIT=1; /*新的一天*/
if(time_gettemp!=time_count[1]) /*一分钟转换一次温度*/
{temp_value=ttcon(); /*存最大温度值及其出现的时间*/
time_gettemp=time_count[1];
if(temp_value>max_temp[0])
{max_temp[0]=temp_value;
max_temp[1]=time_count[0];
max_temp[2]=time_count[1];
}
else if(temp_value<min_temp[0]) /*存最小温度值及其出现的时间*/
{
min_temp[0]=temp_value;
min_temp[1]=time_count[0];
min_temp[2]=time_count[1];
}
}
if(sec_bit) /*每秒检测一次噪音*/
{ES=1;
watchdog=1;
watchdog=0;
/*while(GETSOUND_BIT);*/ /*读噪音值*/
sound_value=60;
ES=0;
GETSOUND_BIT=1;
if(sound_value>max_sound[0]) /*存最大噪音值及其出现的时间*/
{
max_sound[0]=sound_value;
max_sound[1]=time_count[0];
max_sound[2]=time_count[1];
}
else if(sound_value<min_sound[0])
{min_sound[0]=sound_value; /*存最小噪音值及其出现的时间*/
min_sound[1]=time_count[0];
min_sound[2]=time_count[1];
}
}
if(BEGIN_BIT||ONEDAY_BIT) /*当刚开机或此时为新的一天时填*/
{BEGIN_BIT=0; /*下面的存储区,并清开机和新的一*/
ONEDAY_BIT=0; /*天标志位*/
max_temp[0]=temp_value;
max_temp[1]=time_count[0];
max_temp[2]=time_count[1];
min_temp[0]=temp_value;
min_temp[1]=time_count[0];
min_temp[2]=time_count[1];
max_sound[0]=sound_value;
max_sound[1]=time_count[0];
max_sound[2]=time_count[1];
min_sound[0]=sound_value;
min_sound[1]=time_count[0];
min_sound[2]=time_count[1];
}
sec_bit=!sec_bit;
if(dis_xiang==0)
dot=sec_bit;
if(sec_bit)
display();
}
/*=======================================================*/
void serial() interrupt 4 using 2 /*串口中断服务程序*/
{ uchar a;
uchar i;
uchar c_ser[4];
EX0=0; /*禁止外部中断*/
RI=0;
ES=0;
c_ser[0]=SBUF;
for (i=1;i<=2;i++)
{while(RI==0);
RI=0;
c_ser[i]=SBUF;
}
GETSOUND_BIT=0;
reti: EX0=1; /*串口中断服务完毕,开外中断*/
}
/*=======================================================*/
void fdisplay(fdata) /*遥控时显示*/
uchar fdata[2];
{uchar wa,i;
sto=1;
for(i=0;i<=1;i++)
{ wa=fdata[i];
wa>>=4;
qwe(wa); /*发一字节*/
wa=fdata[i];
wa=wa&0x0f;
qwe(wa);
}