有关题目
实现代码
main.c
#include "STC15F2K60S2.h"
#include "onewire.h"
#include "ds1302.h"
#define uchar unsigned char
#define uint unsigned int
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
uchar jm = 0;
code uchar tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff, 0xc1, 0xbf};
uchar init_time[3] = {0x40, 0x59, 0x23};
uchar time[3] = { 0 };
bit mod_flag;
bit rel_flag;
bit flag_5s;
bit led10_flag;
bit L1_flag;
bit L3_flag;
float curr_temp;
uchar para_temp = 23;
void sys_init();
void key_handle();
float rd_temperature();
void rd_time();
void rel_handle();
void led();
void dsp_smg_bit(uchar pos, val);
void display();
void dsp_temp();
void dsp_time();
void dsp_para();
void dsp_min_sec();
void delay_k(uchar t);
void Delay1ms();
void main()
{
sys_init();
while(1)
{
curr_temp = rd_temperature();
rd_time();
key_handle();
display();
rel_handle();
led();
}
}
void led()
{
if (time[0] == 0x00 && time[1] == 0x00)
{
L1_flag = 1;
}
if (L1_flag)
{
P2 = (P2 & 0x1f) | 0x80;
L1 = 0;
}
else
{
P2 = (P2 & 0x1f) | 0x80;
L1 = 1;
}
if (!mod_flag)
{
P2 = (P2 & 0x1f) | 0x80;
L2 = 0;
}
else
{
P2 = (P2 & 0x1f) | 0x80;
L2 = 1;
}
if (led10_flag)
{
if (L3_flag)
{
P2 = (P2 & 0x1f) | 0x80;
L3 = 0;
}
else
L3 = 1;
}
P0 |= 0xf8;
P2 &= 0x1f;
}
void rel_handle()
{
uint t = (uchar)(curr_temp * 10);
if (!mod_flag)
{
if (t > para_temp * 10)
{
led10_flag = 1;
P2 = (P2 & 0x1f) | 0xa0;
P0=0X10;
}
else
{
led10_flag = 0;
P2 = (P2 & 0x1f) | 0xa0;
P0 = 0xaf;
}
}
else if (mod_flag)
{
if (time[0] == 0x00 && time[1] == 0x00)
{
rel_flag = 1;
}
if (rel_flag)
{
P2 = (P2 & 0x1f) | 0xa0;
P0 = 0x10;
led10_flag = 1;
}
else
{
P2 = (P2 & 0x1f) | 0xa0;
P0 = 0xaf;
led10_flag = 0;
}
}
}
void rd_time()
{
uchar t;
t = Read_Ds1302_Byte(0x81);
time[0] = t / 16 * 10 + t % 16 ;
t = Read_Ds1302_Byte(0x83);
time[1] = t / 16 * 10 + t % 16 ;
t = Read_Ds1302_Byte(0x85);
time[2] = t / 16 * 10 + t % 16 ;
}
void display()
{
if (0 == jm)
dsp_temp();
else if (1 == jm)
dsp_time();
else if (2 == jm)
dsp_para();
}
void dsp_min_sec()
{
dsp_smg_bit(1, 11);
dsp_smg_bit(2, 2);
dsp_smg_bit(4, time[1] / 10);
dsp_smg_bit(5, time[1] % 10);
dsp_smg_bit(6, 12);
dsp_smg_bit(7, time[0] / 10);
dsp_smg_bit(8, time[0] % 10);
}
void dsp_para()
{
dsp_smg_bit(1, 11);
dsp_smg_bit(2, 3);
dsp_smg_bit(7, para_temp / 10 % 10);
dsp_smg_bit(8, para_temp % 10);
}
void dsp_time()
{
dsp_smg_bit(1, 11);
dsp_smg_bit(2, 2);
dsp_smg_bit(4, time[2] / 10);
dsp_smg_bit(5, time[2] % 10);
dsp_smg_bit(6, 12);
dsp_smg_bit(7, time[1] / 10);
dsp_smg_bit(8, time[1] % 10);
}
void dsp_temp()
{
uint x = (uint)(curr_temp * 10);
dsp_smg_bit(1, 11);
dsp_smg_bit(2, 1);
dsp_smg_bit(6, x / 100 % 10);
P2 = (P2 & 0x1f) | 0xc0;
P0 = 1 << (7 - 1);
P2 = (P2 & 0x1f) | 0xe0;
P0 = tab[x / 10 % 10] & 0x7f;
Delay1ms();
P0 = 0xff;
P2 &= 0x1f;
dsp_smg_bit(8, x % 10);
}
void dsp_smg_bit(uchar pos, val)
{
P2 = (P2 & 0x1f) | 0xc0;
P0 = 1 << (pos - 1);
P2 = (P2 & 0x1f) | 0xe0;
P0 = tab[val];
Delay1ms();
P0 = 0xff;
P2 &= 0x1f;
}
void Delay1ms()
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void delay_k(uchar t)
{
while(t--)
display();
}
void key_handle()
{
P35 = P34 = P32 = 1;
P33 = 0;
if(!P35)
{
delay_k(10);
if(!P35)
{
if (++jm >= 3)
jm = 0;
while(!P35)
{
display();
}
}
}
if(!P34)
{
delay_k(10);
if(!P34)
{
if (2 == jm)
{
if (++para_temp > 99)
para_temp = 99;
}
while(!P34)
{
display();
}
}
}
P35 = P34 = P33 = 1;
P32 = 0;
if(!P35)
{
delay_k(10);
if(!P35)
{
mod_flag = !mod_flag;
while(!P35)
{
display();
}
}
}
if(!P34)
{
delay_k(10);
if(!P34)
{
if (2 == jm)
{
if (--para_temp < 10)
para_temp = 10;
}
if (1 == jm)
{
while(!P34)
{
rd_time();
dsp_min_sec();
}
}
while(!P34)
{
display();
}
}
}
}
float rd_temperature()
{
uchar l, h;
uint t;
float temp;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
l = Read_DS18B20();
h = Read_DS18B20();
t = (h & 0x0f);
t <<= 8;
t |= l;
temp = t * 0.0625;
return temp;
}
void timer0() interrupt 1
{
static uint i1, i2, i3;
if (rel_flag)
{
if (++i1 == 5000)
{
i1 = 0;
rel_flag = 0;
}
}
if (L1_flag)
{
if (++i2 == 5000)
{
i2 = 0;
L1_flag = 0;
}
}
if (++i3 == 100)
{
L3_flag = !L3_flag;
i3 = 0;
}
}
void sys_init()
{
P2 = (P2 & 0x1f) | 0xa0;
P0 = 0xaf;
P2 = (P2 & 0x1f) | 0x80;
P0 = 0xff;
P2 &= 0x1f;
Write_Ds1302_Byte(0x8e,0x00);
Write_Ds1302_Byte(0x80, init_time[0]);
Write_Ds1302_Byte(0x82, init_time[1]);
Write_Ds1302_Byte(0x84, init_time[2]);
Write_Ds1302_Byte(0x8e,0x80);
AUXR &= 0x7F;
TMOD &= 0xF0;
TL0 = 0x18;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
ET0 = 1;
ET1 = 0;
EA = 1;
}
onewire.h
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
#include <STC15F2K60S2.H>
bit init_ds18b20(void);
unsigned char Read_DS18B20(void);
void Write_DS18B20(unsigned char dat);
void Delay_OneWire(unsigned int t);
#endif
onewire.c
#include "onewire.h"
sbit DQ = P1^4;
void Delay_OneWire(unsigned int t)
{
char i;
while(t--)
for (i = 0; i < 12; i++);
}
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
ds1302.h
#ifndef __DS1302_H
#define __DS1302_H
#include "STC15F2K60S2.h"
#include <intrins.h>
sbit SCK = P1^7;
sbit SDA = P2^3;
sbit RST = P1^3;
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
#endif
ds1302.c
#include "ds1302.h"
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK = 0;
SDA = temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}