数码管时钟V12.docx
《数码管时钟V12.docx》由会员分享,可在线阅读,更多相关《数码管时钟V12.docx(42页珍藏版)》请在冰点文库上搜索。
![数码管时钟V12.docx](https://file1.bingdoc.com/fileroot1/2023-7/22/93461ac0-78f7-4d6c-882c-7c2ec8d063c5/93461ac0-78f7-4d6c-882c-7c2ec8d063c51.gif)
数码管时钟V12
数码管时钟V1.2
Author:
吴林新
Date:
2012/02/14
群:
110567841
此次作品开源仅面向初级单片机的朋友,高手勿喷!
!
!
!
!
!
此作品软硬件设计系作者原创,此次代码开源,是希望有兴趣的朋友多多指教,发挥大家的创意;由于时间仓促,有不到之处敬请原谅;
此数码管时钟的设计其目的不是教大家如何做个带温度的钟,而是它包含的内容,几乎包含了51单片机80%以上的知识点,软件上采用多文件结构也是本设计的一大亮点
代码如下:
#ifndef_MAIN_H_
#define_MAIN_H_
#include
#include
//---------------------------------
typedefunsignedcharuchar;
typedefunsignedintuint;
//******定义端口***********
sbitSetFlag=P2^1;//设置键
sbitBUZZ=P2^7;
sbitCOM1=P3^5;
sbitCOM2=P3^6;
sbitCOM3=P3^7;
//-----------预处理----------------
#include"max7219_1.h"
#include"max7219_2.h"
#include"max7219_3.h"
#include"ds18b20.h"
#include"24c02.h"
#include"1302.h"
#include"74HC595.H"
#include"GetKeyVal.H"
#include"workmode.h"
#include"setmode.h"
//******函数声明***********
voiddelay(uintt);
voidSettime_1302(void);
externvoidKeying(void);
externvoidSaveRing(uchari);
externvoidAlarmTempSensor(void);
#endif
//----------------------------------------------------------------------------------------------------------------------------
#ifndef_MAX7219_1_H
#define_MAX7219_1_H
sbitDIN1=P0^0;
sbitCLK1=P0^2;
sbitLOAD1=P0^1;
externvoidMax7219Init_1(void);
externvoidSendData_1(unsignedcharaddr,unsignedchardat);
#endif
//----------------------------------------------------------------------------------------------------------------------------
#ifndef_MAX7219_2_H
#define_MAX7219_2_H
sbitDIN2=P0^3;
sbitCLK2=P0^5;
sbitLOAD2=P0^4;
externvoidMax7219Init_2(void);
externvoidSendData_2(unsignedcharaddr,unsignedchardat);
#endif
//----------------------------------------------------------------------------------------------------------------------------
#ifndef_MAX7219_3_H
#define_MAX7219_3_H
sbitDIN3=P0^6;
sbitCLK3=P2^0;
sbitLOAD3=P0^7;
voidMax7219Init_3(void);
voidSendData_3(unsignedcharaddr,unsignedchardat);
#endif
//----------------------------------------------------------------------------------------------------------------------------
#ifndef_DS18B20_H
#define_DS18B20_H
sbitData=P2^2;
externunsignedintTempSensor[9];
externvoidConfigTempSensor(void);
externbitReadTempSensor(void);
externvoidTempSensorConvert(void);
#endif
//----------------------------------------------------------------------------------------------------------------------------
#ifndef_24C02_H
#define_24C02_H
#include
#define_Nop()_nop_()
sbitSDA=P3^4;
sbitSCL=P3^3;
externvoidINIT_I2C(void);
externbitSendMultiByte(uintslaveaddr,uintsubaddr,uchar*ch,ucharlen);
externbitReadMultiByte(uintslaveaddr,uintsubaddr,uchar*ch,ucharlen);
#endif
//----------------------------------------------------------------------------------------------------------------------------
#ifndef_1302_H_
#define_1302_H_
//-------------------------------------------------------------------------------------------------------
#defineCONTROL_REGISTER0x8e//写控制寄存器
#defineWRITE_SEC0x80
#defineREAD_SEC0x81
#defineWRITE_MINUTE0x82
#defineREAD_MINUTE0x83
#defineWRITE_HOUR0x84
#defineREAD_HOUR0x85
#defineWRITE_DATE0x86
#defineREAD_DATE0x87
#defineWRITE_MONTH0x88
#defineREAD_MONTH0x89
#defineWRITE_WEEK0x8a
#defineREAD_WEEK0x8b
#defineWRITE_YEAR0x8c
#defineREAD_YEAR0x8d
//-------------------------------------------------------------------------------------------------------
#defineFlashYear0
#defineFlashMonth1
#defineFlashDate2
#defineFlashHour3
#defineFlashMin4
#defineFlashSec5
#defineFlashWeek6
#defineAllValidFlag()(year=month=date=hour=min=sec=week=1)
externbityear,month,date,hour,min,sec,week;
typedefstruct
{
ucharsec;
ucharmin;
ucharhour;
uchardate;
ucharmonth;
ucharweek;
ucharyear;
uchartep;
uchardispcal[18];
}TIME;
externTIMEtime;
//--------INTERFACETOHARDWARE--------------
sbitSCK=P3^1;//时钟
sbitIO=P3^0;//数据
sbitRST=P3^2;//片选
//-------------------------------------------
voidwrite_ds1302_byte(uchardat);//单字节写
ucharread_ds1302_byte(void);//单字节读
voidInitial_1302(void);//初始化1302
externvoidGet1302time(void);//读时间
voidset1302(uchar*buff);//设置1302
voidRd1302Clk(uchar*buff);
voidWr1302Clk(uchar*buff);
externvoidTimeVal(void);
#endif
//----------------------------------------------------------------------------------------------------------------------------
#ifndef_74HC595_H
#define_74HC595_H
//------------interfacetohardware-------------
sbitSH_CP=P2^3;
sbitST_CP=P2^5;
sbitDS=P2^4;
sbitOE=P2^6;
externvoidSend595Data(uchardat);
#endif
//----------------------------------------------------------------------------------------------------------------------------
#ifndef_GETKEYVAL_H
#define_GETKEYVAL_H
#definePortValP1
externucharKeyVal;
externbitChgFlag;
externvoiddelayms(uchart);
#endif
//----------------------------------------------------------------------------------------------------------------------------
#ifndef_WORKMODE_H
#define_WORKMODE_H
voidWorkMode(void);
voidQuarter_Bell(void);
externvoiddisplay(void);
externvoidDispSet(void);
externvoidAlarmDisplay(void);
#endif
//----------------------------------------------------------------------------------------------------------------------------
#ifndef_SETMODE_H
#define_SETMODE_H
#defineEnter1
#defineBack2
#defineINC3
#defineDEC4
#defineAlarmClockSet5
externvolatileucharflk;
externucharAlarmBuff[3];
voidLedFlicker(void);
voidSetMode(void);
voidSetYear(void);
voidSetMonth(void);
voidSetDate(void);
voidSetHour(void);
voidSetAlarmHour(void);
voidSetMin(void);
voidSetAlarmMin(void);
voidSetSec(void);
voidSetAlarmSec(void);
voidSetWeek(void);
bitGetKeyCal(void);
#endif
//----------------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------------
#include"main.h"
voidmain()
{
ucharn=70;
INIT_I2C();
ConfigTempSensor();
Initial_1302();
Max7219Init_1();
Max7219Init_2();
Max7219Init_3();
ReadMultiByte(0xa0,0,AlarmBuff,3);
while(n--)
{
Get1302time();
ReadTempSensor();
TempSensorConvert();
display();
}
while
(1)
{
if(SetFlag)
{
WorkMode();//工作模式
}
else
{
SetMode();//设置模式
}
}
}
voidKeying(void)//按键声
{
BUZZ=0;
delay(400);
BUZZ=1;
}
voidSaveRing(ucharw)
{
unsignedchari;
for(i=w;i>0;i--)
{
BUZZ=0;
delay(800);
BUZZ=1;
delay(800);
}
}
voidAlarmTempSensor(void)//1820错误报警
{
unsignedchari;
for(i=3;i>0;i--)
{
BUZZ=0;
delay(800);
BUZZ=1;
delay(800);
}
}
voiddelay(uintt)
{
ucharj;
for(;t>0;t--)
for(j=10;j>0;j--);
}
//----------------------------------------------------------------------------------------------------------------------------
#include"main.h"
//01234567
unsignedcharcodeSEGCODE7219[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,
//89abcdefo-黑屏
0x7f,0x7b,0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x63,0x01,0x00};
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6};//数码管译码
staticunsignedcharRing;
ucharRingFlag;
voidWorkMode()
{
ucharLastMin,LastSec;
AllValidFlag();
LastMin=0xff;
LastSec=0xff;
RingFlag=0;
while(SetFlag)
{
Get1302time();
if(LastSec!
=time.sec)
{
LastSec=time.sec;
if(RingFlag==1)Quarter_Bell();
ReadMultiByte(0xa0,0,AlarmBuff,3);
if(time.hour==AlarmBuff[0]&&time.min==AlarmBuff[1]&&time.sec==AlarmBuff[2])
{
Ring=10;
RingFlag=1;
}
if(LastMin!
=time.min)
{
if(ReadTempSensor())TempSensorConvert();
elseAlarmTempSensor();
LastMin=time.min;
}
}
display();
}
}
voidQuarter_Bell()
{
if(Ring!
=0)
{
Ring--;
BUZZ=0;
delay(400);
BUZZ=1;
}
else
{
RingFlag=0;
}
}
voiddisplay(void)
{
unsignedchari;
if(year==0){time.dispcal[0]=18;time.dispcal[1]=18;}
else{time.dispcal[0]=time.year/16;time.dispcal[1]=time.year%16;}
if(month==0){time.dispcal[3]=18;time.dispcal[4]=18;}
else{time.dispcal[3]=time.month/16;time.dispcal[4]=time.month%16;}
if(date==0){time.dispcal[6]=18;time.dispcal[7]=18;}
else{time.dispcal[6]=time.date/16;time.dispcal[7]=time.date%16;}
if(hour==0){time.dispcal[8]=18;time.dispcal[9]=18;}
else{time.dispcal[8]=time.hour/16;time.dispcal[9]=time.hour%16;}
if(min==0){time.dispcal[11]=18;time.dispcal[12]=18;}
else{time.dispcal[11]=time.min/16;time.dispcal[12]=time.min%16;}
if(sec==0){time.dispcal[14]=18;time.dispcal[15]=18;}
else{time.dispcal[14]=time.sec/16;time.dispcal[15]=time.sec%16;}
for(i=1;i<9;i++)//年月日
{
SendData_1(i,SEGCODE7219[time.dispcal[i-1]]);//Max7219-1
}
for(i=1;i<9;i++)//时分秒
{
SendData_2(i,SEGCODE7219[time.dispcal[i+7]]);//Max7219-2
}
for(i=1;i<9;i++)//温度
{
if(i==3)SendData_3(i,SEGCODE7219[TempSensor[i-1]]|0x80);//Max7219-3
elseSendData_3(i,SEGCODE7219[TempSensor[i-1]]);
}
//----------------week-------------
if(week)
{
COM1=1;COM2=0;COM3=0;
Send595Data(table[time.dispcal[16]]);
delay(10);
COM1=0;COM2=1;COM3=0;
Send595Data(table[time.dispcal[17]]);
delay(10);
}
//---------------C------------------
COM1=0;COM2=0;COM3=1;
Send595Data(table[TempSensor[8]]);
delay(10);
}
voidDispSet(void)
{
uchari;
TimeVal();
for(i=1;i>9;i++)//年月日
{
SendData_1(i,SEGCODE7219[time.dispcal[i-1]]);//Max7219-1
}
for(i=1;i>9;i++)//时分秒
{
SendData_2(i,SEGCODE7219[time.dispcal[i+7]]);//Max7219-2
}
//----------------week-------------
Send595Data(table[time.dispcal[16]]);
COM1=1;COM2=0;COM3=0;
delay(10);
Send595Data(table[time.dispca