一、题目说明
二、代码实现
main.c文件内容:
#include <STC15F2K60S2.H>
#include "port.h"
#include "ds1302.h"
#include "key.h"
#include "ultrasonic.h"
#include "AT24C02.h"
#define u8 unsigned char
#define u16 unsigned int
u8 code t_display[ ] = { 0x3F , 0x06 , 0x5B , 0x4F , 0x66 , 0x6D , 0x7D , 0x07 , 0x7F , 0x6F , 0x00 , 0xff , 0x40 } ;
u8 code T_COM[ ] = { 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 } ;
u8 menu[ ] [ 8 ] = { { 11 , 11 , 11 , 11 , 11 , 11 , 11 , 11 } , { 10 , 10 , 10 , 10 , 10 , 0 , 0 , 0 } } ;
u8 index, Trg, Com;
u16 t2_cnt;
bit keyflag, tick_1s, tick_200ms;
void Timer2Init ( void )
{
AUXR | = 0x04 ;
T2L = 0xCD ;
T2H = 0xD4 ;
AUXR | = 0x10 ;
IE2 | = 0x04 ;
}
void t2int ( ) interrupt 12
{
static u8 i;
u8 val;
LED_Com ( 0x00 ) ;
LED_Bit ( T_COM[ i] ) ;
LED_Com ( t_display[ menu[ index] [ i] ] ) ;
if ( ++ i == 8 )
i = 0 ;
if ( t2_cnt % 20 == 0 )
{
val = KeyScan ( ) ;
Trg = val & ( val ^ Com) ;
Com = val;
if ( Trg != 0 )
keyflag = 1 ;
}
if ( t2_cnt % 200 == 0 )
tick_200ms = 1 ;
if ( ++ t2_cnt == 1000 )
{
t2_cnt = 0 ;
tick_1s = 1 ;
}
}
void main ( void )
{
u8 i, setTime[ 3 ] = { 11 , 50 , 59 } , range[ 3 ] = { 24 , 60 , 60 } , hour, min, sec, distance, set_pos, warn_dis = 30 ;
bit initflag, blink, sonic_ad;
AT24C02_WriteData ( 0 , warn_dis) ;
warn_dis = AT24C02_ReadData ( 0 ) ;
UltraSonicInit ( ) ;
LED ( 0x01 ) ;
Buzzer ( 1 ) ;
Timer2Init ( ) ;
EA = 1 ;
while ( 1 )
{
if ( tick_1s)
{
tick_1s = 0 ;
blink = ~ blink;
if ( initflag == 0 )
{
initflag = 1 ;
LED ( 0x00 ) ;
Buzzer ( 0 ) ;
for ( i = 0 ; i < 8 ; ++ i)
menu[ 0 ] [ i] = 10 ;
SetTime ( setTime[ 0 ] , setTime[ 1 ] , setTime[ 2 ] ) ;
}
}
if ( initflag)
{
if ( tick_200ms)
{
tick_200ms = 0 ;
if ( index == 0 )
{
if ( set_pos == 0 )
{
hour = Read_Ds1302_Byte ( 0x85 ) ;
min = Read_Ds1302_Byte ( 0x83 ) ;
sec = Read_Ds1302_Byte ( 0x81 ) ;
setTime[ 0 ] = ( ( hour & 0xf0 ) >> 4 ) * 10 + ( hour & 0x0f ) ;
setTime[ 1 ] = ( ( min & 0xf0 ) >> 4 ) * 10 + ( min & 0x0f ) ;
setTime[ 2 ] = ( ( sec & 0xf0 ) >> 4 ) * 10 + ( sec & 0x0f ) ;
}
menu[ 0 ] [ 0 ] = setTime[ 0 ] / 10 ;
menu[ 0 ] [ 1 ] = setTime[ 0 ] % 10 ;
menu[ 0 ] [ 2 ] = 12 ;
menu[ 0 ] [ 3 ] = setTime[ 1 ] / 10 ;
menu[ 0 ] [ 4 ] = setTime[ 1 ] % 10 ;
menu[ 0 ] [ 5 ] = 12 ;
menu[ 0 ] [ 6 ] = setTime[ 2 ] / 10 ;
menu[ 0 ] [ 7 ] = setTime[ 2 ] % 10 ;
if ( set_pos != 0 && blink)
{
menu[ 0 ] [ 3 * ( set_pos- 1 ) ] = 10 ;
menu[ 0 ] [ 3 * set_pos- 2 ] = 10 ;
}
}
else if ( index == 1 )
{
if ( sonic_ad == 0 )
{
distance = GetDistance ( ) ;
if ( distance < warn_dis)
Buzzer ( 1 ) ;
else
{
Buzzer ( 0 ) ;
if ( distance < 1.2 * warn_dis)
LED ( ( u8) blink) ;
else
LED ( 0x00 ) ;
}
menu[ 1 ] [ 3 ] = 10 ;
menu[ 1 ] [ 4 ] = 10 ;
menu[ 1 ] [ 5 ] = distance / 100 ;
menu[ 1 ] [ 6 ] = distance / 10 % 10 ;
menu[ 1 ] [ 7 ] = distance % 10 ;
}
else
{
menu[ 1 ] [ 3 ] = 12 ;
menu[ 1 ] [ 4 ] = 12 ;
menu[ 1 ] [ 5 ] = warn_dis / 100 ;
menu[ 1 ] [ 6 ] = warn_dis / 10 % 10 ;
menu[ 1 ] [ 7 ] = warn_dis % 10 ;
}
}
}
if ( keyflag)
{
keyflag = 0 ;
switch ( Trg)
{
case 4 :
{
if ( index == 0 && set_pos != 0 )
{
if ( setTime[ set_pos- 1 ] > 0 )
-- setTime[ set_pos- 1 ] ;
else
setTime[ set_pos- 1 ] = range[ set_pos- 1 ] - 1 ;
}
else if ( index == 1 && sonic_ad)
{
if ( warn_dis > 0 )
warn_dis-- ;
}
break ;
}
case 5 :
{
if ( index == 0 && set_pos != 0 )
{
setTime[ set_pos- 1 ] = ( ++ setTime[ set_pos- 1 ] ) % range[ set_pos- 1 ] ;
}
else if ( index == 1 && sonic_ad)
{
if ( warn_dis < 99 )
warn_dis++ ;
}
break ;
}
case 6 :
{
if ( index == 0 )
{
++ set_pos;
if ( set_pos == 4 )
{
set_pos = 0 ;
SetTime ( setTime[ 0 ] , setTime[ 1 ] , setTime[ 2 ] ) ;
}
}
else if ( index == 1 )
{
LED ( 0x00 ) ;
Buzzer ( 0 ) ;
sonic_ad = ~ sonic_ad;
if ( sonic_ad == 0 )
{
AT24C02_WriteData ( 0 , warn_dis) ;
}
}
break ;
}
case 7 :
{
index = ( ++ index) % 2 ;
break ;
}
}
}
}
}
}
port.c文件内容:
#include <STC15F2K60S2.H>
#include <intrins.h>
#include "port.h"
unsigned char bdata control;
sbit buzzer = control^ 6 ;
void Buzzer ( unsigned char k)
{
buzzer = k;
P0 = control;
P2 = 0xa0 ;
_nop_ ( ) ;
P2 = 0x00 ;
}
void LED ( unsigned char k)
{
P0 = ~ k;
P2 = 0x80 ;
_nop_ ( ) ;
P2 = 0x00 ;
}
void LED_Bit ( unsigned char k)
{
P0 = k;
P2 = 0xc0 ;
_nop_ ( ) ;
P2 = 0x00 ;
}
void LED_Com ( unsigned char k)
{
P0 = ~ k;
P2 = 0xe0 ;
_nop_ ( ) ;
P2 = 0x00 ;
}
ds1302.c文件内容:
#include <reg52.h>
#include <intrins.h>
#include "ds1302.h"
sbit SCK= P1^ 7 ;
sbit SDA= P2^ 3 ;
sbit RST = P1^ 3 ;
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) ;
}
void SetTime ( unsigned char hour, unsigned char min, unsigned char sec)
{
unsigned char hh, hl, mh, ml, sh, sl;
hh = ( hour / 10 ) << 4 ;
hl = hour % 10 ;
mh = ( min / 10 ) << 4 ;
ml = min % 10 ;
sh = ( sec / 10 ) << 4 ;
sl = sec % 10 ;
Write_Ds1302_Byte ( 0x8e , 0x00 ) ;
Write_Ds1302_Byte ( 0x80 , sh | sl) ;
Write_Ds1302_Byte ( 0x82 , mh | ml) ;
Write_Ds1302_Byte ( 0x84 , hh | hl) ;
Write_Ds1302_Byte ( 0x8e , 0x80 ) ;
}
key.c文件内容:
#include <STC15F2K60S2.H>
#include "key.h"
#include <intrins.h>
void Delay100us ( )
{
unsigned char i, j;
_nop_ ( ) ;
_nop_ ( ) ;
i = 2 ;
j = 15 ;
do
{
while ( -- j) ;
} while ( -- i) ;
}
unsigned char KeyScan ( void )
{
if ( P30 == 0 )
{
Delay100us ( ) ;
if ( P30 == 0 )
return 7 ;
}
else if ( P31 == 0 )
{
Delay100us ( ) ;
if ( P31 == 0 )
return 6 ;
}
else if ( P32 == 0 )
{
Delay100us ( ) ;
if ( P32 == 0 )
return 5 ;
}
else if ( P33 == 0 )
{
Delay100us ( ) ;
if ( P33 == 0 )
return 4 ;
}
return 0 ;
}
ultrasonic.c文件内容:
#include "ultrasonic.h"
#include <STC15F2K60S2.H>
#include <intrins.h>
sbit TX = P1^ 0 ;
sbit RX = P1^ 1 ;
void Delay12us ( )
{
unsigned char i;
_nop_ ( ) ;
_nop_ ( ) ;
_nop_ ( ) ;
i = 30 ;
while ( -- i) ;
}
void UltraSonicInit ( void )
{
AUXR | = 0x40 ;
TMOD & = 0x0F ;
TL1 = 0x00 ;
TH1 = 0x00 ;
TF1 = 0 ;
}
unsigned char GetDistance ( void )
{
unsigned char i;
unsigned int distance;
for ( i = 0 ; i < 8 ; ++ i)
{
TX = 1 ;
Delay12us ( ) ;
TX = 0 ;
Delay12us ( ) ;
}
TR1 = 1 ;
while ( RX && ( ! TF1) ) ;
TR1 = 0 ;
if ( TF1)
{
TF1 = 0 ;
TH1 = 0x00 ;
TL1 = 0x00 ;
return 99 ;
}
else
{
distance = ( ( TH1 << 8 ) | TL1) * 0.0015372 ;
TH1 = 0x00 ;
TL1 = 0x00 ;
return distance;
}
}
iic.c文件内容:
#include "reg52.h"
#include "intrins.h"
#include "iic.h"
#define DELAY_TIME 3
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
sbit SDA = P2^ 1 ;
sbit SCL = P2^ 0 ;
void IIC_Delay ( unsigned char i)
{
do { _nop_ ( ) ; _nop_ ( ) ; _nop_ ( ) ; }
while ( i-- ) ;
}
void IIC_Start ( void )
{
SDA = 1 ;
SCL = 1 ;
IIC_Delay ( DELAY_TIME) ;
SDA = 0 ;
IIC_Delay ( DELAY_TIME) ;
SCL = 0 ;
}
void IIC_Stop ( void )
{
SDA = 0 ;
SCL = 1 ;
IIC_Delay ( DELAY_TIME) ;
SDA = 1 ;
IIC_Delay ( DELAY_TIME) ;
}
void IIC_SendAck ( bit ackbit)
{
SCL = 0 ;
SDA = ackbit;
IIC_Delay ( DELAY_TIME) ;
SCL = 1 ;
IIC_Delay ( DELAY_TIME) ;
SCL = 0 ;
SDA = 1 ;
IIC_Delay ( DELAY_TIME) ;
}
bit IIC_WaitAck ( void )
{
bit ackbit;
SCL = 1 ;
IIC_Delay ( DELAY_TIME) ;
ackbit = SDA;
SCL = 0 ;
IIC_Delay ( DELAY_TIME) ;
return ackbit;
}
void IIC_SendByte ( unsigned char byt)
{
unsigned char i;
for ( i= 0 ; i< 8 ; i++ )
{
SCL = 0 ;
IIC_Delay ( DELAY_TIME) ;
if ( byt & 0x80 ) SDA = 1 ;
else SDA = 0 ;
IIC_Delay ( DELAY_TIME) ;
SCL = 1 ;
byt <<= 1 ;
IIC_Delay ( DELAY_TIME) ;
}
SCL = 0 ;
}
unsigned char IIC_RecByte ( void )
{
unsigned char i, da;
for ( i= 0 ; i< 8 ; i++ )
{
SCL = 1 ;
IIC_Delay ( DELAY_TIME) ;
da <<= 1 ;
if ( SDA) da | = 1 ;
SCL = 0 ;
IIC_Delay ( DELAY_TIME) ;
}
return da;
}
AT24C02.c文件内容:
#include "iic.h"
#include "AT24C02.h"
#include <intrins.h>
void Delay2ms ( )
{
unsigned char i, j;
_nop_ ( ) ;
_nop_ ( ) ;
i = 22 ;
j = 128 ;
do
{
while ( -- j) ;
} while ( -- i) ;
}
void AT24C02_WriteData ( unsigned char addr, unsigned char dat)
{
IIC_Start ( ) ;
IIC_SendByte ( 0xa0 ) ;
IIC_WaitAck ( ) ;
IIC_SendByte ( addr) ;
IIC_WaitAck ( ) ;
IIC_SendByte ( dat) ;
IIC_WaitAck ( ) ;
IIC_Stop ( ) ;
Delay2ms ( ) ;
}
unsigned char AT24C02_ReadData ( unsigned char addr)
{
unsigned char dat;
IIC_Start ( ) ;
IIC_SendByte ( 0xa0 ) ;
IIC_WaitAck ( ) ;
IIC_SendByte ( addr) ;
IIC_WaitAck ( ) ;
IIC_Start ( ) ;
IIC_SendByte ( 0xa1 ) ;
IIC_WaitAck ( ) ;
dat = IIC_RecByte ( ) ;
IIC_SendAck ( 1 ) ;
IIC_Stop ( ) ;
Delay2ms ( ) ;
return dat;
}