#include "reg52.h"
#include "onewire.h"
#include "absacc.h"
#include "ds1302.h"
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
unsigned char duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
unsigned temp_time = 1; //间隔时间
unsigned char timer[3] = {0x50,0x59,0x23}; //设定初始时间
unsigned char write_ds1302[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char read_da1302[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char temp[10]; //温度采集数据
unsigned int i = 0; //温度采集顺序
unsigned int k4 = 0; //间隔时间切换标志位
unsigned int k5 = 0; //进入时钟
unsigned int k6 = 0; //温度采集显示标志位
unsigned int k6_6 = 0; //L1熄灭按键
unsigned int k7 = 0; //进入参数设置位
unsigned int k = 0; //采集温度标志位
unsigned int led_f = 0; //LED闪烁标志位
unsigned int smg_f = 0; //数码管闪烁标志位
unsigned int count = 0; //定时器计数
unsigned int count_smg = 0; //smg定时器计数
unsigned int dat_f; //温度
//=============================初始化函数===========================
void initsystem()
{
XBYTE[0x8000] = 0xff;
XBYTE[0xa000] = 0x00;
XBYTE[0xc000] = 0xff;
XBYTE[0xe000] = 0xff;
}
//=============================数码管函数===========================
void delay_smg(unsigned int t)
{
while(t--);
}
void display_smg(unsigned char pos,unsigned char value)
{
XBYTE[0xe000] = 0xff;
XBYTE[0xc000] = 0x01 << pos;
XBYTE[0xe000] = value;
}
void allsmg()
{
XBYTE[0xc000] = 0xff;
XBYTE[0xe000] = 0xff;
}
void display_smg_time()
{
display_smg(0,duanma[timer[2] / 16]);
delay_smg(500);
display_smg(1,duanma[timer[2] % 16]);
delay_smg(500);
if (smg_f == 0)
{
display_smg(2,duanma[16]);
delay_smg(500);
}
display_smg(3,duanma[timer[1] / 16]);
delay_smg(500);
display_smg(4,duanma[timer[1] % 16]);
delay_smg(500);
if (smg_f == 0)
{
display_smg(5,duanma[16]);
delay_smg(500);
}
display_smg(6,duanma[timer[0] / 16]);
delay_smg(500);
display_smg(7,duanma[timer[0] % 16]);
delay_smg(500);
allsmg();
delay_smg(500);
}
void display_smg_temp()
{
display_smg(0,duanma[16]);
delay_smg(500);
display_smg(1,duanma[(i+1) / 10]);
delay_smg(500);
display_smg(2,duanma[(i+1) % 10]);
delay_smg(500);
display_smg(3,0xff);
delay_smg(500);
display_smg(4,0xff);
display_smg(5,duanma[16]);
delay_smg(500);
display_smg(6,duanma[temp[i] / 10]);
delay_smg(500);
display_smg(7,duanma[temp[i] % 10]);
delay_smg(500);
allsmg();
delay_smg(500);
}
void display_smg_limit()
{
display_smg(0,0xff);
delay_smg(500);
display_smg(1,0xff);
delay_smg(500);
display_smg(2,0xff);
delay_smg(500);
display_smg(3,0xff);
delay_smg(500);
display_smg(4,0xff);
display_smg(5,duanma[16]);
delay_smg(500);
display_smg(6,duanma[temp_time / 10]);
delay_smg(500);
display_smg(7,duanma[temp_time % 10]);
delay_smg(500);
allsmg();
delay_smg(500);
}
//=============================LED相关函数==========================
void LEDrunning()
{
if (led_f == 1)
{
XBYTE[0x8000] = 0xfe;
}
else if (led_f == 0)
{
XBYTE[0x8000] = 0xff;
}
}
void read_temperature();
//=============================定时器===============================
void init_time()
{
TMOD = 0x01;
TH0 = (65535 - 10000) / 256;
TL0 = (65535 - 10000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void servicetime() interrupt 1
{
TH0 = (65535 - 10000) / 256;
TL0 = (65535 - 10000) % 256;
count_smg ++;
if (count_smg == 100)
{
if (smg_f == 0)
{
smg_f = 1;
}
else if (smg_f == 1)
{
smg_f = 0;
}
if (k6_6 == 1)
{
if (led_f == 0)
{
led_f = 1;
}
else if (led_f == 1)
{
led_f = 0;
}
}
count_smg = 0;
}
if (k == 0)
{
count++;
if (count % (100 * temp_time) == 0)
{
read_temperature();
temp[i] = dat_f;
i ++;
if (i > 10)
{
count = 0;
k = 1;
k6_6 = 1;
k6 = 1;
k7 = 1;
led_f = 0;
}
}
}
}
//=============================实时时钟=============================
void write_time_ds1302()
{
unsigned char n ;
Write_Ds1302_Byte(0x8e,0x00);
for (n = 0 ; n < 3 ; n ++)
{
Write_Ds1302_Byte(write_ds1302[n],timer[n]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void read_time_ds1302()
{
unsigned char n ;
for (n = 0;n < 3;n++)
{
timer[n] = Read_Ds1302_Byte(read_da1302[n]);
}
}
//=============================温度传感器===========================
void read_temperature()
{
unsigned char LSB,MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
delay_smg(1000);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
init_ds18b20();
dat_f = 0x0000;
dat_f = MSB;
dat_f <<= 8;
dat_f = dat_f | LSB;
if ((dat_f & 0xf800) == 0x0000)
{
dat_f >>= 4;
}
}
//=============================按键=================================
void scankeys()
{
if (S4 == 0)
{
if (k4 == 0)
{
k4 = 1;
temp_time = 5;
}
else if (k4 == 1)
{
k4 = 2;
temp_time = 30;
}
else if (k4 == 2)
{
k4 = 3;
temp_time = 60;
}
else if (k4 == 3)
{
k4 = 0;
temp_time = 1;
}
while(S4 == 0);
}
if (S5 == 0)
{
if (k5 == 0)
{
k5 = 1;
k7 = 1;
k = 0;
temp[9] = 0x00;
}
else if (k5 == 1)
{
k5 = 0;
}
while(S5 == 0);
}
if (S6 == 0)
{
if (k6_6 == 1)
{
k6_6 = 0;
}
i ++;
if (i >= 10)
{
i = 0;
}
while(S6 == 0);
}
if (S7 == 0)
{
if (k7 == 1)
{
k7 = 0;
k6 = 0;
k5 = 0;
}
while(S7 == 0);
}
}
//=============================主函数===============================
void main()
{
initsystem();
init_time();
write_time_ds1302();
while(1)
{
LEDrunning();
read_time_ds1302();
scankeys();
if (k6 == 1)
{
display_smg_temp();
}
else if (k5 == 1)
{
display_smg_time();
}
else if (k7 == 0)
{
display_smg_limit();
}
}
}