数字电子钟设计.docx

上传人:b****5 文档编号:7371580 上传时间:2023-01-23 格式:DOCX 页数:15 大小:19.35KB
下载 相关 举报
数字电子钟设计.docx_第1页
第1页 / 共15页
数字电子钟设计.docx_第2页
第2页 / 共15页
数字电子钟设计.docx_第3页
第3页 / 共15页
数字电子钟设计.docx_第4页
第4页 / 共15页
数字电子钟设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数字电子钟设计.docx

《数字电子钟设计.docx》由会员分享,可在线阅读,更多相关《数字电子钟设计.docx(15页珍藏版)》请在冰豆网上搜索。

数字电子钟设计.docx

数字电子钟设计

课程设计任务书

专业:

学号:

学生姓名(签名):

设计题目:

数字电子钟设计

一、设计实验条件

单片机原理实验室

二、设计任务及要求

采用PCF8563和AT89S52单片机及显示电路完成小时、分钟、秒的实时显示。

⒈数字钟的总体方案设计(采用PCF8563或单片机内部定时、计数方式均可)你

⑴系统总体结构

⑵芯片选择

⑶PCF8563的主要性能指标

⒉硬件电路设计

⑴AT89S52单片机最小系统

⑵PCF8563与AT89S52单片机接口电路设计

⑶显示电路与AT89S52单片机接口电路设计

⒊软件设计

⑴主程序框图

⑵PCF8563时钟程序框图

⑶显示程序框图

⒋调试与测试结果分析

⑴实验系统连线图

⑵程序调试

⑶实验结果分析

⒌程序清单和系统原理图

三、设计时间与安排

1、设计时间:

1周

2、设计时间安排:

熟悉实验设备、收集资料:

1天

设计图纸、实验、计算、程序编写调试:

2天

编写课程设计报告:

1天

答辩:

1天

9.1源程序

#include

#include//地址操作头文件

#defineucharunsignedchar

#defineuintunsignedint

sbitdeng=P1^7;//LED灯的端口(模拟闹钟或者闹铃)

sbitshezhi=P1^0;//时间设置开关

sbitjia=P1^2;//设置时间时加1开关

sbitqiehuan=P1^1;//年月日和时分秒切换开关

sbitjian=P1^3;//设置时间时减1开关

ucharduan1,duan2,duan3,duan4,duan5,duan6;//定义段选相关变量

uintmiao=00,fen=20,shi=10,nian=17,yue=1,ri=10;//年月日、时分秒标志变量

uintt0flag=0;//闹钟时间标志位

uchartimer[3]={10,20,50};//闹钟的初始化时间

#defineweiXBYTE[0xff20]//PA口地址

#defineduanXBYTE[0xff21]//PB口地址

#definecontrolXBYTE[0xff23]//控制寄存器地址

ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//数码管编码表0123456789

/*---------------------定时器初始化子程序-----------------------------*/

voidtimer_init(void)

{

TMOD=0x11;//定时/计数器0和1使用模式1,16位定时器

TH0=0x00;//给定初值,这里使用定时器最大值从0开始计数一直到65535溢出

TL0=0x00;

TH1=0x00;

TL1=0x00;

EA=1;//总中断打开

ET0=1;

ET1=1;

EX0=1;

IT0=1;

}

/*------------------------------延时子程序--------------------------------*/

voiddelayms(unsignedcharms)

{

uchari;

while(--ms!

=0)

for(i=0;i<50;i++);

}

/*-----------------------------显示子程序--------------------------------*/

voidxianshi()

{

wei=0xdf;//打开位选,选第一位数码管11011111

duan=duan1;//打开段选,显示数码关管第一位

delayms(3);

wei=0xef;//打开位选,选第二位数码管11101111

duan=duan2;//打开段选,显示数码关管第二位

delayms(3);

wei=0xf7;//打开位选,选第三位数码管//11110111

duan=duan3;//打开段选,显示数码关管第三位

delayms(3);

wei=0xfb;//打开位选,选第四位数码管//11111011

duan=duan4;//打开段选,显示数码关管第四位

delayms(3);

wei=0xfd;//打开位选,选第五位数码管11111101

duan=duan5;//打开段选,显示数码关管第五位

delayms(3);

wei=0xfe;//打开位选,选第六位数码管11111110

duan=duan6;//打开段选,显示数码关管第六位

delayms(3);

}

/*------------------------------初始化子程序------------------------------*/

voidinit_all()

{

shezhi=1;//引脚置高电平作为输入,四个开关都设为高电平,从给定初值开始运行

jia=1;

qiehuan=1;

jian=1;

timer_init();

control=0x80;

delayms(3);

}

/*--------------------------主程序-------------------*/

voidmain()

{

uintflag=0,j=0,xuanze1=0,xuanze2=0;//定义闪烁标志变量flag,闪烁时间变量j,时分

//秒选择变量xuanze1,年月日选择变量xuanze2

init_all();

while

(1)//死循环

{

if(qiehuan==1)//如果P1.1为高电平则执行以下显示和调整时间指令

{

xuanze2=0;//日期设置年月日选择变量置0,防止日期时间来回切换时发生错误

if(xuanze1==0)

{

TR1=1;//如果时间设置时分秒选择变量为0,说明处于//运行状态,此时定时器开启

flag=1;//烁标志位强制置1,不闪烁

if((shi==timer[0])&&(fen==timer[1])&&(miao==timer[2]))//如果时间达到//预设值,则闹钟响(LED灯亮)

{

deng=0;//灯亮

TR0=1;//开始计时

}

if((fen==0)&&(miao==0))//如果是整点

{

deng=0;//灯亮,整点提醒

delayms

(2);

deng=1;//灯灭,关闭闹铃

}

}

if(!

shezhi)//P1.0设置按钮

{

xianshi();//延时去抖,用显示子程序延时,防止按动按钮时闪烁

if(!

shezhi)//再次确认按键是否按下,没有按下则退出

{

while(!

shezhi)xianshi();//如果确认按下按键等待按键释放,没有

//释放则一直执行数码管扫描,防止闪烁

{

TR1=0;

xuanze1++;//确定要设定的时或分或秒

if(xuanze1==4)

xuanze1=0;

}

}

}

if(!

jia)

{

xianshi();//延时去抖,用显示子程序延时,防止按动按钮时闪烁

if(!

jia)//再次确认按键是否按下,没有按下则退出

{

while(!

jia)xianshi();//如果确认按下按键等待按键释放,没有释//放则一直执行数码管扫描,防止闪烁

{

if(xuanze1==1)//时加

shi++;

if(shi==24)

shi=0;

if(xuanze1==2)//分加

fen++;

if(fen==60)

fen=0;

if(xuanze1==3)//秒加

miao++;

if(miao==60)

miao=0;

}

}

}

if(!

jian)

{

xianshi();//延时去抖,用显示子程序延时,防止按动按钮时闪烁

if(!

jian)//再次确认按键是否按下,没有按下则退出

{

while(!

jian)xianshi();//如果确认按下按键等待按键释放,没

//有释放则一直执行数码管扫描,防止闪烁

{

if(xuanze1==1)//时减

shi--;

if(shi==-1)

shi=23;

if(xuanze1==2)//分减

fen--;

if(fen==-1)

fen=59;

if(xuanze1==3)//秒减

miao--;

if(miao==-1)

miao=59;

}

}

}

if(flag==1)//闪烁标志位为1,所有数码管都亮,//与下面的flag=0构成闪烁程序

{

if(shi<10)//灭零判断,如果小时数小于10则第//一位数码管熄灭

duan1=0xff;

else

duan1=table[shi/10];//分解显示信息

duan2=table[shi%10];

duan3=table[fen/10];

duan4=table[fen%10];

duan5=table[miao/10];

duan6=table[miao%10];

}

if(flag==0)//闪烁标志位为0,对应数码管熄灭

{

if(xuanze1==1)

{

duan1=0xff;//当设置小时时,第一二位数码管闪烁

duan2=0xff;

}

if(xuanze1==2)

{

duan3=0xff;

duan4=0xff;

}

if(xuanze1==3)

{

duan5=0xff;

duan6=0xff;

}

}

}

if(qiehuan==0)//如果P1.1为低电平则执行以下显示和调整日期指令

{

xuanze1=0;//时间设置时分秒选择变量置0,防止日期时间来回切换时发生错误

if(xuanze2==0)

flag=1;

if(!

shezhi)

{

xianshi();

if(!

shezhi)

{

while(!

shezhi)xianshi();

{

xuanze2++;//确定要设定的年或月或日

if(xuanze2==4)

xuanze2=0;

}

}

}

if(!

jia)

{

xianshi();//延时去抖,用显示子程序延时,防止按

//动按钮时闪烁

if(!

jia)//再次确认按键是否按下,没有按下则退出

{

while(!

jia)xianshi();//如果确认按下按键等待按键释放,没有

//释放则一直执行数码管扫描,防止闪烁

{

if(xuanze2==1)//年加

nian++;

if(nian==100)

nian=0;

if(xuanze2==2)//月加

yue++;

if(yue==13)

yue=1;

if(xuanze2==3)//日加

{

ri++;

if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)//月份判断

{

if(ri==32)

ri=1;

}

if(yue==4||yue==6||yue==9||yue==11)

{

if(ri==31)

ri=1;

}

if(yue==2)

{

if(ri==29)

ri=1;

}

}

}

}

}

if(!

jian)

{

xianshi();//延时去抖,用显示子程序延时防止//按动按钮时闪烁

if(!

jian)//再次确认按键是否按下,没有按下则退出

{

while(!

jian)xianshi();//如果确认按下按键等待按键释放,没

//有释放则一直执行数码管扫描,防止闪烁

{

if(xuanze2==1)//年减

nian--;

if(nian==-1)

nian=99;

if(xuanze2==2)//月减

yue--;

if(yue==0)

yue=12;

if(xuanze2==3)//日减

{

ri--;

if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)//月份判断

{

if(ri==0)

ri=31;

}

if(yue==4||yue==6||yue==9||yue==11)

{

if(ri==0)

ri=30;

}

if(yue==2)

{

if(ri==0)

ri=28;

}

}

}

}

}

if(flag==1)

{

duan1=table[nian/10];//分解显示信息

duan2=table[nian%10];

duan3=table[yue/10];

duan4=table[yue%10];

duan5=table[ri/10];

duan6=table[ri%10];

}

if(flag==0)

{

if(xuanze2==1)

{

duan1=0xff;//调整时间时,年时间值闪烁

duan2=0xff;

}

if(xuanze2==2)

{

duan3=0xff;//调整时间时,月时间值闪烁

duan4=0xff;

}

if(xuanze2==3)

{

duan5=0xff;//调整时间时,日值闪烁

duan6=0xff;

}

}

}

xianshi();

j++;

if(20==j)//延时闪烁时间

{

j=0;

flag=!

flag;//闪烁标志变量

}

}

}

/*----------------------外部中断0中断子程序-------------------------------*/

voidint_x0()interrupt0//手动关闭闹钟

{

deng=1;

}

/*---------------------定时/计数器0中断子程序---------------------------*/

voidtimer0()interrupt1

{

uintt;

TH0=(65536-10851)/256;//重新赋值11.0592M晶振计算,指令周期1.0851uS

TL0=(65536-10851)%256;//最大值65536即60.398ms所以

t++;//直接定时器不够用,需要用循环处理,

if(t==1000)//计数到10s后,自动关闭闹钟

{//定时10ms,然后循环1000次后输出10x1000=1000ms=10s

t=0;

deng=1;

}

}

/*--------------------------定时/计数器1中断子程序------------------------*/

voidtimer1(void)interrupt3

{

staticunsignedinti;

TH1=(65536-10851)/256;//重新赋值11.0592M晶振计算,指令周期1.0851uS

//最大值65536即60.398ms所以

TL1=(65536-10851)%256;//直接定时器不够用,需要用循环处理,

i++;

if(i==100)//定时10ms,然后循环100次后输出10x100=1000ms=1s

{

i=0;

miao++;

if(miao==60)//秒达到60s

{

miao=0;;//秒清零

fen++;//分加1

}

if(fen==60)//分达到60

{

fen=0;//分清零

shi++;//时加1

}

if(shi==24)

{

shi=0;

ri++;

}

if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)

{

if(ri==32)//31天的月达到32,

{

ri=1;//日回归到1,

yue++;//月份加1

}

}

if(yue==4||yue==6||yue==9||yue==11)

{

if(ri==31)//30天的月达到31

{

ri=1;//日回归到1,

yue++;//月份加1

}

}

if(yue==2)

{

if(ri==29)//默认2月为28天,此处是有一个缺陷,以为只有六个数码管,所以不能进行闰年还是平年

{

ri=1;//日回归到1

yue++;//月份加1

}

}

if(yue==13)//月达到13

{

yue=1;//月回归到1

nian++;//年加1

}

if(nian==100)//年达到100

nian=0;//年回归到0,

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 畜牧兽医

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1