数字时钟课程设计

  • 格式:doc
  • 大小:460.11 KB
  • 文档页数:11

《可调数字时钟课程设计》课程设计课程:单片机系统分析与调试专业:应用电子技术班级:电子1033班姓名:陈张宇小组成员:指导老师:张艳阳一、设计任务设计一个8位显示的电子钟,有4个按键可进行时钟的调整,带闹钟,具体要求如下。

1.可以显示时、分、秒。

2.当按下菜单键后,进入时钟调整状态,按下时调整按键,时值加1;按下分调整按键,分值加1;按下秒调整键后,秒加1。

当再次按下菜单按键时,进入闹钟调整状态,按下时调整按键,时值加1;按下分调整按键,分值加1;按下秒调整键后,秒加1。

再次按下菜单键,电子时钟进入正常工作状态。

3.当时钟达到闹钟设定值时,蜂鸣器发出“滴滴”响声。

4.在正常状态下,对时、分、秒调整按键不响应。

二、任务分析及方案制定1、显示部分电子时钟选用了8合1的共阴极数码管,只需要向数码管的段位端口发送要显示的段码并发送相应的位码就可以决定哪一位数码管显示字符。

在显示方式上,采用动态扫描显示法。

2、计时部分要使电子时钟能精确的进行计时显示,则单片机系统内部要求有一个精确的的时钟信号发生器。

可以将单片机中的定时器T0设置成50ms的定时器来实现,每20次定时中断结束,秒计数器加1;当秒计数到60时,秒计数器清零,分计数器加1;当分计数到60时,分计数器清零,时计数器加1;当时计数器到24时,时计数器清零。

3、闹钟部分能够设置闹钟值,使蜂鸣器发出声音。

4、调整部分在调整状态下,可以对时钟,闹钟的时、分、秒值进行加1处理。

三、硬件设计电路原理图如下,段码信息经过74hc573驱动后发送到8位数码管段选端,同时位选信息经过74hc138驱动后发送到数码管的位选端口。

74LC573是8位同相三态双向总线收发器,可双向传输数据,常用来驱动LED或者其他电路。

当8051单片机的P0口总线负载达到或超过P0口最大负载能力时,必须接入74hc573等总线驱动器加以信号驱动。

电路原理图:电路仿真图如下:三、软件设计P3.0口所接按键k1为菜单键,第一次按下为调时钟状态,第二次按下为调闹钟状态,P3.1、P3.2、P3.3分别为调时、调分、调秒键。

程序结构流程图main while循环按键扫描显示时间time1载入定时初始20次second加一大于59 minute加一大于59 hour加一时钟等于闹钟初始化中断蜂鸣器响一分钟返回计时displaykeyscanK1按下进入时钟调整状态K2按下K4按下K3按下 调分 调时调秒K1按下进入闹钟调整状态K3按下 K2按下 K4按下调时调分调秒K1按下返回时间显示状态显示时hour/10 时十位 P2=0hour%10 时个位 P2=1显示分minute/10 分十位 P2=3minute%10 分个位 P2=4显示秒second/10 秒十位 P2=6second%10 秒个位 P2=7显示--P0=0x40 P2=2、5四、总结首先在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。

为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。

其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:C语言、模拟和数字电路知识等。

虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。

最后,在设计之前,我们要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在实习过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。

但是从中学到的知识会让我受益终身。

发现、提出、分析、解决问题和实践能力提高都会受益于我在以后的学习、工作和生活中。

附:程序#include"reg52.h"sbit k1=P3^0; //定义P3.0口为菜单键k1sbit k2=P3^1; //定义P3.1口为调时键k2sbit k3=P3^2; //定义P3.1口为调分键k3sbit k4=P3^3; //定义P3.1口为调秒键k4sbit P1_7=P1^7; //蜂鸣器接口unsigned char code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管断码0—9 unsigned char hour=12,minute=30,second; //定义时、分、秒为12—30—00unsigned char hour1,minute1,second1; //闹钟时、分、秒unsigned char count,m; //全局变量count计时变量,m菜单键被按下次数void delay(int t) //延时子函数tS{int i,j;{for(j=0;j<114;j++){;}}}void display() //显示子函数{switch(m){case 0: //菜单键未按下,正常显示行时{TR0=1; //开启定时器P2=0; //数码管位码P0=distab[hour/10]; //显示时十位delay(2);P2=1;P0=distab[hour%10]; //显示时个位delay(2);P2=2;P0=0x40; //显示—delay(2);P2=3;P0=distab[minute/10]; //显示分十位delay(2);P2=4;P0=distab[minute%10]; //显示分个位delay(2);P2=5;P0=0x40; //显示—delay(2);P2=6;P0=distab[second/10]; //显示秒十位delay(2);P2=7;P0=distab[second%10]; //显示秒个位delay(2);}break;case 1: //菜单键按下一次,显示调时{P2=0;P0=distab[hour/10];P2=1;P0=distab[hour%10];delay(2);P2=3;P0=distab[minute/10];delay(2);P2=4;P0=distab[minute%10];delay(2);P2=6;P0=distab[second/10];delay(2);P2=7;P0=distab[second%10];delay(2);}break;case 2: //菜单键第二次按下,显示调闹钟{TR0=0; //关闭定时器P2=0;P0=distab[hour1/10];delay(2);P2=1;P0=distab[hour1%10];delay(2);P2=2;P0=0x40;delay(2);P2=3;P0=distab[minute1/10];delay(2);P2=4;P0=distab[minute1%10];delay(2);P2=5;P0=0x40;delay(2);P2=6;P0=distab[second1/10];delay(2);P0=distab[second1%10];delay(2);}break;}}void timer0_int() //中断初始化程序{TMOD=0x01; //采用中断方式1TH0=0x3c; //写入数据TL0=0xb0; //50ms中断一次ET0=1; //允许定时器中断EA=1; //打开总中断TR0=1; //开启定时器}void timer0() interrupt 1 using 1 //中断服务程序(定时){count++;if(count==20) //中断20次后,即1秒。

{count=0; //归零second++; //秒加1if(second==60) //当秒达到60后{second=0; //秒归零minute++; //分加1if(minute==60) //当分达到60后{minute=0; //分归零hour++; //时加1if(hour==24) //当达到24小时后{hour=0; //时归零}}}}if(hour1=hour&&minute1==minute&&second1<10) //如果闹钟值与时钟值相等,蜂鸣器蜂鸣1分钟{display();delay(5);}}void keyscan() //按键扫描子程序{if(k1==0) //菜单键k1去抖{delay(10);if(k1==0) //菜单键是否按下{m++;if(m==3)m=0; //记录按下次数,3次后归零}while(!k1); //k1是否放开}if(m!=0){switch(m){case 1: //第一次按下菜单键,进入时间调整状态if(k2==0) //时调整键去抖{delay(80);if(k2==0) //时调整键是否按下{hour++;if(hour==24)hour=0; //时自加,到24后归零}}if(k3==0) //分调整键去抖{delay(80);if(k3==0) //分调整键是否按下{minute++;if(minute==60)minute=0;//分自加,到60后归零}}if(k4==0) //秒调整键去抖{delay(80);if(k4==0) //秒调整键是否按下{second++;if(second==60)second=0;//秒自加,到60后归零}break;case 2: //第二次按下菜单键,进入闹钟调整状态if(k2==0) //时调整键去抖{delay(80);if(k2==0) //时调整键是否按下{hour1++;if(hour1==24)hour1=0; //时自加,到24后归零}}if(k3==0) //分调整键去抖{delay(80);if(k3==0) //分调整键是否按下{minute1++;if(minute1==60)minute1=0;//分自加,到60后归零}} //秒调整键去抖if(k4==0){delay(80);if(k4==0) //秒调整键是否按下{second1++;if(second1==60)second1=0;//秒自加,到60后归零}}break;}}}void main() //主函数{timer0_int(); //调入中断初始化子程序while(1) //主循环{keyscan(); //调入按键扫描子程序display(); //调入显示子程序}}。