时钟完整版(带整点报时)

时钟完整版(带整点报时)
时钟完整版(带整点报时)

#include

#include

#include

#include

#include"resource.h"

#include

#include

#pragma comment(lib,"WinLib.lib")

#pragma comment(lib,"WINMM.LIB")//导入声音用

void SetDlgMenuID(UINT nMainDlgID,UINT nCalendarDlgID,UINT nMenuID); void SetButtonID(UINT nCalendarID,UINT nExitID,UINT nBiaoPan1,UINT nBiaoPan2,UINT nBiaoPan3);

INT_PTR ShowMainDlg();

/*

*********************************************************

API函数参考:

GetLocalTime: 获得当前时间(公历:年、月、日、周)

MoveToEx: 移动划线的起点

LineTo: 绘制到某一点

SetTextColor: 设置要绘制的文字颜色

TextOut: 绘制文字

SetBkMode: 设置背景显示模式

wsprintf: 整数转换为字符串,宽字符,用Unicode码

GetClientRect: 获取窗口大小

GetDC: 获取内存设备

SetTimer: 设置定时器

FillRect: 填充矩形

CreateSolidBrush: 创建刷子

RGB: 设置RGB颜色

CreateFont:创建一种有特殊性的字体

结构体类型参考:

SYSTEMTIME: 描述时间类型,包括年月日、时分秒、周

*********************************************************

*/

HINSTANCE g_hInst;//保存操作系统传递进来的"应用程序实例句柄"

//Windows程序入口函数

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )

{

g_hInst = hInstance;

SetDlgMenuID(IDD_DLG_CLOCK,IDD_DLG_CALENDAR,IDR_MENU);

SetButtonID(ID_CALENDAR,ID_EXIT,ID_BIAO1,ID_BIAO2,ID_BIAO3);

ShowMainDlg(IDD_DLG_CLOCK);

}

typedef struct _stDateTime

{

int nYear;

int nMonth;

int nDay;

}stDateTime;

//定义表格,存储年-2099年的农历信息:每年的大小月、闰月信息、春节所在的公历日期

unsigned int LunarCalendarTable[199] =

{

0x04AE53,0x0A5748,0x5526BD,0x0D2650,0x0D9544,0x46AAB9,0x056A4D, 0x09AD42,0x24AEB6,0x04AE4A,/*1901-1910*/

0x6A4DBE,0x0A4D52,0x0D2546,0x5D52BA,0x0B544E,0x0D6A43,0x296D37, 0x095B4B,0x749BC1,0x049754,/*1911-1920*/

0x0A4B48,0x5B25BC,0x06A550,0x06D445,0x4ADAB8,0x02B64D,0x095742, 0x2497B7,0x04974A,0x664B3E,/*1921-1930*/

0x0D4A51,0x0EA546,0x56D4BA,0x05AD4E,0x02B644,0x393738,0x092E4B, 0x7C96BF,0x0C9553,0x0D4A48,/*1931-1940*/

0x6DA53B,0x0B554F,0x056A45,0x4AADB9,0x025D4D,0x092D42,0x2C95B6, 0x0A954A,0x7B4ABD,0x06CA51,/*1941-1950*/

0x0B5546,0x555ABB,0x04DA4E,0x0A5B43,0x352BB8,0x052B4C,0x8A953F, 0x0E9552,0x06AA48,0x6AD53C,/*1951-1960*/

0x0AB54F,0x04B645,0x4A5739,0x0A574D,0x052642,0x3E9335,0x0D9549, 0x75AABE,0x056A51,0x096D46,/*1961-1970*/

0x54AEBB,0x04AD4F,0x0A4D43,0x4D26B7,0x0D254B,0x8D52BF,0x0B5452, 0x0B6A47,0x696D3C,0x095B50,/*1971-1980*/

0x049B45,0x4A4BB9,0x0A4B4D,0xAB25C2,0x06A554,0x06D449,0x6ADA3D, 0x0AB651,0x093746,0x5497BB,/*1981-1990*/

0x04974F,0x064B44,0x36A537,0x0EA54A,0x86B2BF,0x05AC53,0x0AB647, 0x5936BC,0x092E50,0x0C9645,/*1991-2000*/

0x4D4AB8,0x0D4A4C,0x0DA541,0x25AAB6,0x056A49,0x7AADBD,0x025D52, 0x092D47,0x5C95BA,0x0A954E,/*2001-2010*/

0x0B4A43,0x4B5537,0x0AD54A,0x955ABF,0x04BA53,0x0A5B48,0x652BBC, 0x052B50,0x0A9345,0x474AB9,/*2011-2020*/

0x06AA4C,0x0AD541,0x24DAB6,0x04B64A,0x69573D,0x0A4E51,0x0D2646, 0x5E933A,0x0D534D,0x05AA43,/*2021-2030*/

0x36B537,0x096D4B,0xB4AEBF,0x04AD53,0x0A4D48,0x6D25BC,0x0D254F, 0x0D5244,0x5DAA38,0x0B5A4C,/*2031-2040*/

0x056D41,0x24ADB6,0x049B4A,0x7A4BBE,0x0A4B51,0x0AA546,0x5B52BA, 0x06D24E,0x0ADA42,0x355B37,/*2041-2050*/

0x09374B,0x8497C1,0x049753,0x064B48,0x66A53C,0x0EA54F,0x06B244, 0x4AB638,0x0AAE4C,0x092E42,/*2051-2060*/

0x3C9735,0x0C9649,0x7D4ABD,0x0D4A51,0x0DA545,0x55AABA,0x056A4E, 0x0A6D43,0x452EB7,0x052D4B,/*2061-2070*/

0x8A95BF,0x0A9553,0x0B4A47,0x6B553B,0x0AD54F,0x055A45,0x4A5D38, 0x0A5B4C,0x052B42,0x3A93B6,/*2071-2080*/

0x069349,0x7729BD,0x06AA51,0x0AD546,0x54DABA,0x04B64E,0x0A5743, 0x452738,0x0D264A,0x8E933E,/*2081-2090*/

0x0D5252,0x0DAA47,0x66B53B,0x056D4F,0x04AE45,0x4A4EB9,0x0A4D4C, 0x0D1541,0x2D92B5 /*2091-2099*/

};

char* TianGanDizhi[60]=

{

"甲子", "乙丑","丙寅","丁卯","戊辰","已巳","庚午","辛未","壬申","癸酉",

"甲戌","乙亥","丙子","丁丑","戊寅","已卯","庚辰","辛巳","壬午","癸未",

"甲申","乙酉","丙戌","丁亥","戊子","已丑","庚寅","辛卯","壬辰","癸巳",

"甲午","乙未","丙申","丁酉","戊戌","已亥","庚子","辛丑","壬寅","癸卯",

"甲辰","乙巳","丙午","丁未","戊申","已酉","庚戌","辛亥","壬子","癸丑",

"甲寅","乙卯","丙辰","丁巳","戊午","已未","庚申","辛酉","壬戌","癸亥"

char *ChDayTable[] =

{

"*","初一","初二","初三","初四","初五",

"初六","初七","初八","初九","初十",

"十一","十二","十三","十四","十五",

"十六","十七","十八","十九","二十",

"廿一","廿二","廿三","廿四","廿五",

"廿六","廿七","廿八","廿九","三十"

};

char *ChMonthTable[] = {"*","正","二","三","四","五","六","七","八","九","十","十一","腊"};

//定义表格,存储每月日离元旦的天数(不考虑瑞年)

unsigned int MonthAdd[12] =

{0,31,59,90,120,151,181,212,243,273,304,334};

//定义用户要显示的年、月、日

unsigned int nCurrentYear=0; //button控制年

unsigned int nCurrentMonth=0;//月

unsigned int nCurrentDay=0; //日

UINT LiteSongs = 0; //判断是否听歌

UINT Total=0; //我自定义的变量,当月的总天数

UINT PreTotal=0; //自定义的当月的前一月的总天数

UINT BUTTON6=0;

UINT BUTTON4=0;

int k=0;

int m=0;

//TCHAR Hours[255];

SYSTEMTIME BellTime;

UINT Inthour=0;

//判断某年是否为公历瑞年

int IsLeapYear(WORD iYear) //学生需要修改此函数,已经修改

{

if(((iYear%4==0)&&!(iYear%100==0))||(iYear%400==0))

return 1;

else

return 0;

}

//公历日期转农历日期的函数

void SunToLunar(const stDateTime* pSunDay,stDateTime* pLunarDay) {

int i=0;

int SunDiff=0;

int SpringDiff=0;

int nSpringYear=pSunDay->nYear;

int nSpringMonth=1;

int nSpringDay=0;

//计算当前公历日离当年元旦的天数

SunDiff = MonthAdd[pSunDay->nMonth-1] + pSunDay->nDay - 1;

if(IsLeapYear(pSunDay->nYear) && (pSunDay->nMonth > 2) )//若是瑞年且大于月,天数再加

SunDiff++;

//计算春节所在公历日离元旦的天数:通过查表,计算当年的春节所在的公历日期,

if(((LunarCalendarTable[pSunDay->nYear - 1901] & 0x60)>>5)==1)//若春节在公历月

SpringDiff=

(LunarCalendarTable[pSunDay->nYear-1901]&0x1F)-1;

else//若春节在公历月

SpringDiff=

(LunarCalendarTable[pSunDay->nYear-1901]&0x1F)-1+31;

//SunDiff和SpringDiff的差就是当前公历日离春节的天数

if(SunDiff>=SpringDiff)//公历日在春节后

{

int x = SunDiff - SpringDiff;

int bLunar = (LunarCalendarTable[nSpringYear - 1901] & 0xF00000)>>20;//闰月月份

i=0;

nSpringMonth=1;

for(;;)

{

int a = (LunarCalendarTable[pSunDay->nYear-1901] & (0x80000>>i));//计算大小月

if(a==0)

a=29;

else

a=30;

if(x

break;

x =x - a;

i++;

nSpringMonth++;

}

nSpringDay =x+1;

//如果有闰月

if(nSpringMonth>bLunar && bLunar>0)

nSpringMonth--;

}

else//公历日在春节前

{

int x = SpringDiff-SunDiff;

int nShift=0;

int bLunar = (LunarCalendarTable[nSpringYear - 1901] & 0xF00000)>>20;//闰月月份

i=0;

nSpringYear--;//需要上一年的农历信息

nSpringMonth=12;//从最后一个月开始计算

if (bLunar == 0)//如果没有润月

nShift = 0x100;

else

nShift = 0x80;

for(;;)

{

int a = (LunarCalendarTable[nSpringYear-1901] & (nShift<

if(a==0)

a=29;

else

a=30;

if(x

{

x = a-x;

break;

}

x =x - a;

i++;

nSpringMonth--;

}

nSpringDay =x+1;

if(nSpringMonth0)

nSpringMonth++;

}

pLunarDay->nYear = nSpringYear;

pLunarDay->nMonth= nSpringMonth;

pLunarDay->nDay = nSpringDay;

}

//根据公历日期获得星期

int GetDayOfWeek(const stDateTime* pSunDay)

{

//根据泰勒公式

//nWeek = [nYear1÷] - 2*nYear1 + nYear2 + [nYear2÷] + [26(nMonth+1)÷] + nDay - 1

int nWeek=0;

int nYear1=pSunDay->nYear/100;//年的前两位数字

int nYear2=pSunDay->nYear%100;//年的后两位数字

int nDay=pSunDay->nDay; //公立日

int nMonth=pSunDay->nMonth;//公立月数,所求的月份如果是月或月,//则应视为上一年的月或月,

//也就是公式中nMonth的取值范围是从到而不是从到

if(nMonth==1 || nMonth==2)

{

nMonth=12+nMonth;

nYear1=(pSunDay->nYear-1)/100;//年的前两位数字

nYear2=(pSunDay->nYear-1)%100;//年的后两位数字

}

nWeek = nYear1/4 - 2*nYear1 + nYear2 + nYear2/4 + (26*(nMonth+1))/10 + nDay - 1;

if(nWeek < 0)

nWeek = ((nWeek)%7+7);// 有问题吗?nWeek可能小于零,循环加

else

nWeek = (nWeek)%7;

return nWeek;

}

//根据公立年得到农历干支年

char* GetGanZhi(int nYear)

{

int i=(nYear-1984)%60;

return TianGanDizhi[i];

}

//日历绘制函数,学生自己实现该函数

void DrawCalendar(HDC hDC,int nWidth,int nHeight)

{

//获得日历的背景色

stDateTime SunDay,LunarDay; //存储当时年月日

SYSTEMTIME DateTime; //系统时间RECT rc;

HBRUSH hBrush;

HFONT hFont;

TCHAR RILI[255]; //日历的标题

TCHAR GraTime[255]; //表格日期

UINT xOrg=50; //x起始坐标

UINT yOrg=50; //y起始坐标

UINT xRight=nWidth-45; //X的右端不包括UINT yBottom = nHeight-30; //Y的底部

UINT i=0,biaoGe=0; //日历表格用

TCHAR *WeekDay[] = {"日","一","二","三","四","五","六"};

TCHAR *ShuXiang[]= {"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};

UINT Week=0;//列数

UINT Hang=0;//行数

TCHAR Str[255];//农历和公历年月字符

UINT week=0;

UINT hangkuan=0,liekuan=0;

UINT First=0;

UINT xLeft=0;

UINT yRigth=0;

UINT ShengXiao=0;

UINT BeiJing=0;

HBITMAP hBkmap;//得到图片

HDC hdc;

//绘制日历的矩形背景(改变皮肤)

hdc = CreateCompatibleDC(hDC);

switch (nCurrentMonth%12)

{

case 0:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/beijing/yiyue.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 1:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/beijing/eryue.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 2:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/beijing/sanyue.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;

break;

case 3:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/beijing/siyue.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 4:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/beijing/wuyue.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 5:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/beijing/liuyue.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;

break;

case 6:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/beijing/qi.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 7:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/beijing/ba.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 8:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/beijing/jiu.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 9:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/beijing/shi.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 10:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/beijing/shiyi.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 11:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/beijing/shier.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

}

SelectObject(hdc,hBkmap);

BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);

SetRect (&rc,xOrg+65,yOrg,xRight-65,yOrg+25);

hBrush=CreateSolidBrush(RGB(230,0,150));

FillRect(hDC,&rc,hBrush);

SetRect (&rc,xOrg,yOrg,xOrg+65,yOrg+25);

hBrush=CreateSolidBrush(RGB(0,255,255));

FillRect(hDC,&rc,hBrush);

SetRect (&rc,xRight-65,yOrg,xRight,yOrg+25);

hBrush=CreateSolidBrush(RGB(0,255,255));

FillRect(hDC,&rc,hBrush);//绘制星期背景色

MoveToEx(hDC,xOrg,yOrg,NULL);

LineTo(hDC,xRight,yOrg);

MoveToEx(hDC,xOrg,yOrg,NULL);

LineTo(hDC,xOrg,yBottom);

MoveToEx(hDC,xRight,yOrg,NULL);

LineTo(hDC,xRight,yBottom);

MoveToEx(hDC,xOrg,yBottom,NULL);

LineTo(hDC,xRight,yBottom);

//星期标题框

MoveToEx(hDC,xOrg,yOrg+25,NULL);

LineTo(hDC,xRight,yOrg+25);

//行

biaoGe = yBottom-yOrg-25;//只是日历的高度

biaoGe = biaoGe/6;//高度分为六块

hangkuan=biaoGe;

for(i=0;i<5;i++)//画五行

{

MoveToEx(hDC,xOrg,yOrg+25+biaoGe*(i+1),NULL);

LineTo(hDC,xRight,yOrg+25+biaoGe*(i+1));

}

//列

biaoGe = xRight-xOrg;//只是日历的宽度

biaoGe = biaoGe/7;//要七列

liekuan=biaoGe;

for(i=0;i<6;i++)//画七列

{

MoveToEx(hDC,xOrg+biaoGe*(i+1),yOrg,NULL);

LineTo(hDC,xOrg+biaoGe*(i+1),yBottom);

}

//绘制‘星期’标题框内的文字

SetTextColor(hDC,RGB(255,0,0));

TextOut(hDC,xOrg+20,yOrg+6,WeekDay[0],strlen(WeekDay[0]));//星期日的

//绘制“属相”的文字

SetTextColor(hDC,RGB(0,100,255));

switch((nCurrentYear-4)%12)//jisuan

{

case 0:

TextOut(hDC,xOrg-35,yOrg,ShuXiang[0],strlen(ShuXiang[0]));

break;

case 1:

TextOut(hDC,xOrg-35,yOrg,ShuXiang[1],strlen(ShuXiang[1]));

break;

case 2:

TextOut(hDC,xOrg-35,yOrg,ShuXiang[2],strlen(ShuXiang[2]));

break;

case 3:

TextOut(hDC,xOrg-35,yOrg,ShuXiang[3],strlen(ShuXiang[3]));

break;

case 4:

TextOut(hDC,xOrg-35,yOrg,ShuXiang[4],strlen(ShuXiang[4]));

break;

case 5:

TextOut(hDC,xOrg-35,yOrg,ShuXiang[5],strlen(ShuXiang[5]));

break;

case 6:

TextOut(hDC,xOrg-35,yOrg,ShuXiang[6],strlen(ShuXiang[6]));

break;

case 7:

TextOut(hDC,xOrg-35,yOrg,ShuXiang[7],strlen(ShuXiang[7]));

break;

case 8:

TextOut(hDC,xOrg-35,yOrg,ShuXiang[8],strlen(ShuXiang[8]));

break;

case 9:

TextOut(hDC,xOrg-35,yOrg,ShuXiang[9],strlen(ShuXiang[9]));

break;

case 10:

TextOut(hDC,xOrg-35,yOrg,ShuXiang[10],strlen(ShuXiang[10]));

break;

case 11:

TextOut(hDC,xOrg-35,yOrg,ShuXiang[11],strlen(ShuXiang[11]));

break;

}

SetTextColor(hDC,RGB(0,0,0));

for(i=1;i<6;i++)//星期一到六

{

TextOut(hDC,xOrg+20+biaoGe*i,yOrg+6,WeekDay[i],strlen(WeekDay[i ]));

}

SetTextColor(hDC,RGB(255,0,0));

TextOut(hDC,xOrg+20+biaoGe*6,yOrg+6,WeekDay[6],strlen(WeekDay[6 ]));

//以下代码是公历显示

if(nCurrentYear==0)//如果当前日期还没有被设定

{

GetLocalTime(&DateTime);

nCurrentYear = DateTime.wYear;

nCurrentMonth= DateTime.wMonth;

nCurrentDay =DateTime.wDay;

}

SunDay.nYear = nCurrentYear;

SunDay.nMonth = nCurrentMonth;

SunDay.nDay = nCurrentDay;

SunToLunar(&SunDay,&LunarDay);//得到农历

TextOut(hDC,80,28,ChMonthTable[LunarDay.nMonth],

strlen(ChMonthTable[LunarDay.nMonth]));//农历显示TextOut(hDC,110,28,"月",strlen("月"));

SunDay.nDay = 1;

wsprintf(GraTime,"%.4d年%.2d月%.2d日

",nCurrentYear,nCurrentMonth,nCurrentDay);//现在时间

TextOut(hDC,50,10,GraTime,strlen(GraTime));//标题的时间

//十二生肖图片

hdc = CreateCompatibleDC(hDC);

switch((nCurrentYear-4)%12)

{

case 0:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/shengxiao/0.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 1:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/shengxiao/1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 2:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/shengxiao/2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 3:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/shengxiao/3.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 4:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/shengxiao/4.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 5:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/shengxiao/5.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 6:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/shengxiao/6.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 7:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/shengxiao/7.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 8:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/shengxiao/8.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 9:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/shengxiao/9.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 10:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/shengxiao/10.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

case 11:

hBkmap = (HBITMAP)LoadImage(g_hInst,

"../image/shengxiao/11.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

break;

}

SelectObject(hdc,hBkmap);

BitBlt(hDC,7,20,150,150,hdc,0,0,SRCCOPY);

//该月的总天数

if(SunDay.nMonth==12)

{

//PreTotal=30;

Total=31;

else

Total=MonthAdd[SunDay.nMonth]-MonthAdd[SunDay.nMonth-1];

if(IsLeapYear(SunDay.nYear)&&SunDay.nMonth==2)

{

Total++;

}

//前一月的总天数

if(SunDay.nMonth==1)

PreTotal=31;

else if(SunDay.nMonth==3)

{

PreTotal=28;

if(IsLeapYear(SunDay.nYear))

PreTotal++;

}

else if(SunDay.nMonth==12)

PreTotal=30;

else

PreTotal=MonthAdd[SunDay.nMonth-1]-MonthAdd[SunDay.nMonth-2];

First=GetDayOfWeek(&SunDay); //该月的第一天是星期几

for(i=1;i<=Total;i++)

{

SunDay.nYear = nCurrentYear;

SunDay.nMonth = nCurrentMonth;

SunDay.nDay=i; //从一号开始

week=GetDayOfWeek(&SunDay);//得到该月第i号是星期几 SunToLunar(&SunDay,&LunarDay);//得到农历

Week=week%7; //从第Week列开始

Hang=((First+i-1)-(First+i-1)%7)/7; //从第Hang行开始

xLeft=xOrg+15+(Week)*liekuan;

yRigth=yOrg+40+(Hang)*hangkuan;

if(DateTime.wYear==SunDay.nYear&&DateTime.wMonth==SunDay.nMonth &&DateTime.wDay==i)//显示今天

{

SetRect (&rc,xOrg+(Week)*liekuan,yOrg+25+(Hang)*hangkuan

,xOrg+(Week)*liekuan+liekuan,yOrg+25+(Hang)*hangkuan+hangkuan) ;

hBrush=CreateSolidBrush(RGB(0,255,255));

FillRect(hDC,&rc,hBrush);

}

if(nCurrentYear==SunDay.nYear&&nCurrentMonth==SunDay.nMonth&&nC urrentDay==i)//动态显示每一天

{

SetRect (&rc,xOrg+(Week)*liekuan,yOrg+25+(Hang)*hangkuan

,xOrg+(Week)*liekuan+liekuan,yOrg+25+(Hang)*hangkuan+hangkuan) ;

hBrush=CreateSolidBrush(RGB(255,255,0));

FillRect(hDC,&rc,hBrush);

}

SetTextColor(hDC,RGB(0,0,255));//节日颜色

if(SunDay.nMonth==1&&SunDay.nDay==1)

{

TextOut(hDC,xLeft,yRigth,"元旦",strlen("元旦"));//显示公历

}

else if(SunDay.nMonth==2&&SunDay.nDay==14)

{

TextOut(hDC,xLeft,yRigth,"情人节",strlen("情人节"));

}

else if(SunDay.nMonth==5&&SunDay.nDay==1)

{

TextOut(hDC,xLeft,yRigth,"劳动节",strlen("劳动节"));

else if(SunDay.nMonth==5&&SunDay.nDay==4)

{

TextOut(hDC,xLeft,yRigth,"青年节",strlen("青年节"));

}

else if(SunDay.nMonth==9&&SunDay.nDay==10)

{

TextOut(hDC,xLeft,yRigth,"教师节",strlen("教师节"));

}

else if(SunDay.nMonth==10&&SunDay.nDay==1)

{

TextOut(hDC,xLeft,yRigth,"国庆节",strlen("国庆节"));

}

else if(SunDay.nMonth==11&&SunDay.nDay==11)

{

TextOut(hDC,xLeft,yRigth,"光棍节",strlen("光棍节"));

}

else if(SunDay.nMonth==11&&SunDay.nDay==24)

{

TextOut(hDC,xLeft,yRigth,"感恩节",strlen("感恩节"));

}

else if(SunDay.nMonth==12&&SunDay.nDay==25)

{

TextOut(hDC,xLeft,yRigth,"圣诞节",strlen("圣诞节"));

}

else

{

wsprintf(Str,"%i",i);

SetTextColor(hDC,RGB(0,0,255));

TextOut(hDC,xLeft,yRigth,Str,strlen(Str));//显示公历}

//显示农历

SetTextColor(hDC,RGB(0,0,255));//节日颜色

if(LunarDay.nMonth==1&&LunarDay.nDay==1)

{

TextOut(hDC,xLeft,yRigth+15,"春节",strlen("春节"));//农历显示

else if(LunarDay.nMonth==1&&LunarDay.nDay==15)

{

TextOut(hDC,xLeft,yRigth+15,"元宵节",strlen("元宵节"));//农历显示

}

else if(LunarDay.nMonth==5&&LunarDay.nDay==5)

{

TextOut(hDC,xLeft,yRigth+15,"端午节",strlen("端午节"));//农历显示

}

else if(LunarDay.nMonth==9&&LunarDay.nDay==15)

{

TextOut(hDC,xLeft,yRigth+15,"中秋节",strlen("中秋节"));//农历显示

}

else if(LunarDay.nMonth==9&&LunarDay.nDay==9)

{

TextOut(hDC,xLeft,yRigth+15,"重阳节",strlen("重阳节"));//农历显示

}

else

{

SetTextColor(hDC,RGB(255,255,0));

if(LunarDay.nDay==1)//月初改为月名

{

TextOut(hDC,xLeft,yRigth+15,ChMonthTable[LunarDay.nMonth],

strlen(ChMonthTable[LunarDay.nMonth]));

TextOut(hDC,xLeft+20,yRigth+15,"月",strlen("月"));

}

else

TextOut(hDC,xLeft,yRigth+15,ChDayTable[LunarDay.nDay],

strlen(ChDayTable[LunarDay.nDay]));//农历显示}

}//for

EDA课程设计——多功能数字钟

哈尔滨工业大学(威海) 电子学课程设计报告带有整点报时的数字钟设计与制作 姓名: 蒋栋栋 班级: 0802503 学号: 080250331 指导教师: 井岩

目录 一、课程设计的性质、目的和任务 (3) 二、课程设计基本要求 (3) 三、设计课题要求 (3) 四、课程设计所需要仪器 (4) 五、设计步骤 (4) 1、整体设计框图 (4) 2、各个模块的设计与仿真 (4) 2.1分频模块 (4) 2.2计数器模块 (6) 2.3控制模块 (10) 2.4数码管分配 (13) 2.5显示模块 (14) 2.6报时模块 (16) 六、调试中遇到的问题及解决的方法 (18) 七、心得体会 (18)

一、课程设计的性质、目的和任务 创新精神和实践能力二者之中,实践能力是基础和根本。这是由于创新基于实践、源于实践,实践出真知,实践检验真理。实践活动是创新的源泉,也是人才成长的必由之路。 通过课程设计的锻炼,要求学生掌握电路的一般设计方法,具备初步的独立设计能力,提高综合运用所学的理论知识独立分析和解决问题的能力,培养学生的创新精神。 二、课程设计基本要求 掌握现代大规模集成数字逻辑电路的应用设计方法,进一步掌握电子仪器的正确使用方法,以及掌握利用计算机进行电子设计自动化(EDA)的基本方法。 三、设计课题要求 (1)构造一个24小时制的数字钟。要求能显示时、分、秒。 (2)要求时、分、秒能各自独立的进行调整。 (3)能利用喇叭作整点报时。从59分50秒时开始报时,每隔一秒报时一秒,到达00分00秒时,整点报时。整点报时声的频率应与其它的报时声频有明显区别。 #设计提示(仅供参考): (1)对频率输入的考虑 数字钟内所需的时钟频率有:基准时钟应为周期一秒的标准信号。报时频率可选用1KHz和2KHz左右(两种频率相差八度音,即频率相差一倍)。另外,为防止按键反跳、抖动,微动开关输入应采用寄存器输入形式,其时钟应为几十赫兹。 (2)计时部分计数器设计的考虑 分、秒计数器均为模60计数器。 小时计数为模24计数器,同理可建一个24进制计数器的模块。 (3)校时设计的考虑 数字钟校准有3个控制键:时校准、分校准和秒校准。 微动开关不工作,计数器正常工作。按下微动开关后,计数器以8Hz频率连续计数(若只按一下,则计数器增加一位),可调用元件库中的逻辑门建一个控制按键的模块,即建立开关去抖动电路(见书70页)。 (4)报时设计的考虑

微机原理课程设计数字时钟程序

河北科技大学 课程设计报告 学生姓名:学号: 专业班级: 电子信息科学与工程 课程名称:微型计算机原理及应用 学年学期: 2 01 1 —2012 学年第1 学期 指导教师: 20 0 1 1年 1 2月 课程设计成绩评定表

目录 一、课设题目及目的………………………………….4 二、设计任务………………………………………….4 三、总框图及设计流程 (4) 四、?源程序清单 (6) 五、?调试结果及显示 (19) 六、?个人贡献………………………………………….19 七、课程设计总结及体会 (21) 一、课设题目及目的 实习题目:数字时钟程序 实习目的:通过实习,使我们进一步弄懂所学到的课本知识,巩固和深化对8086系统的指令系统、中断系统、键盘/显示系统、程序设计、应用开发等基本理论知识的理解,提高汇编语言应用于技术的实践操作技能,掌握汇编语言应用系统设计、研制的方法,培养利用科技革新、开发和创新的基本能力,为毕业后从事与其相关的工作打下一定的基础。

二、课设任务 本课题为利用汇编语言设置时钟程序,其显示效果为:截取系统时间,能以时、分、秒(其中时为24小时制)的形式显示,并且通过合理的操作能修改时和分的内容来修改时间。再有,可以给它设定一个ALARM时间,到这个时间它就能产生信号,起到定时作用,。除此之外还能显示日期,日期分为年、月、日,其显示方式为xxxx年xx 月xx日。 ' *

DB '***********PRESS ESCBUTTON TO EXIT**************',0AH,0DH,'$' TN DB'PLEASE INPUT THE NEW TIME(HH:MM:SS):',0DH,0AH,'$' TMDB'PLEASE INPUT THE ALARM TIME (HH:MM:SS):',0DH,0AH,'$' MUSICMESS DB'PLEASE CHOOSE THE TYPE OF MUSIC:1(FAST) 2(MIDDLE) 3(SLOW)',0DH,0AH,'$' MESS2DB'TIME IS:',0AH,0DH,'$' MESS3DB 'TODAY IS:',0AH,0DH,'$' DBUFFER1DB20DUP('') T_BUFFD B 40 ;在数据段开一段时间显示缓冲区 DB ? DB 40DUP(?) HOR DB? MIN DB? SEC DB? TEMPHOR DB ? TEMPMIN DB? TEMPSEC DB? MUSIC DW 800;存放音乐的频率数DATA ENDS STACK SEGMENT DB 100 DUP(?) STACK ENDS CODESEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA START: CALL CLEAR ;调用清屏子程序 DISPLAY:;时间显示部分 MOV AX,DATA MOVDS,AX MOVBX,OFFSETT_BUFF;送T_BUFF的偏移地址到BX MOV AH,2CH;调用DOS时间调用功能,功能号:2CH,小时,分钟,秒数分别保存在CH,CL,DH中 INT 21H ;判断时间是否相等SUB DH,1;秒数+1修正 CALL CHECK ;.........................................................................

整点报时数字钟设计

信息与电气工程学院 课程设计说明书 课程名称:整点报时数字钟 题目:整点报时数字钟 专业班级:电气工程及其自动化07-05 学生姓名: 学号: 指导教师:崔春艳 设计周数:2周 设计成绩:

1. 课程设计目的……………………………………………………… 2 .课程设计的要求…………………………………………………… 3. 数字钟方案设计…………………………………………………… 3.1方案设计…………………………………………………………… 3.2数字钟逻辑框架图………………………………………………… 4. 单元电路的设计和元器件的选择………………………………… 4.1 时钟秒脉冲的产生………………………………………………… 4.2 六十进制计数电路的设计………………………………………… 4.3 双六十进制计数电路设计………………………………………… 4.4 二十四进制计数电路的设计……………………………………… 4.5 译码驱动及显示单元电路设计…………………………………… 4.6 整点报时器单元电路……………………………………………… 4.7 校正单元电路的设计……………………………………………… 5.数字钟的PCB 板图的设计…………………………………………… 5.1PROTEL99的使用…………………………………………………… 5.2具体工艺要求和相关规则………………………………………… 5.3 注意事项………………………………………………………… 6.系统调试……………………………………………………………… 6.1 系统调试方法……………………………………………………… 6.2调试出现的问题及解决方法……………………………………… 7. 元器件清单………………………………………………………… 8. 主要元件介绍……………………………………………………… 9. 课程设计总结和心得体会………………………………………… 9.1 设计过程中遇到的问题及解决方法……………………………… 9.2 个人体会…………………………………………………………… 10. 参考文献……………………………………………………………附录…………………………………………………………………… 1 数字钟原理图……………………………………………………… 2 数字钟PCB板………………………………………………………课程设计评语表格……………………………………………………

数字钟设计(带仿真和连接图)

- 数字电子技术课程设计报告 题目:数字钟的设计与制作 : 专业:电气本一班 学号:姓名: 指导教师: 时间: - —

一、设计内容 数字钟设计 … 技术指标: (1)时间以24小时为周期; (2能够显示时,分,秒; (3)有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间; (4)计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时; (5)为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号. ~ 二、设计时间: 第十五、十六周 三、设计要求: (1)画出设计的电路原理图; $ (2) 选择好元器件及给出参数,在原理图中反应出来; (3)并用仿真软件进行模拟电路工作情况; (4)编写课程报告。

! 摘要 数字钟实际上是一个对标准频率(1Hz)进行计数的计数电路。振荡器产生的时钟信号经过分频器形成秒脉冲信号,秒脉冲信号输入计数器进行计数,并把累计结果以“时”、“分”、“秒”的数字显示出来。秒计数器电路计满60后触发分计数器电路,分计数器电路计满60后触发时计数器电路,当计满24小时后又开始下一轮的循环计数。一般由振荡器、分频器、计数器、译码器、数码显示器等几部分组成。 振荡电路:主要用来产生时间标准信号,因为时钟的精度主要取决于时间标准信号的频率及稳定度,所以采用石英晶体振荡器。 分频器:因为振荡器产生的标准信号频率很高,要是要得到“秒”信号,需一定级数的分频器进行分频。 计数器:有了“秒”信号,则可以根据60秒为1分,24小时为1天的进制,分别设定“时”、“分”、“秒”的计数器,分别为60进制,60进制,24进制计数器,并输出一分,一小时,一天的进位信号。 译码显示:将“时”“分”“秒”显示出来。将计数器输入状态,输入到译码器,产生驱动数码显示器信号,呈现出对应的进位数字字型。 由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路可以对分和时进行校时。另外,计时过程要具有报时功能,当时间到达整点前10秒开始,蜂鸣器1秒响1秒停地响5次。 } 为了使数字钟使用方便,在设计上使用了一个变压器和一个整流桥来实现数字钟电能的输入,使得可以方便地直接插入220V的交流电就可以正常地使用了。关键词数字钟振荡计数校正报时

数字时钟程序

#define uchar unsigned char #define unit unsigned int #include #include #include void 1cd_putchar(uchar 1cdchar) void 1cd_putsf(uchar code *chars) uchar code http[ ]={"current time is:"} sbit KEY1=P3^3; // sbit KEY2=p3^4; // ///////////////////////////////////////// uchar t50ms,ts,tm,th; uchar DISP_BUFFER[6]=0; void timer0(void) interrupt 1 using1 { THO=0x3c; TLO=0xbo; //50ms t50ms++; if(t50ms==20) { t50ms=0; ts++; if(ts==60) {tm=0; th++; if(th==24) {th=0; } } } } } void main (void) { p0=OXFF; P1=OXFF; P2=OXFF; P3=OXFF; TMOD=0X01;//T0 THO=0X3C; TLO=0XB0;//50ms EA=1 ETO=1; initialise();

1cd_setxy(0,0); 1cd_putsf(http); TRO=1; while(1) { DISP_BUFFER[0]=th/10; DISP_BUFFER[1]=th%/10; DISP_BUFFER[2]=tm/10; DISP_BUFFER[3]=tm%/10; DISP_BUFFER[4]=ts/10; DISP_BUFFER[5]=ts%/10; 1cd_setxy(1,0); 1cd_putchar(DISP_BUFFER[0]+0X30; 1cd_putchar(DISP_BUFFER[1]+0X30; 1cd_putchar(':'); 1cd_putchar(DISP_BUFFER[2]+0X30; 1cd_putchar(DISP_BUFFER[3]+0X30; 1cd_putchar(':'); 1cd_putchar(DISP_BUFFER[4]+0X30; 1cd_putchar(DISP_BUFFER[5]+0X30; if(!KEY1) {TM++; delay_ms(100);} } } //display one char void 1cd_putchar(uchar 1cdchar) { output(1cdchar); } //display a sting void 1cd_putsf(uchar code *chars) { uchar i=0; while(chars[i]>=0x20&chars[i]<0x7f) {if (i<0x0f) {output (chars[i]); i++; } else { 1cd_setxy(1,0); while( (chars[i]>0x20&chars[i]<0x7f) ) {output(chars[i]);

整点报时可调式数字电子时钟的设计

用EDA软件实现整点报时数字式可调电子时钟的设计 一、设计目的 了解常见中规模数字集成电路的使用方法,包括计数器、显示译码器、多谐振荡器的工作原理及使用方法。通过组装具有整点报时数字可调电子时钟,了解这类电路的使用技巧及调整方法。通过对电路板的实际布线焊接检测调试,提高电子技术硬件的基本能力。 二、系统组成 1、先用Multisim实现如下系统: 本组合电路包括时基多谐振荡器、计数器、十进制译码显示器、发光数码管等部分组成。各部分组成框图如下: 系统组成图 2、仿真通过 三、单元电路组成原理与参数选择 1、多谐振荡器:这里采用最常见的时基电路555组成的周期为1秒的振荡器。555集成电路的原理及应用可以参见教材,此不重复。通常选择适当的定时电阻和电容元件使振荡刚好为1秒钟。多谐振荡器的电路图和NE555的芯片引脚图如下:

2、十进制计数器: 本系统采用的是十进制计数器7490。本系统秒钟是用两个7490构成60进制组成。分钟也是用两个7490构成60进制组成时钟采用两个7490构成24进制计数器组成。将三个计数器级连起来就构成了电子时钟。7490的芯片图和真值表如下:(5脚接电源VCC,10脚接地其中1脚和12脚相连)。 X 0 0 X COUNT 下面介绍秒钟和分钟连接方法如下图(如果是秒钟14脚则接多谐振荡器555电路的第3脚,如果是分钟14脚则接秒钟的7408(与门)芯片的第3脚。

下面介绍时钟的接法(14脚接分钟的7408的第3脚): 3、7448实现多位数字码显示译(如果是选用共阳极七段数码管则选择7447) 7448为七段译码显示器,其功能可详细参见数字电路书。它实现的功能是把7490输出 的(QA、QB、QC、QD)实现译码驱动七段共阴极数码显示它的接法如下:

数字时钟电路

摘要 数字钟就是一种用数字电路技术实现日、时、分、秒计时的装置,与传统的机械式时钟相比,具有更高的准确性与直观性,且无机械传动装置,具有更更长的使用寿命,因此得到了广泛的使用。小到人们日常生活中的电子手表,大到车站、码头、机场等公共场所的大型数显电子钟。 本课程设计要用通过简单的逻辑芯片实现数字时钟。要点在于用555芯片连接成输出1000秒的多谐振荡器,然后经过74LS90构成的分频器输出1HZ的秒脉冲,用74LS160(10进制计数器)连接成60与24进制的计数器,再通过七段数码管显示,外加上校时电路,整点报时电路即构成了简单数字钟。扩展电路可实现定点报时功能。 关键字:多谐振荡器;分频器;计时电路;闹钟电路;校时电路;整点报时电路 目录 1 设计内容及要求 0 1、1设计目的 0 1、2设计内容与要求 0 1、3创新部分 0 2 系统总体设计方案 0 2、1 数字时钟的组成 0 2、2原理分析 0 2、3基本逻辑功能框图 (1) 3 器件选择 (1) 3、1 555集成定时器 (1) 3、2 74LS160 (2) 3、3 LED显示屏 (3)

3、4 4位十进制同步可逆计数器74LS90 (4) 3、5 4位数值比较器74LS85 (5) 4 数字时钟的电路设计 (7) 4、1 时钟振荡电路 (7) 4、1、1 555多谐振荡器产生1KHz (7) 4、1、2 时钟信号发生电路 (7) 4、1、3 时钟振荡电路的Multisim仿真 (8) 4、2 分频器电路 (9) 4、3秒脉冲发生器电路 (10) 4、4 分脉冲发生器电路 (11) 4、5 时脉冲发生器电路 (12) 4、6 校时电路 (12) 4、7 整点报时电路 (13) 4、8闹钟功能电路 (15) 4、9 数字时钟总仿真电路图 (16) 5 心得体会 (17) 5、1 关于数字时钟的心得体会 (17) 5、2 关于收音机的焊接与调试心得体会 (18) 参考文献 (19)

数字电子钟(计时、校时以及整点报时)数电课程设计报告

设计要求 1.用秒脉冲作信号源,构成数字钟,显示秒、分、时 2.具有“对时”功能,即时间可以快速预置 3.具有整点提示功能。一种实现的方法是每到整点时触发“音乐芯片”或每到整点前几秒钟,发出如“的、的、的、答”声音信号。 系统框图 设计过程 时间显示模块电路可以用3个CD4518作为核心芯片,进行级联,再辅以若干逻辑门,完成进位、置零等功能,CD4518是双十进制计数器,有两个时钟输入端,正好可以满足进位和校时的功能,而不会产生干扰,且有一个置零功能,可以组成六十进制和二十四进制的计数器。 整点报时模块电路用的是555芯片和一块CD4068芯片组成的电

路,555芯片可以接成多谐振荡器,提供交变信号使蜂鸣器发出声音,而整点报时的控制可以用CD4068实现,CD4068是8输入与/与非门,可以在整点之前输出脉冲信号,经过由555芯片组成的多谐振荡器,为其提供一个信号,这样由多谐振荡器输出端可以使蜂鸣器发出“嘀、嘀、嘀”的响声。 秒信号发生器可以用实验箱上的秒脉冲信号代替。 考虑到开关抖动现象,校时模块电路实验实验箱上的按键开关,每输出一个脉冲信号可以改变分个位和十个位,同时考虑到干扰问题,进位接线和校时接线接在不同的时钟输入端。 电路仿真与设计 3.1所需芯片及芯片管脚图 CD4518 CD4068 CD4002 CD4011

CD4069 555 3.2时、分、秒显示电路模块设计 整个电路的的核心芯片是CD4518,它是一个双10进制加法计数器,因此只需要三个芯片,进行级联即可实现两个六十进制和一个二十四进制计数器,再加上一些合适的逻辑门,实现置零和进位。 上图是秒显示电路设计图,右边为秒个位,左边为秒十位,秒个位的电路中置零引脚和时钟输入端CP1必须接地,这是因为CMOS 的引脚不能悬空,否则会影响实验结果,CP0接秒脉冲信号,考虑到秒个位计数到9的时候必须进位,所以在显示0的同时输出一个进位信号,输出是0000,因此可以用一个或非门,当输出是0000的时候提供一个进位信号至秒十位的时钟输入端,秒十位另一个时钟输入端接地,当秒十位计数器计到5时,在输出为0110时提供一个信号到秒十位计数器的置零端,使其实现0110——0000,即六十进制。

电子综合设计-基于单片机多功能数字时钟的设计(附完整程序)

课题:基于51单片机的多功能数字时钟系统设计 一、概述、设计思路 该设计方案是以MC51单片机为核心,采用LCD液晶屏幕显示系统,辅以闹钟模块,温度采集模块、日期提醒、键盘时间调整预设置等模块,所构建的数字时钟系统,能动态显示实时时钟的时、分、秒,数据显示(误差限制在30每天),对闹铃方式与温度调节模块进行了重点设计实现SB0、SB1、SB2、SB3四个键实现时钟正常显示,调时,及闹钟时间设置。本系统设计大部分功能有软件来实现,使电路简单明了,系统稳定性也得大大提高。 二、系统组成与工作原理 1、工作原理: 本设计采用STC89C51单片机作为本次课程设计的控制模块。单片机可把由DS18B20、DS1302、AT24C02中的数据利用软件来进行处理,从而把数据传输到显示模块,实现温度、日历和闹铃的显示。以LCD液晶显示器为显示模块,把单片机传来的的数据显示出来,并且显示多样化,在显示电路中,主要靠按键来实现各种显示要求的选择与切换。 2、总是设计框架图:

图二:系统总体电路图 三、单元电路的设计与分析 整个电子时钟系统电路可分为六大部分:中央处理单元(CPU)、复位电路部分、显示部分、键盘输入部分、温度采集部分。 1、MCS-51单片机 VCC: 89S51 电源正端输入,接+5V。 VSS: 电源地端。

XTAL1: 单芯片系统时钟的反相放大器输入端。 XTAL2: 系统时钟的反相放大器输出端,一般在设计上只要在XTAL1 和XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。 RESET: 89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。 EA/Vpp: "EA"为英文"External Access"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用8751 内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。 ALE/PROG: 端口3的管脚设置: P3.0:RXD,串行通信输入。 P3.1:TXD,串行通信输出。 P3.2:INT0,外部中断0输入。

整点报时数字钟资料

整点报时数字钟

数字钟 一、设计任务 本任务为:数字钟。设计任务具体内容如下: 1.1 基本设计任务 依据命题题意,本设计采用89C51进行24小时计时并显示。要求其显示时间范围是00:00:00~23:59:59,具备有时分秒校准功能。数字钟上面要带有闹钟,闹钟与时钟之间能随时切换,闹钟具备时分秒设置功能。 1.2 控制设计任务 由于本设计采用手动校准时钟与手动设置闹钟方案,所以要求用较少的按键来达到切换闹钟与时钟、时钟时分秒校准、闹钟时分秒设置等功能。 1.3 软件设计任务 数字钟的所有计时都要由软件控制实现。用软件对几个按键所得信号进行相应改变,以控制时钟与闹钟的显示。通过软件对闹钟与时钟进行比较,当时钟所显示时间与闹钟一样时,要启动报时模块。 三、总体设计 经过对各个方案分析比较,最终确定总方案如图3-1所示。该系统所有模块都由主单片机控制。其中,设计各个模块,包括单片机、显示模块、电机驱动、光电探测由四节AA电池供电。电机驱动采用L298驱动芯片控制。用光电传感器对边线的探测来控制距离。通过单片机的机器周期计算时间计数周期,以达到计时目的。

图3-1 系统方案图3.1 系统硬件电路设计 3.1.1 显示及控制模块

图3-4 语音报时模块

3.2 系统软件设计 3.2.1 软件计时的分析与计算 单片机内部定时器有4种工作模式,方式0是13位计数器,由于计时时间过短,中断频率高,所以不选用此模式;方式2是自动重装式计数器,是8位计数器,同样中断频率过高;方式3也是8位计数器;方式1是16位计数器,综合考虑,选用方式1做精确计时。 由于51单片机是12分频,因此机器周期=晶振频率/12。在该设计中,选用频率为12MHz的晶振,因此机器周期=1μs。定时1s需要1000000个机器周期,因此通过20次定时器中断完成1s的定时,每次完成50000个周期的定时,因此每次给定时器的初值应该是TH0=B0H,TL0=3CH。 3.2.2 系统软件设计 设计两套存储方案,一套存储时钟,一套存储闹钟,两者互不干涉,只有当两者相等时才会调用闹钟播放子程序,而当每次整点时则会调用整点报时子程序。

单片机数字钟电路图

数字钟设计 一、设计目的 1. 熟悉集成电路的引脚安排。 2. 掌握各芯片的逻辑功能及使用方法。 3. 了解面包板结构及其接线方法。 4. 了解数字钟的组成及工作原理。 5. 熟悉数字钟的设计与制作。 二、设计要求 1.设计指标 时间以24小时为一个周期; 显示时、分、秒; 有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间;计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时; 为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。

2.设计要求 画出电路原理图(或仿真电路图); 元器件及参数选择; 电路仿真与调试; PCB文件生成与打印输出。 3.制作要求自行装配和调试,并能发现问题和解决问题。 4.编写设计报告写出设计与制作的全过程,附上有关资料和图纸,有心得体会。 三、设计原理及其框图 1.数字钟的构成 数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定。通常使用石英晶体振荡器电路构成数字钟。图3-1所示为数字钟的一般构成框图。 图3-1 数字钟的组成框图

⑴晶体振荡器电路 晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。 ⑵分频器电路 分频器电路将32768Hz的高频方波信号经32768()次分频后得到1Hz的方波信号供秒计数器进行计数。分频器实际上也就是计数器。 ⑶时间计数器电路 时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为12进制计数器。

数字电子时钟源程序

#include "2407c.h" //数字电子时钟按Key1启动、Key2暂停、Key3复位、Key4调时 #define disable() asm(" setc INTM") //禁止全局中断 #define enable() asm(" clrc INTM") //允许全局中断 unsigned int k=0,s=30,m=59,h=23,j=1; unsigned int d[8] = {0x0100,0x0200,0x030a,0x0400,0x0500,0x060a,0x0700,0x0800}; unsigned int w[8] = {0x0101,0x0204,0x030a,0x0400,0x0503,0x060a,0x0700,0x0804}; //系统初始化子程序 void chushihua (void) { asm (" clrc SXM"); //抑制符号位扩展 asm (" clrc OVM"); //累加器正常溢出 asm (" clrc CNF"); //B0被配置为数据存储空间 *WDCR=0x00E8; //关闭看门狗 *SCSR1=0X00FC; //CLKIN=10M,CLKOUT=CLK*4=40M *IMR=0x0002; //开INT2 *IFR=0xFFFF; //清全部中断,写1清0,参见P43 *MCRB=0xFE3C; //启用SPI功能引脚 *MCRA=0; //IOPA、IOPB配置为一般I/O功能 *MCRC=0; //IOPE、IOPF配置为一般I/O功能 *PFDATDIR=0x00FF; //IOPF设置为输入,并上拉 *SPICCR=0x0F; //SPI软复位、上升沿输出数据、16位数据长度 *SPICTL=0x0E; //禁止过冲中断、允许TALK(发送)数据、主机模式、禁止SPI中断//上升沿有延时 *SPIBRR=0x0F; //SPI波特率=SYSCLK/(SPIBRR+1)=2.5M *SPICCR=*SPICCR|0x80; //SPI恢复操作,准备发送、接收下一个字符 WSGR=0x00; //禁止所有的等待状态 } //延时子程序 void delay(unsigned int pp) { unsigned int k,i; for(k=0;k

整点报时数字钟课程设计

整点报时数字钟课 程设计

信息工程学院 课程设计报告书 ( / 年第二学期) 课程名称:电子技术课程设计题目:能整点报时的电子表专业班级:自动化111 学生姓名:胡义海 学号: 指导教师:康耀明 设计成绩:

1课程设计目的................................................................... 错误!未定义书签。2系统的方案设计............................................................... 错误!未定义书签。 3 系统的详细设计 ............................................................... 错误!未定义书签。 3.1脉冲产生和分频电路.................................................... 错误!未定义书签。 3.1.1脉冲产生和分频电路的设计 .................................. 错误!未定义书签。 3.1.2馆建器件74 LS74的介绍........................................ 错误!未定义书签。 3.1.3关键器件CD4060的介绍 ....................................... 错误!未定义书签。 3.2计时电路 ....................................................................... 错误!未定义书签。 3.2.1分,秒计时电路的设计 .......................................... 错误!未定义书签。 3.2.2小时计时电路的设计 .............................................. 错误!未定义书签。 3.2.3关键器件CD4510的介绍........................................ 错误!未定义书签。 3.3显示译码电路................................................................ 错误!未定义书签。 3.3.1显示译码电路的设计 .............................................. 错误!未定义书签。 3.3.2关键器件CD4511和数码管的介绍........................ 错误!未定义书签。 3.4校时电路 ....................................................................... 错误!未定义书签。 3.4.1校时的电路的详细设计 .......................................... 错误!未定义书签。 3.4.2关键器件RS触发器的详细介绍............................. 错误!未定义书签。 3.5整点报警电路................................................................ 错误!未定义书签。 4 心得体会 .......................................................................... 错误!未定义书签。 5 参考文献 .......................................................................... 错误!未定义书签。

数字逻辑电路课程设计数字钟

数字逻辑课程设计 数字钟 姓名: 学号: 班级:物联网工程131班 学院:计算机学院 2015年10月10日

一、任务与要求 设计任务:设计一个具有整点报时功能的数字钟 要求: 1、显示时、分、秒的十进制数字显示,采用24小时制。 2、校时功能。 3、整点报时。 功能: 1、计时功能: 要求准确计时,以数字形式显示时、分、秒的时间。小时的计时要求为“12翻1”。 2、校时功能: 当数字钟接通电源或者计时出现误差时,需要校正时间(简称校时)。校时是数字钟应具备的基本功能,一般电子手表都具有时、分、秒等校时功能。为使电路简单,这里只进行分和小时的校时。对校时电路的要求是:在小时校正时不影响分和秒的正常计数;在分校正时不影响秒和小时的正常计数。校时方式有“快校时”和“慢校时”两种。“快校时”是通过开关控制,使计数器对1Hz的校时脉冲计数。“慢校时”是用手动产生单脉冲作校时脉冲。 3、整点报时: 每当数字钟计时快要到整点时发出声响;通常按照4低音1高音的顺序发出间断声响;以最后一声高音结束的时刻为整点时刻。 二、设计方案 电路组成框图: 主体电路 扩 展 电 路时显示器 时译码器 时计数器 分显示器 分译码器 分计数器 校时电路 秒显示器 秒译码器 秒计数器 定时控制 仿电台报时 报整点时数

数字钟电路是一个典型的数字电路系统,其由时、分、秒计数器以及校时和显示电路组成。其主要功能为计时、校时和报时。利用60进制和12进制递增计数器子电路构成数字钟系统,由2个60进制同步递增计数器完成秒、分计数,由12进制同步递增计数器完成小时计数。秒、分、时之间采用同步级联的方式。开关S1和S2分别是控制分和时的校时。报时功能在此简化为小灯的闪烁,分别在59分51秒、53秒、55秒、57秒及59秒时闪烁,持续的时间为1秒。 三、设计和实现过程 1.各元件功能 74LS160:可预置BCD异步清除器,具有清零与置数功能的十进制递增计数器。 74LS00:二输入端四与非门 74LS04:六反相器 74LS08:二输入端四与门 74LS20:四输入端双与非门 2.各部分电路的设计过程 (1)时分秒计数器的设计 时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为12进制计数器。 秒/分钟显示电路:由于秒钟与分钟的都是为60进制的,所以它们的电路大体上是一样的,都是由一个10进制计数器和一个6进制计数器组成;有所不同的是分钟显示电路中的10进制计数器的ENP和ENT引脚是由秒钟显示电路的进位信号控制的。 分和秒计数器都是模M=60的计数器,其计数规律为00—01—…—58—59—00…。可选两片74LS160设计较为简单。 时计数器是一个“12翻1”的特殊进制计数器,即当数字钟运行到12时59分59秒时,秒的个位计数器再输入一个秒脉冲时,数字钟应自动显示为01时00分00秒,实现日常生活中习惯用的计时规律。可选两片74LS160设计。

数字钟的设计(含有闹钟功能)

# 综合设计报告~ 设计名称:数字逻辑综合设计报告 设计题目:数字电子钟 学生学号: 专业班级: … 学生姓名: 学生成绩: 指导教师(职称): 课题工作时间:至

目录 摘要……………………………………………………………………………………… II Abstract …………………………………………………………………………………... II 第一章课题背景(或绪论、概述) (1) 数字电子钟应用 (1) 电子钟的应用前景 (x) 第二章设计简介及设计方案论述 (x) 设计原理简介 (x) 设计方案论述 (x) 设计目的概述 (x) 第三章详细设计 (x) 实验元件及介绍 (x) 模块的详细设计 (x) 3.2.1 二十四时制显示模块 3.2.2 校时电路模块 3.2.2 整点报时模块 3.2.2 闹钟模块 第四章设计结果及分析 (x) 设计电路 (x) 运行结果及分析 (x) 结果分析 (x) 总结 (x) 致谢 (x)

参考文献 (x) 附录主要程序代码 (x) 摘要 【关键词】电子钟、校时电路、比较器、整点报时 数学逻辑课程设计选题是电子钟的设计,运用 SP3版仿真软件进行电子钟的设计。主要原理是由555芯片及门电路产生多谐震荡,输出稳定的为1HZ秒脉冲,作为时间基准。秒计时器满60向分计时器仅为,分计时器满60向小时计时器进位,小时计时器以24为一个周期,并实现了小时高位具有零熄灭的功能,计时器的输出送到显示屏,课在相应位置正确显示时、分。秒。计时出现误差或者调整时间时用校时电路进行时、分的调整。而且添加了整点报时功能,并利用比较器实现了闹钟功能。 Abstract 【Keywords】Digital clock, divider chip, the decoder chip, the campus circuit, the whole point alarm The desigining topic of the electronic technology course is the digital clock. The main principle by the oscillator transistor multivibrator oscillation, after the output frequency divider and stable pulse,60 seconds over the counter sub-counters to carry, at least 60 minutes to the hour counter binary counter, hours counter for a period of 24 and achieve a high level with zero off-hour functions. Counter displays the output sent by the decoder can be displayed correctly in the appropriate location, minutes, second. Timing errors, or adjust the time when the school when the circuit is available, the minutes of the adjustment. In this circuit, The whole point alarm will last 10 seconds per hour.

数字时钟能修改程序

数字时钟可修改程序 //已验证可行,消抖效果一般 //4位动态显示数字时钟程序 #include #include //#include #define uchar unsigned char #define uint unsigned int // sbit dp0 =P2^4; sbit dp1 =P2^5; sbit dp2 =P2^6; sbit dp3 =P2^7; sbit spk =P1^1; //P3^5; bit set,ms,df; uchar cnt[3],dpt=0,dpbuf[4]; //全局变量定义 // //显示字模表 code uchar tab[]={0x18,0x7b,0x2c,0x29,0x4b,0x89,0x88,0x3b,0x08,0x09,0xef}; // void delay_10us(void) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } // 8 nop+ret=10 Cycle

// void timer0(void) interrupt 1 using 1 { //5mS timer interrupt // uchar k,j; TH0=0xee; //65536-4608 TL0=0x00; if(dpt<3) dpt++; else dpt=0; //动态显示计数器if(dpt==2) P0 = tab[dpbuf[dpt]]&0xf7; else P0 = tab[dpbuf[dpt]]; switch(dpt) { case 0: dp1 = dp2 = dp3 = 1; dp0=0; break; case 1: dp0 = dp2 = dp3 = 1; dp1=0; break; case 2: dp0 = dp1 = dp3 = 1; dp2=0; break; case 3: dp0 = dp1 = dp2 = 1; dp3=0; } if(set) //设置时钟状态 { cnt[0]++; if(cnt[0]>=100) //0.5秒闪烁切换 { cnt[0]=0; //开始进入下个0.5秒计时

基于51单片机,电子显示时钟带闹钟、整点报时、日期、星期

#include #define uint unsigned int #define uchar unsigned char sbit KEY1=P3^0; //切换键 sbit KEY3=P3^1; //minute ,hour调整加1定义 sbit KEY2=P3^7; //minute ,hour调整减1定义 sbit bear=P3^4; //闹铃 uchar a=0; //时间显示和闹钟时间显示切换 code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc8,0x8e,0xff,0x21}; //段码控制 char code weikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar StrTab[32]; char minute=01,hour=13,second=00; // 正常时钟秒,分,时定义 char minute1=12,hour1=24; // 闹钟时钟秒,分,时定义 uint year=2014; char month=12,day=10; //日期年,月,日定义 char week=3,v=1; //星期 char err=3;//误差用很重要、、、、!! //P0口流水灯 char pp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7e,0x7d,0x7b,0x77,0x6f,0x5f,0x3f, 0x3e,0x3d,0x3b,0x37,0x2f,0x1f, 0x1e,0x1d,0x1b,0x17,0x0f, 0x0e,0x0d,0x0b,0x07, 0x06,0x05,0x03, 0x02,0x01, 0x00 }; char w=0; uchar flag=0; //切换标志 uint count=0; //定时器计数,定时50ms,count满20,秒加1 /********************** 延时子程序*****************************/ void delay(uint z) { uint x,y; for(x=0;x

相关文档
最新文档