1.题目
2.代码
main.c
******************************************************************************
* 文件名:电子钟
* 描 述:
* 作 者:思索与猫
* 日 期: 19/3/17
* 备 注:
*
******************************************************************************
#include<stc15f2k60s2.h>
#include<sys.h>
uchar temp;
void Delay10ms();
void main()
{
CloseFucker();
Timer0Init();
SetTime(23, 59, 50); //设置初值时间
while(1)
{
if(temp_flag == 1) //读温度
{
temp_flag = 0;
temp = ReadTemp();
}
if(time_flag == 1) //读时间
{
time_flag =0;
shi = Ds1302_Single_Byte_Read(0x85);
real_shi=shi/16*10+shi%16;
Delay10ms(); //延时10ms,防止数字跳变混乱
fen = Ds1302_Single_Byte_Read(0x83);
real_fen=fen/16*10+fen%16;
Delay10ms();
miao = Ds1302_Single_Byte_Read(0x81);
real_miao=miao/16*10+miao%16;
Delay10ms();
}
if(ring_shi == real_shi&&ring_fen == real_fen&&ring_miao == real_miao) //判断闹钟
{
ring = 1;
mode = 2;
}
KeyDriver();
ShowTable();
}
}
void Delay10ms() //@12.000MHz
{
unsigned char i, j;
i = 117;
j = 184;
do
{
while (--j);
} while (--i);
}
sys.h
#ifndef __SYS_H_
#define __SYS_H_
typedef unsigned char uchar;
typedef unsigned int uint;
#include<stc15f2k60s2.h>
#include<ds1302.h>
#include<onewire.h>
//初始化
void Timer0Init();
void CloseFucker();
//显示
void Display();
void ShowTable();
void ShowLed(uchar led_dat);
//按键
void KeyScan();
void KeyAction(uchar key_value);
void KeyDriver();
//外部变量
extern uchar code duan[];
extern uchar Table[];
extern uchar KeySta[];
extern uchar KeyCodeMap[];
extern uchar shi,fen,miao;
extern uchar mode;
extern uchar index;
extern bit smg_flag;
extern uchar TimeBack[];
extern uchar TimeIndex[];
extern bit ring_flag;
extern bit time_flag;
extern bit temp_flag;
extern uchar temp;
extern uchar ring_shi, ring_fen, ring_miao;
extern uchar real_shi,real_fen,real_miao;
extern bit ring;
extern uchar led_dat;
extern bit led_flag;
#endif
sys.c
#include<sys.h>
bit smg_flag;
bit led_flag;
bit time_flag = 1;
bit temp_flag = 0;
uchar led_dat = 0xff;
void Timer0Init() //2ms@12.000MHz
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x40;
TH0 = 0xA2;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void T0_time() interrupt 1
{
static uint count = 0,time_count = 0,ring_count = 0,flag_5s = 0,temp_count = 0;
TL0 = 0x40;
TH0 = 0xA2;
Display();
KeyScan();
if(++temp_count>= 200) //200ms扫描一次温度
{
temp_count = 0;
temp_flag = 1;
}
if(++time_count >=100) //100ms扫描一次时间
{
time_count = 0;
time_flag = 1;
}
if(mode == 1&&++count >= 250) //1秒闪烁数码管
{
count = 0;
smg_flag = ~smg_flag;
}
if(ring == 1)
{
if(++ring_count >= 100) //0.2S闪烁灯泡
{
ring_count = 0;
led_flag = ~led_flag;
flag_5s++;
}
if(flag_5s >= 25) //5s清零
{
ring = 0;
led_flag = 0;
ring_count = 0;
flag_5s = 0;
}
}
if(ring == 1) //L1亮灭
{
if(led_flag == 1)
{
ShowLed(0xfe);
}
else if(led_flag == 0)
{
ShowLed(0xff);
}
}
else
{
ShowLed(0xff);
}
}
void CloseFucker()
{
P2 = P2&0x1f|0xa0;
P0 = 0xaf;
P2 = P2&0x1f;
}
display.c
#include<sys.h>
uchar code duan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40,0x39};//10black,11-,12C
uchar Table[8];
uchar shi,fen,miao;
uchar real_shi,real_fen,real_miao;
uchar TimeBack[6] = {0, 0, 0, 0, 0, 0};
uchar TimeIndex[6] = {0, 1, 3, 4, 6, 7};
uchar mode = 0;
bit ring = 0;
void Display()
{
static uchar index = 0;
P2 = P2&0x1f|0xe0;
P0 = 0xff;
P2 = P2&0x1f;
P2 = P2&0x1f|0xc0;
P0 = 1<<index;
P2 = P2&0x1f;
P2 = P2&0x1f|0xe0;
P0 = ~duan[Table[index]];
P2 = P2&0x1f;
index++;
index &= 0x07;
}
void ShowTable()
{
uchar i = 0;
if(mode == 0||mode == 2) //显示时钟界面
{
Table[0] = shi/16;
Table[1] = shi%16;
Table[2] = 11;
Table[3] = fen/16;
Table[4] = fen%16;
Table[5] = 11;
Table[6] = miao/16;
Table[7] = miao%16;
}
else if(mode == 1) //数码管闪烁界面
{
Table[2] = 11;
Table[5] = 11;
if(smg_flag == 1)
{
for(i=0; i<6; i++)
{
if(TimeIndex[i] == TimeIndex[index])
{
Table[TimeIndex[i]] = 10;
}
else
{
Table[TimeIndex[i]] = TimeBack[i];
}
}
}
else if(smg_flag == 0)
{
for(i=0; i<6; i++)
{
Table[TimeIndex[i]] = TimeBack[i];
}
}
}
else if(mode == 3) //温度显示界面
{
Table[0] = 10;
Table[1] = 10;
Table[2] = 10;
Table[3] = 10;
Table[4] = 10;
Table[5] = temp/10;
Table[6] = temp%10;
Table[7] = 12;
}
}
void ShowLed(uchar led_dat) //led灯显示
{
P2 = P2&0x1f|0x80;
P0 = led_dat;
P2 = P2&0x1f;
}
key.c
#include<sys.h>
sbit Key_In_1 = P3^0;
sbit Key_In_2 = P3^1;
sbit Key_In_3 = P3^2;
sbit Key_In_4 = P3^3;
uchar KeySta[4] = {1, 1, 1, 1};
uchar KeyCodeMap[4] ={7, 6, 5, 4};
uchar index = 0;
bit ring_flag;
uchar ring_shi = 0, ring_fen = 0, ring_miao = 0;
void KeyDriver()
{
uchar i;
static uchar KeyBack[4] = {1, 1, 1, 1};
for(i=0; i<4; i++)
{
if(KeySta[i] != KeyBack[i])
{
if(mode == 0&&KeySta[3] == 0) //按下S4显示温度
{
mode = 3;
}
if(mode == 3&&KeySta[3] == 1) //松开显示时间
{
mode = 0;
}
if(KeySta[i] != 0)
{
KeyAction(KeyCodeMap[i]);
// mode = 0;
}
}
KeyBack[i] = KeySta[i];
}
}
void KeyAction(uchar key_value)
{
uchar i = 0;
if(mode == 2) //闹钟模式下,按下任何键关闭
{
switch(key_value)
{
case 7:ring = 0;mode = 0;led_flag = 0;break;
case 6:ring = 0;mode = 0;led_flag = 0;break;
case 5:ring = 0;mode = 0;led_flag = 0;break;
case 4:ring = 0;mode = 0;led_flag = 0;break;
}
}
else if(mode == 0)
{
if(key_value == 7) //按下S7设置时间
{
mode = 1;
index = 0;
}
if(key_value == 6) //按下S6设置闹钟
{
mode = 1;
ring_flag = 1;
index = 0;
}
}
else if(mode == 1)
{
if((key_value == 7&&ring_flag == 0)||(ring_flag == 1&&key_value == 6))
{
index++;
if(index == 6)
{
index = 0;
mode = 0;
if(ring_flag == 1) //设置好闹钟时间
{
ring_flag = 0;
ring_shi = TimeBack[0]*10+TimeBack[1];
ring_fen = TimeBack[2]*10+TimeBack[3];
ring_miao = TimeBack[4]*10+TimeBack[5];
}
else if(ring_flag == 0) //设置好时钟时间
{
shi = TimeBack[0]*10+TimeBack[1];
fen = TimeBack[2]*10+TimeBack[3];
miao = TimeBack[4]*10+TimeBack[5];
SetTime(shi,fen,miao);
}
for(i=0; i<6; i++) //后备存储时间清零
{
TimeBack[i] = 0;
}
}
}
else if(key_value == 5) //按下S5+1,防止溢出,最大23-59-59
{
if(index == 0&&TimeBack[0] == 2)
{
TimeBack[0] = 0;
}
else if((index == 1&&TimeBack[0] == 2&&TimeBack[1] == 3)||TimeBack[1] == 9)
{
TimeBack[1] = 0;
}
else if(index == 2&&TimeBack[2] == 5)
{
TimeBack[2] = 0;
}
else if((index == 3&&TimeBack[2] == 5)||TimeBack[3] == 9)
{
TimeBack[3] = 0;
}
else if(index == 4&&TimeBack[4] == 5)
{
TimeBack[4] = 0;
}
else if((index == 5&&TimeBack[4] == 5)||TimeBack[5] == 9)
{
TimeBack[5] = 0;
}
else
{
TimeBack[index]++;
}
}
else if(key_value == 4) //按下S4-1,防止溢出,最小00-00-00
{
if(index == 0&&TimeBack[0] == 0)
{
TimeBack[0] = 2;
}
else if(index == 1&&TimeBack[1] == 0)
{
TimeBack[1] = 3;
}
else if(index == 2&&TimeBack[2] == 0)
{
TimeBack[2] = 5;
}
else if(index == 3&&TimeBack[3] == 0)
{
TimeBack[3] = 9;
}
else if(index == 4&&TimeBack[4] == 0)
{
TimeBack[4] = 5;
}
else if(index == 5&&TimeBack[5] == 0)
{
TimeBack[5] = 9;
}
else
{
TimeBack[index]--;
}
}
}
}
void KeyScan()
{
uchar i = 0;
static uchar KeyBuf[4] = {0xff,0xff,0xff,0xff};
KeyBuf[0] = KeyBuf[0]<<1|Key_In_1;
KeyBuf[1] = KeyBuf[1]<<1|Key_In_2;
KeyBuf[2] = KeyBuf[2]<<1|Key_In_3;
KeyBuf[3] = KeyBuf[3]<<1|Key_In_4;
for(i=0; i<4; i++)
{
if(KeyBuf[i] == 0xff)
{
KeySta[i] = 1;
}
else if(KeyBuf[i] == 0x00)
{
KeySta[i] = 0;
}
else
{
;
}
}
}
ds1302.h
#ifndef __DS1302_H__
#define __DS1302_H__
#include<stc15f2k60s2.h>
#include<intrins.h>
#include<sys.h>
/********************************************************************/
sbit SCK=P1^7;
sbit SD=P2^3;
sbit RST=P1^3;
/********************************************************************/
#define RST_CLR RST=0
#define RST_SET RST=1
#define SDA_CLR SD=0
#define SDA_SET SD=1
#define SDA_R SD
#define SCK_CLR SCK=0
#define SCK_SET SCK=1
/********************************************************************/
#define ds1302_sec_addr 0x80
#define ds1302_min_addr 0x82
#define ds1302_hr_addr 0x84
#define ds1302_date_addr 0x86
#define ds1302_month_addr 0x88
#define ds1302_day_addr 0x8A
#define ds1302_year_addr 0x8C
#define ds1302_control_addr 0x8Ee
#define ds1302_charger_addr 0x90
#define ds1302_clkburst_addr 0xBE
/********************************************************************/
extern void Write_Ds1302_Byte(unsigned char dat);
extern unsigned char Read_Ds1302_Byte(void);
extern void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat);
extern unsigned char Ds1302_Single_Byte_Read(unsigned char addr);
void SetTime(uchar shi,uchar fen,uchar miao);
#endif
ds1302.c
#include "ds1302.h"
/********************************************************************/
void Write_Ds1302_Byte(unsigned char dat)
{
unsigned char i;
SCK = 0;
for (i=0;i<8;i++)
{
if (dat & 0x01)
{
SDA_SET;
}
else
{
SDA_CLR;
}
SCK_SET;
SCK_CLR;
dat = dat >> 1;
}
}
/********************************************************************/
unsigned char Read_Ds1302_Byte(void)
{
unsigned char i, dat=0;
for (i=0;i<8;i++)
{
dat = dat >> 1;
if (SDA_R)
{
dat |= 0x80;
}
else
{
dat &= 0x7F;
}
SCK_SET;
SCK_CLR;
}
return dat;
}
/********************************************************************/
void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat)
{
RST_CLR;
SCK_CLR;
RST_SET;
addr = addr & 0xFE;
Write_Ds1302_Byte(addr);
Write_Ds1302_Byte(dat);
RST_CLR;
}
/********************************************************************/
unsigned char Ds1302_Single_Byte_Read(unsigned char addr)
{
unsigned char temp;
RST_CLR;
SCK_CLR;
RST_SET;
addr = addr | 0x01;
Write_Ds1302_Byte(addr);
temp=Read_Ds1302_Byte();
RST_CLR;
return temp;
}
void SetTime(uchar shi,uchar fen,uchar miao)
{
Ds1302_Single_Byte_Write(0x8e, 0x00);
Ds1302_Single_Byte_Write(0x80, (miao/10*16)+miao%10);
Ds1302_Single_Byte_Write(0x82, (fen/10*16)+fen%10);
Ds1302_Single_Byte_Write(0x84, (shi/10*16)+shi%10);
Ds1302_Single_Byte_Write(0x8e, 0x80);
}
onewire.h
#ifndef _ONEWIRE_H
#define _ONEWIRE_H
#include "stc15f2k60s2.h"
#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe
sbit DQ = P1^4;
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
bit Init_DS18B20(void);
unsigned char Read_DS18B20(void);
unsigned char ReadTemp();
#endif
onewire.c
#include "onewire.h"
void Delay_OneWire(unsigned int t)
{
t*=12;
while(t--);
}
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;
}
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;
}
unsigned char ReadTemp()
{
unsigned char temp;
unsigned char low,high;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
Delay_OneWire(200);
low = Read_DS18B20();
high = Read_DS18B20();
temp = high<<4;
temp |= (low&0xf0)>>4 ;
return temp;
}